You are on page 1of 175

Study of constitutive models for soils under cyclic loading

Introducing a non-linear model with a spline-based backbone curve

Pedro Alonso Pinto

Dissertation for the degree of Master of Science in

Civil Engineering

Jury
President:

Professor Fernando Manuel Fernandes Simes

Supervisor:

Professor Jaime Alberto dos Santos

Assessor:

Professor Rui Pedro Carrilho Gomes

November 2012

Abstract
The goal of this work is the analysis of constiutitve soil models in their ability to simulate soil behaviour
for cyclic loading conditions, and the creation and testing of a new constitutive model that tries to offer
more flexibility in approximating experimental data than the existing ones.
An overview is made of the main characteristics of soil behaviour in cyclic loading conditions. The
models are then analysed and evaluated in light of these characteristics.
The models are described and tested in Plaxis for a simple cyclic loading scenario, and some remarks
are made about their ability to simulate the desired behaviour and their field of application.
A new model is developed, based on a non-linear elastic stress-strain relationship, that, given modulus and damping experimental results, generates and adapts a spline backbone curve in stress-strain
space so that the resulting analytical curves are as close as possible to both sets of experimental results.
The development of the new constitutive soil model is explained and tested in its ability to approximate
experimental data, and its implementation into Plaxis is similarly evaluated.
Finally, both the existing tested models and the developed model are subjected an earthquake simulation in Plaxis. The results obtained from the model are compared with each other, with measured
ground motion records and with a simulation using the EERA program, and considerations are made
about the performance of each model.

Key-words: cyclic loading, spline model, constitutive soil models, site response, non-linear cycle
independent model.

Resumo

O objectivo deste trabalho e a analise


de modelos constitutivos de solos e a sua capacidade para
e avaliacao
de um novo
simular o comportamento do solo para carregamentos cclicos, e a criacao
modelo constitutivo que procura oferecer mais flexibilidade do que os ja existentes.
geral e feita das principais caractersticas do comportamento do solo em condicoes
de
Uma visao
entao
analisados e avaliados a` luz de tais caractersticas.
carregamento cclico. Alguns modelos sao

descritos e testados no Plaxis para um carregamento cclico simples, e


Os modelos sob analise
sao
ao seu campo
avaliados a` luz da sua capacidade para simular o desejado comportamento e em relacao

de aplicacoes.
tensao-deformac

elastica

Um novo modelo e desenvolvido, baseado numa relacao


ao
nao-linear
que,
dados resultados experimentais de rigidez e amortecimento, gera uma curva de esqueleto utilizando
proximas

uma spline de tal forma que as curvas analticas sejam tao


quanto possvel dos resultados
experimentais. O desenvolvimento do novo modelo constitutivo e explicado e testado na sua capacidade
no Plaxis e igualmente avaliada.
para aproximar dados experimentais, e a sua implementacao
sujeitos a uma simulacao
de um
Finalmente, os modelos testados e o modelo desenvolvido sao
comparados entre si, com registos ssmicos e com uma
sismo no Plaxis. Os resultados obtidos sao
na ferramenta EERA, e consideracoes
sao
feitas sobre o desempenho de cada modelo.
simulacao

Palavras-chave: carregamento cclico, modelo spline, modelos constitutivos de solos, resposta de

stio, modelo elastico


nao-linear.

Acknowledgments
I would like to thank Professor Jaime Santos for always being there in the hard times when no exit
seemed possible and always pointing out a quick and elegant solution. Also, I would like to thank
professor Jaime for squeezing out of me a drive that made this work possible in such a short amount of
time.
I likewise want to thank all the teachers that made my late specialisation-change a possibility, allowing
me to finish my degree in the regular time, and who believed I could do it when I though no one would.
Those are, in no particular order: Professor Rui Gomes, professor Alexandre Pinto, professor Jaime
Santos (again!), professor Rafaela Santos, and professor Laura Caldeira. Thank you immensely.
Camoes,

Also, this work would not have been the same without the support of Joao
my office companion (truth be told, I invaded his office) throughout the majority of the time that I worked on this
dissertation. Thank you, not only for your knowledgeable advice on the matters of geotechnics, but
for your sage advice on all things non-geotechnical that weve talked about during our lunches, coffee
breaks, etc. Also, thank you for making me aware of the vast world of alternative (I mean really alternative) music that exists out there. I havent seen you perform yet, but I hope I can do so in the near
future!
Thank you to my parents and brother, for being the anchor that lets me know where home truly is, for
being the moral compass that guides my life, and for always being there for me.
And last, but not least, thank you to all my friends, for reminding me during these months that there
is more to life than just soil behaviour under cyclic loading! Youre the best!

Contents
1 Introduction

1.1 Context and motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2 Objectives and methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Soil behaviour under cyclic loading

2.1 Introduction and relevance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2 Stress-strain relationship

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3 Soil stiffness and damping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3.2 Soil stiffness and shear modulus . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3.3 Material damping and damping ratio . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3.4 Evolution of stiffness and damping with strain . . . . . . . . . . . . . . . . . . . . .

2.4 Behaviour under increasing shear strain . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4.1 Very small strains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4.2 Small to medium strains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4.3 Medium to large strains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

2.5 Testing and experimental data

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.5.1 Small strain tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

2.5.2 Medium to high strain tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

3 Overview of soil models for cyclic loading conditions

17

3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

3.1.1 Important concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

3.2 Models based on elastic behaviour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

3.2.1 Linear isotropic elasticity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

3.2.2 Ramberg-Osgood model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

3.3 Models based on elasto-plastic behaviour . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

3.3.1 Important concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

3.3.2 Mohr-Coulomb model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

3.3.3 Hardening-Soil model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

4 The Spline-based model

44

4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

4.2 Methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

4.2.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

4.2.2 Analytical approximation of shear modulus and damping curves . . . . . . . . . .

46

4.2.3 Spline interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

4.2.4 Spline integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

4.2.5 Error minimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51

4.2.6 Implementation into Plaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52

4.3 Implementation and usage

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

4.4 Results and comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

4.4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

4.4.2 Comparison with the Ramberg-Osgood model . . . . . . . . . . . . . . . . . . . .

58

4.4.3 Results using experimental data . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

4.4.4 Cyclic loading simulation with Plaxis . . . . . . . . . . . . . . . . . . . . . . . . . .

64

4.5 Model limitations and workarounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

4.6 Possible applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

4.7 Possible improvements

69

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Site response simulation

70

5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

5.2 Important concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

5.3 Ground motion records

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

5.4 Soil characteristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

5.5 Approximation using the Spline-based model . . . . . . . . . . . . . . . . . . . . . . . . .

77

5.6 Approximation using other models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

5.6.1 Linear elastic model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

5.6.2 Mohr-Coulomb model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

5.6.3 Ramberg-Osgood model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

5.7 Plaxis simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

5.7.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

5.7.2 Plaxis calibration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

5.7.3 Model characteristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

5.7.4 Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

6 Concluding remarks

94

Bibliography

98

A Spline-based model VBA source code (Module 1)

99

ii

B Spline-based model VBA source code (Module 2)

112

C Spline-based model VBA source code (Module 3)

118

iii

iv

List of Figures
2.1 Evolution of the shear modulus ratio (G/G0 ) with shear strain () proposed by Vucetic and
Dobry (1991), for different values of Plasticity Index (PI). . . . . . . . . . . . . . . . . . . .

2.2 Evolution of the damping ratio () with shear strain () proposed by Vucetic and Dobry
(1991), for different values of Plasticity Index (PI). . . . . . . . . . . . . . . . . . . . . . . .

2.3 Representation of a skeleton curve and hysteresis loop formed by defining the loading
and unloading paths according to the Masing rule. Source: Ishihara (1996). . . . . . . . .

11

2.4 Visual representation of the elastic stored energy, W , and dissipation of energy, W .
Source: Ishihara (1996). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

2.5 Representation of a seismic refraction test setup. Source: Kramer (1996). . . . . . . . . .

14

2.6 Representation of a piezoelectric bender element. Source: Kramer (1996). . . . . . . . .

15

2.7 Representation of a hollow cyclic torsional shear test setup. Source: Kramer (1996). . . .

16

3.1 Representation of the soil geometry, boundary conditions and loading used in all soil
models tested. Dimensions: 10 m 10 m. . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

3.2 Shear strainshear stress curve obtained in the testing of the Linear Elastic model. . . . .

22

3.3 Shear strainshear stress curves of the tests made to the Ramberg-Osgood model, for
different strain amplitudes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

3.4 Analytical shear strainshear modulus ratio curve and corresponding points calculated
from each of the tests made with the Ramberg-Osgood Plaxis model. . . . . . . . . . . .

28

3.5 Analytical shear straindamping ratio curve and corresponding points calculated from
each of the tests made with the Ramberg-Osgood Plaxis model. . . . . . . . . . . . . . .

28

3.6 Yield function of the Mohr-Coulomb model plotted in normal stress shear stress ( 0
) space, with indication of the Mohrs circles of effective stresses. Source: Potts and
Zdravkovic (1999). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

3.7 Yield function of the Mohr-Coulomb model plotted in triaxial stress space. Source: Potts
and Zdravkovic (1999). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

3.8 Representation of a Mohr-Coulomb hysteresis loop for undrained conditions. . . . . . . .

33

3.9 Shear strainshear stress curves of the tests made to the Mohr-Coulomb model, for different strain amplitudes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

3.10 Analytical shear strainshear modulus ratio curve and corresponding points calculated
from each of the tests made with the Mohr-Coulomb Plaxis model. . . . . . . . . . . . . .

36

3.11 Analytical shear straindamping ratio curve and corresponding points calculated from
each of the tests made with the Mohr-Coulomb Plaxis model. . . . . . . . . . . . . . . . .

36

3.12 Stress-strain relationship behind the Hardening-Soil model, in primary loading for a standard drained triaxial test. Source: Brinkgreve et al. (2006). . . . . . . . . . . . . . . . . . .

39

3.13 Shear strainshear stress curve of the test made to the Hardening-Soil Plaxis model with
a = 1.50 102 for the last cycle (each test having a total of 10.25 loading cycles). . . .

41

3.14 Analytical shear strainshear modulus ratio curve and corresponding points calculated
from each of the tests made with the Hardening-Soil Plaxis model, for the last loading cycle. 42
3.15 Analytical shear straindamping ratio curve and corresponding points calculated from
each of the tests made with the Hardening-Soil Plaxis model, for the last loading cycle. . .

43

4.1 Empirical data from Vucetic and Dobry (1991) (represented as points) approximated by
generalised logistic functions (represented as lines). . . . . . . . . . . . . . . . . . . . . .

47

4.2 Appearance of the Spline-based models implementation into Excel 2010. . . . . . . . . .

56

4.3 Appearance of the graphs generated by the Excel routine (backbone curve on the top,
and stiffness and damping curves on the bottom). . . . . . . . . . . . . . . . . . . . . . .

57

4.4 Examples of Ramberg-Osgood backbone curves with varying parameters. . . . . . . . . .

59

4.5 Stiffness and damping data points extracted from R-O curves, and respective approximations made by running the Spline-based model (represented as lines). . . . . . . . . . . .

60

4.6 Experimental stiffness data points extracted from the empirical curves by Vucetic and
Dobry (1991), and respective approximations made by running the Spline-based model
and by adjusting the coefficients of R-O backbone curves. . . . . . . . . . . . . . . . . . .

61

4.7 Experimental damping data points extracted from the empirical curves by Vucetic and
Dobry (1991), and respective approximations made by running the Spline-based model
and by adjusting the coefficients of R-O backbone curves. . . . . . . . . . . . . . . . . . .

62

4.8 Stiffness and damping data points extracted from the empirical curves by Vucetic and
Dobry (1991), and respective approximations made by running the Spline-based model
(represented as lines). Corresponding Spline backbone curves presented above. . . . . .

63

4.9 Stiffness and damping data points extracted from the empirical curves by Darendeli (2001),
and respective approximations made by running the Spline-based model (represented as
lines). Corresponding Spline backbone curves presented above. . . . . . . . . . . . . . .

63

4.10 Shear strainshear stress paths obtained from the tests made to the Spline-based model,
for different strain amplitudes; and backbone curve calculated with the Excel VBA routine.

66

4.11 Shear strainshear modulus ratio curve obtained from the Excel VBA routine and corresponding points calculated from each of the tests made with the Spline Plaxis model, and
original experimental points from the empirical curve by Vucetic and Dobry (1991). . . . .

66

4.12 Shear straindamping ratio curve obtained from the Excel VBA routine, corresponding
points calculated from each of the tests made with the Spline Plaxis model, and original
experimental points from the empirical curve by Vucetic and Dobry (1991).

vi

. . . . . . . .

67

5.1 Example of the path taken by the seismic waves in a typified earthquake scenario. Source:
Kramer (1996). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

5.2 Acceleration time series for the East-West component of the Gilroy #1 (rock) ground motion record. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

5.3 Acceleration time series for the East-West component of the Gilroy #2 (soil) ground motion
record. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

75

5.4 Initial/elastic shear modulus Ge = G0 for the soil layers at the Gilroy #2 site, obtained from
tests made for soil from the site, down to the assumed bedrock layer. Source: Andrade
and Borja (2006). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

5.5 Stiffness degradation and damping curves (mean values) for the soil layers for various
depths at the Gilroy #2 site, obtained from tests made for soil from the site. Source:
Andrade and Borja (2006).

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

5.6 Stiffness and damping data points extracted from the experimental curves by Andrade
and Borja (2006) for the Gilroy #2 site, and respective approximations made by running
the Spline-based model (represented as lines). Corresponding Spline backbone curves
presented above. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

5.7 Approximation of the stiffness and damping curves for the Gilroy #2 site made using the
Mohr-Coulomb model. Corresponding backbone curves presented above. . . . . . . . . .

79

5.8 Approximation of the stiffness and damping curves for the Gilroy #2 site made using the
Ramberg-Osgood model. Corresponding backbone curves presented above. . . . . . . .

79

5.9 Close-up of the finite element mesh at the refined band in the center of the Plaxis model
(which simulates the one-dimensional earthquake approximation). . . . . . . . . . . . . .

82

5.10 Amplification function of a single layer overlaying rigid bedrock modelled both in the Plaxis
software and with the EERA tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

5.11 Amplification function of a single layer overlaying rigid bedrock modelled in the Plaxis
software with and without Newmark time integration damping, and comparison with the
EERA tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

5.12 Amplification function of a multi-layered model overlaying rigid bedrock modelled in the
Plaxis software with Rayleigh damping applied to different combinations of natural frequencies, and comparison with the EERA model, for = 2%. . . . . . . . . . . . . . . . .

86

5.13 Geometry of the Plaxis model used to simulate the Loma Prieta earthquake. . . . . . . .

87

5.14 Comparison between the acceleration time series obtained: from the Plaxis earthquake
simulation using the different constitutive models; from the EERA simulation; and from the
measured Gilroy #2 E-W ground motion record. . . . . . . . . . . . . . . . . . . . . . . . .

89

5.15 Comparison between the Fourier amplitude spectra obtained: from the Plaxis earthquake
simulation using the different constitutive models; from the EERA simulation; and from the
measured Gilroy #2 E-W ground motion record. . . . . . . . . . . . . . . . . . . . . . . . .

vii

90

5.16 Comparison between the amplification function spectra obtained from the Plaxis earthquake simulation with the Spline-based model, from the EERA simulation, and from the
measured Gilroy #2 E-W ground motion record. . . . . . . . . . . . . . . . . . . . . . . . .

91

5.17 Maximum strains reached with depth in the Plaxis simulation, for each of the models tested. 93

viii

Symbols and acronyms


Latin alphabet:
[D] constitutive matrix
[De ] elastic constitutive matrix
[M ] mass matrix
{k} state parameters of the soil that control its hardening or softening plasticity
{m} state parameters of the soil that control the shape of its plastic potential surface
A amplitude of a harmonic function
A parameter of the generalised logistic function (lower asymptote)
AG parameter of the generalised logistic function (lower asymptote), when applied to the determination
of the secant shear modulus
A parameter of the generalised logistic function (lower asymptote), when applied to the determination
of the damping ratio
Amax maximum amplitude of a series of harmonic functions
Amin minimum amplitude of a series of harmonic functions
a polynomial coefficient
a, b generic integration boundaries
ai polynomial coefficient of index i
ai Fourier series coefficient of index i
B parameter of the generalised logistic function (growth rate)
BG parameter of the generalised logistic function (growth rate), when applied to the determination of
the secant shear modulus
B parameter of the generalised logistic function (growth rate), when applied to the determination of
the damping ratio
b polynomial coefficient
bi polynomial coefficient of index i
bi Fourier series coefficient of index i
c soil cohesion
c polynomial coefficient
ci polynomial coefficient of index i
ci Fourier series coefficient of index i
Delem size of a finite element
d polynomial coefficient
di polynomial coefficient of index i
E Youngs modulus
E50 Youngs modulus for primary deviatoric loading
Eoed Youngs modulus for oedometer loading conditions
Eur Youngs modulus for unloading and reloading
ix

E ref reference Youngs modulus


ref
E50
reference Youngs modulus for primary deviatoric loading
ref
Eoed
reference Youngs modulus for oedometer loading conditions
ref
Eur
reference Youngs modulus for unloading and reloading

eij deviatoric component of the incremental strain tensor


F () yield function
f frequency
f function of stress
f (x), g(x) function of x (let x be any variable)
fi i-th natural frequency
G() secant shear modulus as a function of shear strain
G, Gsec shear modulus (secant)
Gcalc
calculated secant shear modulus of index i
i
Gexp
experimentally determined secant shear modulus of index i
i
Gur secant shear modulus for unloading and reloading
Gref
ur reference secant shear modulus for unloading and reloading
Gmax , G0 , Ge maximum / initial / elastic shear modulus
H layer width
h depth
hi positive ordinate difference between the control points i and i + 1 in a spline
I(x) integral function of the spline function
K bulk modulus
K parameter of the generalised logistic function (upper asymptote)
KG parameter of the generalised logistic function (upper asymptote), when applied to the determination of the secant shear modulus
K parameter of the generalised logistic function (upper asymptote), when applied to the determination
of the damping ratio
ref
reference bulk modulus for unloading and reloading
Kur

Kur bulk modulus for unloading and reloading


L() Generalised logistic function (or Richards function)
li parameter used in the algorithm to generate spline curves
M parameter of the generalised logistic function (maximum growth for Q = v)
MG parameter of the generalised logistic function (maximum growth for Q = v), when applied to the
determination of the secant shear modulus
M parameter of the generalised logistic function (maximum growth for Q = v), when applied to the
determination of the damping ratio
m power parameters that quantifies the amount of stress dependency of the elastic modulus in the
Hardening-Soil model
masing switch parameter implemented in the Plaxis routine to model the Masing rule

P plastic potential function


Pi polynomial of index i
Pi0 (x) first derivative of the polynomial with index i, with regards to x
Pi00 (x) second derivative of the polynomial with index i, with regards to x
pref reference stress value for which E = E ref
Q parameter of the generalised logistic function
QG parameter of the generalised logistic function, when applied to the determination of the secant
shear modulus
Q parameter of the generalised logistic function, when applied to the determination of the damping
ratio
q deviatoric stress
qa assymptotic value of the deviatoric stress
qf ultimate deviatoric stress
Rf ratio of the ultimate deviatoric stress to the assymptotic value of the deviatoric stress
r parameter of the Ramberg-Osgood model
S(x) spline function
Su undrained shear strength
Tf period of a vibratory motion
t time
umax (h, t) maximum amplitude of the motion registered at depth h over time t
v parameter of the generalised logistic function (affects the position of the maximum growth)
vG parameter of the generalised logistic function (affects the position of the maximum growth), when
applied to the determination of the secant shear modulus
v parameter of the generalised logistic function (affects the position of the maximum growth), when
applied to the determination of the damping ratio
vs shear wave velocity through a material
W maximum elastic energy that can be stored in a unit volume of a viscoelastic body
W p plastic work
wG error weight associated with the secant shear modulus ratio calculation
w error weight associated with the damping ratio calculation
x spatial coordinate
x ordinate of a spline control point
xi ordinate of a spline control point of index i
y spatial coordinate
y abscissa of a spline control point
yi abscissa of a spline control point of index i
zi parameter used in the algorithm to generate spline curves

xi

Greek alphabet:
[] damping matrix
vector of strain state
vector of stress state
parameter of the Ramberg-Osgood model
Newmark coefficient
Rayleigh coefficient
i parameter used in the algorithm to generate spline curves
Newmark coefficient
Rayleigh coefficient
shear strain
xy shear strain in the x y plane
p function of plastic strains
a shear strain amplitude of a loading cycle
d soil volume weight (dry)
oct octahedral shear strain
S
oct,
i octahedral shear strain of a splines control point with index i

r reference shear strain


y reference value of shear strain, in the context of the Ramberg-Osgood model
ij Kronecker delta
t time interval
W energy lost in a loading cycle
vector of incremental stress state
vector of incremental strain state
incremental strain
e incremental elastic component of strain
p incremental plastic component of strain
pi component of the incremental plastic component vector of strain
strain
p1 plastic component of the major principal component of strain
pv plastic component of the volumetric component of strain
1 major principal component of strain
ij component of the strain tensor of row index i and column index j
T total error
e elastic component of strain
p plastic component of strain
scalar parameter that controls the magnitude of plastic straining
wavelength
i parameter used in the algorithm to generate spline curves
xii

Poissons ratio
ref reference Poissons ratio
damping ratio
() damping ratio as a function of shear strain
icalc calculated damping ratio of index i
iexp experimentally determined damping ratio of index i
soil volume mass (density)
stress
0
xy
effective shear stress in the x y plane

10 effective major principal stress component


20 effective intermediate principal stress component
30 effective minor principal stress component
h0 effective horizontal component of stress
i component of the vector of stress state
n0 effective normal component of stress
0
n,f
effective normal component of stress at failure

shear stress
a shear stress correspondent to the shear strain amplitude of a loading cycle in the backbone curve
f maximum shear strength, shear strength at failure
oct octahedral shear stress
y reference value of shear stress, in the context of the Ramberg-Osgood model
phase angle
0 effective angle of internal friction
i phase angle of index i
0 effective dilatancy angle
angular frequency
i angular frequency of index i
i i-th natural angular frequency

Acronyms:
.dll Dynamic Link Library (Windows file extension)
CPT Cone Penetration Test
EERA Equivalent-linear Earthquake site Response Analysis
H-S Hardening-Soil
M-C Mohr-Coulomb
PI Plasticity Index
P-wave compression wave
R-O Ramberg-Osgood

xiii

SASW Spectral Analysis of Surface Waves


SCPT Seismic Cone Penetration Test
SPT Standard Penetration Test
S-wave shear wave
VBA Visual Basic for Applications

xiv

Chapter 1

Introduction
1.1

Context and motivation

The study of problems that deal with soil behaviour under seismic loading conditions requires the use of
a constitutive model able to reproduce the cyclic behaviour of soils from small deformations to failure.
Most constitutive models available and implemented into finite-element calculation software programs are limited in their ability to adequately reproduce the soils response under cyclic loading. As
such, the interest arises in investigating some of these models, trying to identify their limitations and
respective range of application.
A type of models commonly used when modelling soils for certain cyclic loading scenarios is based
on non-linear elasticity of the stress-strain relationship. These models have a set of rules to define
first loading behaviour and to define unloading and reloading, the former being governed by so-called
backbone functions. Most models of this type rely on backbone functions that have fixed formulas with
a set number of parameters, which are calibrated to adapt to experimental testing data. However, the
fact that these functions are dependant on fixed formulas makes them somewhat inflexible and hard
to adapt to experimental data from a wide array of different soils and soil behaviours. In this context,
the interest arises in investigating the consequences of replacing those fixed formulations with spline
functions, which have a varying and in theory unlimited amount of parameters, and consequently the
potential to be much more flexible in adapting themselves to experimental data.

1.2

Objectives and methodology

The current work has two main objectives:


The analysis and testing of existing soil models in the context of soil behaviour under cyclic loading.
The development of a new model based on a backbone curve spline formulation that tries to
improve on the already existing models, along with its analysis and testing.
For this purpose, the following approach will be followed:
Firstly, a description of the behaviour of soil when subjected to cyclic loading will be presented.
1

Secondly, some well-known soil models will be presented and analysed in terms of their ability to
simulate soil behaviour under cyclic loading.
Thirdly, a model will be proposed based on a backbone curve spline formulation that tries to improve on some of the already existing models in terms of their simulation of cyclic behaviour.
Lastly, both the analysed existing models and the proposed model will be tested in a one-dimensional
earthquake simulation, and compared with EERA and with existing ground motion records.
With regards to the description of the soils behaviour under cyclic loading, it will serve as a basis
for the subsequent analysis of the soil models and their capacity to correctly model this kind of dynamic
behaviour. The description will focus on the most important aspects of soil behaviour in a cyclic loading
scenario, including stress paths and stiffness and damping evolution with strain. A brief overview of
some of the most well-known on-site and laboratory experimental methods will also be made.
Following the description of soil behaviour, the analysis of some well-known soil models will be
presented in terms of their ability to simulate soil behaviour under cyclic loading. One of the models
under analysis was made specifically with cyclic loading conditions in mind, while the others are typically
used to model soils under static, and not dynamic, loading conditions. The choice of models to be
analysed in this work was made on the basis of their availability in the version of the finite element
software Plaxis that was used, since this was the main platform used to test and compare the models.
As such, due to reasons of unavailability, some soil models that are traditionally used to model cyclic
behaviour will not be analysed. For each soil model analysed, a brief explanation of the theory behind
the model will be presented, comments will be made on the models limitations and applications, and the
results of a simple test in Plaxis will be analysed and compared with the other models, both to gauge
the implementation of the models in the software and to assess the differences between them.
Following this, having as a basis one of the analysed soil models, the proposed soil model developed
in the context of this work will be presented. The developed model is based on the Ramberg-Osgood
model, a constitutive soil model based on non-linear elastic stress-strain relationship coupled with the
Masing rule. Unlike this model, however, instead of a fixed formula to define the models backbone curve
(which governs its first loading path), it relies on a spline function which in theory has more flexibility.
The general development steps of this new model will be listed and described, including the models
implementation into the finite element software Plaxis. Furthermore, the means with which the model
was implemented will be similarly described, together with an explanation on how to use the model in
practice. The models implementation in Plaxis will then be tested. The models limitations will finally be
presented, together with its prospective application possibilities and future improvements.
Finally, a simulation of a real earthquake will be made in Plaxis, using both the analysed soil models
and the new developed soil model. The parameters of the models will be chosen so that they approximate the characteristics of the earthquake site, based on information taken from the literature. A
ground motion record taken from a rock outcropping near the earthquake site will be used as an input
for the earthquake in Plaxis. The results from running the simulation for each of the models will then
be compared between themselves, with a ground motion record of the event at the soil site, and with a
one-dimensional earthquake analysis tool.
2

Chapter 2

Soil behaviour under cyclic loading


2.1

Introduction and relevance

Cyclic loading can be defined as a periodic action that when applied to a material body tends to change,
and usually reverse, its stress and strain state over time.
One of the most recognisable forms of a soil in a cyclic loading scenario happens during an earthquake. An earthquake is a propagation of seismic waves that radiate from an underground source, and
are in most cases related to plate tectonics. These seismic waves, of which there are various kinds, impose on the soil small and large-scale movements that are both erratic and unpredictable. It is common
knowledge that an earthquake can pose serious risks to population aggregates, as it can cause deaths,
injuries, and property and infrastructure damage, sometimes with disastrous consequences. As such,
studies that try to predict or evaluate the consequences of these phenomena are of extreme importance.
Even though seismic waves travel through rock in the majority of its journey from the source of the quake
to the ground surface, the small portion of soil that is often near the surface can have a significant impact
on the magnitude and nature of shaking at ground surface (Kramer, 1996). The study of the material
properties of soils is therefore very important to understand the influence that the soil can have on the
seismic waves (often called site effects), and also, conversely, the influence that the seismic waves can
have on the soils properties.
This work will focus on the latter notion, as it will try to analyse the changes that occur in the soil when
it is subjected to cyclic loading conditions. This analysis will be made through the use and evaluation of
existing models and also of a new proposed model that tries to improve on its predecessors.
The analyses that will be made in this work will, initially, consist in evaluating the soils behaviour in
cyclic (specifically, harmonic) loading conditions. Although these are one of the simplest examples of
cyclic loading, the study of soil behaviour using these simple signals is still relevant, as even an extremely
complex cyclic motion such as an earthquake can be described as a juxtaposition of simple harmonic
motions, or a Fourier series (Kramer, 1996). Eventually the models will undergo a more rigorous test in
the form of an earthquake simulation.

2.2

Stress-strain relationship

The analysis of the response of the soil in cyclic loading conditions is usually made using models that
describe the soils behaviour as a relationship between shear stress, , and shear strain, . Ishihara
(1996) states that the description of the soil behaviour in these terms is of the uttermost importance
in the context of cyclic loading scenarios. This relationship, plotted over the duration of the cyclic behaviour, constitutes what is called the stress-strain curve. From this information, other parameters can
be determined that are of great importance to the evaluation of the soils behaviour, namely the stiffness
properties of the soil, and also its damping characteristics. The stress-strain curve that the soil follows
during cyclic loading, and the behaviour it exhibits, are intimately related to the shear strain amplitude of
the loading. Further in this chapter the changes in soil behaviour with increasing shear strain amplitude
will be discussed.
In the context of the stress-strain curve, it is important to distinguish between two different facets of
the soils stress-strain relationship. One happens when the soil is in a strain state that is of a higher
magnitude than the previous maximum attained by the soil. In this case it can be said that the soil is
in the path of first loading. This path can be described mathematically through the use of a backbone
curve. Alternatively, if the soil is in a strain state that has a lower magnitude than its previous maximum,
the soil is either in an unloading path or in a reloading path, depending on whether the strain is increasing
or decreasing with time. In the context of cyclic loading, the unloading and reloading paths form what
are typically called the hysteresis loops, due to the fact that they loop around in stress-strain space.

2.3
2.3.1

Soil stiffness and damping


Introduction

Most methods that deal with the characterisation of the soil under cyclic loading conditions focus on
determining the evolution of two facets of the soil behaviour over the course of the loading cycles: the
soils stiffness and damping characteristics.
Stiffness, in the context of material (and, more specifically, soil) mechanics, measures the resistance
of a material to being deformed when subjected to an applied loading, and as such governs the relationship that is established between stress and strain over time. If a soil is being stressed, that may have
as a consequence the rearranging of particles inside the soil, which will result in material strains. These
material strains, for a given loading, are governed by the stiffness characteristics of the soil. These
characteristics are very important in the context of soil mechanics and its application to geotechnical
design, since they govern the movements of the soil from the very small to the very large scale.
Of special importance in the context of cyclic loading behaviour is the evaluation of the stiffness of
soils for different strain rates. It is well known that the stiffness of soils changes (in most cases nonlinearly) with strain (Kramer, 1996; Ishihara, 1996), and as such the soils characteristics may change
significantly depending on the strain rate. An important consequence of the non-linear evolution of
stiffness with strain is also the generation of plastic, or irreversible, strains.
4

Damping, in the context of cyclic loading, can be understood as the dissipation of energy that follows
a loading of the soil. It has a very important effect on the consequences of the cyclic loading of soils.
For example, if a soil that had no damping were to be excited by an external momentary load that would
cause it to vibrate, it would vibrate indefinitely and with unchanging amplitude. Soil damping allows such
an excitation to decrease over time until it is no longer felt. Similarly, for loading frequencies close to the
soils resonance frequency, the amplification phenomenon is less grievous the more damping the soil
exhibits. This is especially important to mitigate the consequences of, for example, seismic activity.
When talking about damping, it is important to distinguish between material damping and radiation
damping, the former being the dissipation of energy through internal soil friction, and the latter the
dissipation of energy from the natural spreading of energy/motion waves through space. Of these types
of damping, only material damping is dependent on the soils characteristics and not on the soils overall
geometry and boundaries. Therefore, material damping will be the type of damping that is given the
most focus in this work. Unless stated otherwise, from now on any mentions of damping in this work
should be taken to mean material damping.
In the context of cyclic loading behaviour, damping is often considered to increase with strain (Kramer,
1996; Ishihara, 1996). This evolution of damping characteristics with strain is a fundamental target of
analysis when working with models that deal primarily with this kind of behaviour.
Considering the reasons stated above, it should come at no surprise that both the stiffness and the
damping characteristics of a soil are very important to describe its overall behaviour, and as such their
characterisation and study is given a considerable amount of attention (Kramer, 1996).

2.3.2

Soil stiffness and shear modulus

For cyclic loading conditions, and especially at low to medium strain amplitudes, the stiffness of the soil
is well represented by a parameter called the secant shear modulus, Gsec . For the sake of convenience,
the secant shear modulus is often referred to as simply the shear modulus, G, which is the designation
that will be used in this work henceforth.
The shear modulus is expressed in units of pressure, and is defined as the ratio of shear stress, ,
to shear strain, , i.e.:
G=

(2.1)

At very small strains the shear modulus of a soil is at its maximum. This modulus is often called the
maximum or initial shear modulus, respectively and interchangeably , Gmax or G0 (Ishihara, 1996).
The initial shear modulus of a soil can be directly related to the speed that shear waves attain while
travelling through the material, vs , through (Kramer, 1996):
G0 = vs2

(2.2)

It is common to define, for a given soil, its reference strain, r , which is the strain for which the soil

mobilizes its maximum shear strength, f , with its initial shear modulus. This relationship is expressed
by:
r =

f
f
G0 =
G0
r

(2.3)

Laboratory tests indicate that soil stiffness is influenced by the following parameters (Kramer, 1996;
Ishihara, 1996):
Cyclic strain amplitude;
Void ratio;
Mean effective stress;
Plasticity index;
Overconsolidation ratio;
Number of loading cycles.
Some of the above parameters and their influence on soil stiffness have strong correlations with one
another. For example, the effect of the number of loading cycles on the soil stiffness only becomes
apparent for strain amplitudes over a certain threshold.

2.3.3

Material damping and damping ratio

Soils under cyclic loading show a tendency to dissipate energy, even at low strains (Kramer, 1996). This
dissipation of energy happens due to material damping.
In this context the distinction has to be made between viscous damping and hysteretic damping. The
main practical difference between the two is that hysteretic damping does not depend on the frequency
of the loading, while the viscous damping is strongly influenced by it (Verruijt, 1994). In soils, the main
form of energy dissipation, or damping, is thought to happen through hysteretic damping (Ishihara,
1996). Therefore, it is thought that hysteretic damping is a more accurate representation of the damping
behaviour of soils than viscous damping (Verruijt, 1994). Despite this, not all models agree on the type
of damping to consider, some of them using the theory of viscous damping to explain the damping
characteristics observed in soils, and others relying on the hysteretic damping definition.
In theory, hysteretic damping happens when the soil is subjected to cyclic loading that pushes its
strain levels beyond the linear cyclic threshold shear strain. Beyond this threshold, the hysteretic loops
increase with increasing shear strain amplitude, and so does the hysteretic damping. Experimental data
suggests, however, that even below the linear cyclic threshold strain some energy dissipation occurs,
even though the mechanism is not well understood (Kramer, 1996).
In this work, material damping will be considered to happen exclusively through hysteretic damping.
As such, unless specifically stated otherwise, the mentioning of damping in this work should from now
be taken to mean hysteretic damping, for the sake of convenience.
The damping properties of a soil are influenced by its plasticity characteristics. Specifically, lowplasticity soils show higher damping ratios than high-plasticity soils, for the same strain amplitude

(Kramer, 1996). Kramer (1996) also states that the damping behaviour is influenced by effective confining pressure, and especially so for low-plasticity soils. Soils under higher effective confining pressures
exhibit less energy dissipation than soils under lower effective confining pressures.
To characterise the damping properties of a soil under cyclic loading, it is useful to consider the energy lost during one cycle of load application. This energy is given by the area enclosed by a hysteresis
loop, W (Ishihara, 1996). However, this parameter alone is not appropriate to measure a materials
damping characteristics, since it is a function of the shear amplitude of the loading cycle, a , and not
solely a function of the material.
To circumvent this problem, it is usual to characterise a soils damping through a parameter called
the damping ratio, . This parameter is proportional to the relationship between the energy loss per
cycle, W , and the maximum elastic energy that can be stored in a unit volume of a viscoelastic body,
W , through the expression (Ishihara, 1996):
=

1 W
4 W

(2.4)

The quantity W is defined as the area of the triangle bounded by a straight line defining the secant
modulus at the point of maximum strain (Ishihara, 1996), as can be seen in Figure 2.4, i.e.:
W =

1
1
a a = f (a )a
2
2

(2.5)

As this quantity is also dependant on the shear amplitude of the loading cycle, the damping ratio
can be used to measure and compare the damping characteristics of different soils, as it only depends
on the soils material properties.

2.3.4

Evolution of stiffness and damping with strain

While in Section 2.4 soil behaviour under increasing shear strain will be described in more general terms,
this subsection will focus on the evolution of the stiffness and damping parameters with strain.
For a soil under cyclic loading, as the strain amplitude increases, the shear modulus ratio, G/G0 ,
which is equal to unity for zero shear strain amplitude, gets progressively lower (Ishihara, 1996; Kramer,
1996). The change of the modulus ratio with shear strain is often presented visually through the use of
a modulus reduction curve (Kramer, 1996). The reduction of the shear modulus with strain is dependent
on the soils material properties. Experimental results from a series of authors (Vucetic and Dobry, 1991;
Ishibashi and Zhang, 1993; Darendeli, 2001) indicate that the soils plasticity has a strong effect on the
shape of the modulus reduction curves. The shear modulus tends to decrease as the Plasticity Index
increases, for strains over the very small range (see Figure 2.1). Similarly, experimental results from
Ishibashi and Zhang (1993) and Darendeli (2001) show a significant influence of the effective confining
pressure on the shape of the shear modulus ratio curves, with soils under increasing confining pressure
showing increasing stiffness for most strain ranges.
At the same time, it is known that, as the strain amplitude increases, soils tend to dissipate more

energy in a loading cycle through damping, and their damping ratio, , increases (Ishihara, 1996; Kramer,
1996). As happens with the shear modulus, experimental results from a series of authors (Vucetic and
Dobry, 1991; Ishibashi and Zhang, 1993; Darendeli, 2001) show that the plasticity of the soil has a
significant effect on the evolution of damping with strain. The damping ratio tends to increase as the
Plasticity Index increases, for strains over the very small range (see Figure 2.2). Similarly, experimental
results from Ishibashi and Zhang (1993) and Darendeli (2001) show a significant influence of the effective
confining pressure on the shape of damping ratio curves, with soils under increasing confining pressure
showing decreasing damping for most strain ranges.

Figure 2.1: Evolution of the shear modulus ratio (G/G0 ) with shear strain () proposed by Vucetic and
Dobry (1991), for different values of Plasticity Index (PI).

Figure 2.2: Evolution of the damping ratio () with shear strain () proposed by Vucetic and Dobry (1991),
for different values of Plasticity Index (PI).
8

2.4

Behaviour under increasing shear strain

2.4.1

Very small strains

When a soil is subjected to loading conditions that result in strains in the very small range (< 105 ), the
soil seems to exhibit linear elastic behaviour (Ishihara, 1996).
Soils under cyclic loading with strains in this range do not change their properties either during the
application of a loading cycle or from one cycle to the next. As the elastic characteristics do not change
during the application of a loading cycle, these soils do not exhibit any hysteretic damping.
Soils that exhibit this behaviour can be accurately modelled by just two elastic parameters, using a
linear elastic analysis based on Hookes law of elasticity, as will be seen in Chapter 3.

2.4.2

Small to medium strains

While the amplitude of shear strain is still small enough, the response of the soil typically does not
change with repeating loading cycles. However, the strain level can be sufficiently high so that the soil
does not behave as a linear elastic material, but instead exhibits non-linear behaviour. This kind of
behaviour seems to manifest itself for shear strains in the range approximately between 105 and 103
(Ishihara, 1996).
The change from very small strain behaviour to small strain behaviour which is when non-linear
effects start to manifest themselves is typically defined as the linear cyclic shear strain threshold
(Vucetic, 1994).
A type of model that is typically used to simulate soil behaviour in this strain range is defined as the
non-linear cycle independent model (Ishihara, 1996).

Non-linear cycle-independent model


A non-linear cycle-independent model makes two basic assumptions about the soil behaviour. It assumes that:
The stress-strain curve followed by the soil under increasing strain is non-linear (i.e. the stiffness
properties of the soil change with increasing strain);
For cyclic loading, the response of the soil does not change with the application of successive cycles. Specifically, for successive cycles with the same strain amplitude the shear modulus evolution
happens in the same way, and the damping ratio stays unchanged (Ishihara, 1996).
In these kinds of models, the stress-strain curve can be divided into two basic categories: the path
of first loading, defined by a backbone curve; and the unloading and reloading paths, which form the
hysteresis loops. These two path types control the majority of soils behaviour under cyclic loading.

More complex models may have additional rules that govern effects such as irregular loading conditions,
densification, pore pressure generation, etc. (Kramer, 1996).
Typically, the definition of the backbone curve is tied to two basic parameters (Kramer, 1996): the
initial soil stiffness and the shear strength of the soil. The first parameter controls the backbone curves
shape in the low strain range, while the second controls the soil behaviour for large strains.
Additionally, these models typically assume that the path taken by the soil during cyclic loading can
be fully described by the following four rules (Kramer, 1996; Ishihara, 1996):
1. For initial loading, the stress-strain curve follows the backbone curve;
2. For stress reversals, the unloading and reloading paths are obtained by stretching the skeleton
curve by a factor of two and shifting its origin point to the point of stress reversal. This rule can be
expressed mathematically in the following manner:
Assuming the skeleton curve is expressed by:
(2.6)

= f ()

then, for the unloading path, we have:


a
=f
2

a
2

a
2

(2.7)

and, for the reloading path, it follows that:


+ a
=f
2

(2.8)

where a is the strain amplitude of the loading cycle and a the corresponding stress in the backbone curve.
3. If the unloading or reloading curve exceeds the previously attained maximum strain and intersects
the backbone curve, the stress-strain curve follows the backbone curve until the next stress reversal;
4. If the unloading or reloading curve intersects an unloading or reloading curve from the previous
cycle, the stress-strain curve follows the intersected curve.
The first two rules comprise the so-called Masing behaviour, and by themselves do not fully describe
the behaviour of soils under non-harmonic cyclic loading conditions. The last two rules fill that gap, and
the four rules together form the extended Masing rule.
The modelling of the soil according to these rules produces stable hysteresis loops for harmonic
loading conditions, as can be observed in Figure 2.3.
It is relatively straightforward to find the analytic expression for the damping ratio, , for a non-linear
cycle-independent model following the Masing rule. The skeleton curve and hysteresis loop of a model
10

Figure 2.3: Representation of a skeleton curve and hysteresis loop formed by defining the loading and
unloading paths according to the Masing rule. Source: Ishihara (1996).

Figure 2.4: Visual representation of the elastic stored energy, W , and dissipation of energy, W .
Source: Ishihara (1996).
of this kind, together with the representation of the energies necessary to define the damping ratio, can
be observed in Figure 2.4. As can be seen in the figure, and remembering that the hysteresis loops
have the same shape as the backbone curve, stretched by a factor of two in both axes, it is apparent

11

that the half-moon section AOC has the same shape as the section ABE, and one-fourth of its area. As
the shape ABE comprises half of the hysteresis loop, it follows that the dissipated energy, W , which is
equal to the area enveloped by the loop, is in turn equal to eight times the area of the section AOC, or:
Z
W = Aloop = 2 AABE = 8 AAOC = 8


f () d W

(2.9)

where W is given by equation (2.5).


Introducing equations (2.5) and (2.9) into equation (2.4), we have:
Z
=

8
0


1
f () d f (a )a
2
2
=
1

f (a )a
2

Z a

2
f
()
d
0

1
f (a )a

(2.10)

However, if instead of having the shear stress as a function of shear strain, i.e. = f (), we have
the inverse relationship, i.e. = g( ), equation (2.10) can be rewritten as (Ishihara, 1996):
Z

2
1

g( ) d
0

a g(a )

(2.11)

Either expression can be used to find the damping ratio in the context of a non-linear cycle-independent
soil model.
Two models that can be classified as non-linear cycle-independent are the Hyperbolic model (Kondner, 1963) and the Ramberg-Osgood model (Ramberg and Osgood, 1943).

2.4.3

Medium to large strains

Soils that are subjected to strains larger than about 102 tend to exhibit changes in their properties not
only with increasing shear strain but also with repeated application of loading cycles (Ishihara, 1996).
Ishihara (1996) states that the change verified in shear modulus and damping ratio between cycles
depends on the effective confining stress during loading.
In these strain ranges, shear strains are not enough to describe the soil behaviour, since volumetric
strains start to become an important part of soil behaviour. For repeated loading cycles, volumetric
deformations start to accumulate, and the hysteresis loops start to become more inclined and with a
smaller area (Chitas, 2008).
Similarly to the threshold that is defined between linear and non-linear elastic behaviour in the small
strain range, in the medium strain range a threshold from which volumetric strains start to become
relevant is defined. This threshold is usually known as the volumetric shear strain threshold (Vucetic,
1994).
The modelling of soils in this strain range has to be made using elasto-plastic models that evaluate
the differential equations of motion in a step-by-step basis over time, such as the Newmark method
(Chitas, 2008).
12

2.5

Testing and experimental data

Soil testing is very important on the context of cyclic soil modelling. Traditionally, soil models incorporate
a series of parameters and coefficients that are calibrated for each soil with experimental data resulting
from testing.
In this section a brief mention will be made on the types of tests that are relevant in the context of
determining the cyclic loading behaviour of soils and obtaining data to be used for soil modelling.
Experimental data can come from laboratory or field testing, depending on whether the soil is tested
in the laboratory using a sample or in its original location in the field.
Some soil properties have a greater influence than others on the kinds of behaviour that are relevant
from a cyclic loading perspective, such as wave propagation. Kramer (1996) lists these properties as
the most important in this context:
stiffness;
damping;
Poissons ratio;
density.
Of these, the most critical to analyse cyclic soil behaviour are the stiffness and damping soil properties (Kramer, 1996), which is why this work focuses much of its attention on said properties. In fact, as
will be seen further in this work, experimental data results for stiffness and damping characteristics are
traditionally used as the input data to determine the parameters for many models that deal specifically
with cyclic soil behaviour, including the Ramberg-Osgood model and the new model proposed in this
work (see Chapter 4).

2.5.1

Small strain tests

In the small strain range, the testing of the soils properties tends to be done via the analysis of wave
propagation through the material. The measured speed of the propagated waves can be correlated with
the elastic parameters of the soil (Chitas, 2008). The elastic parameters can be measured in this way
with relative confidence due to the fact that the energy levels associated with the tests typically made
impose on the soil strains that do not push the soil strain state past the linear elastic threshold.
The speed of the propagating waves for small straining can be determined through the use of various
tests. Some typically used field tests are the following (Kramer, 1996; Chitas, 2008):
Seismic reflection test used to determine P- and S-wave (respectively, compression and shear
wave) velocity and layer thickness by producing an impulse at a source and measuring the arrival
time at a receiver.
Seismic refraction test used to determine P- and S-wave velocity by producing an impulse at a
source and measuring the arrival time at a linear array of receivers at different distances from the
source at ground surface. This test is simpler to analyse than the reflection test (see Figure 2.5).

13

Surface wave methods (Rayleigh waves) used to determine Poissons ratio and shear wave velocity, typically for near-surface layers, through the measurement of the Rayleigh wave wavelength
by placing a receiver at the center of a vibrating circular footing and moving another receiver to
points at different distances from the receiver and determining when the two receivers start to
vibrate in-phase.
Spectral Analysis of Surface Waves (SASW) test generates a dispersion curve (i.e. wave velocity
versus frequency), whose shape is related to the variation of wave velocities with depth, by placing
two vertical receivers on the ground surface in line with an impulsive or random noise source. It
is a test that can be performed quickly, requires no borehole, detects low-velocity layers, and is
normally used in depths up to 30 m. In some cases good resolution tests for depths of up to 100 m
can be achieved.
In-hole tests (cross-hole, down-hole, up-hole) these tests use a single borehole (or more, in the
case of the cross-hole test), and at least an impulse energy source and a receiver, to measure
wave propagation velocities along horizontal paths.

Figure 2.5: Representation of a seismic refraction test setup. Source: Kramer (1996).
On the other hand, typical laboratory tests for the small strain range are the following (Kramer, 1996;
Chitas, 2008):
Resonant column test in this test solid or hollow cylindrical soil specimens are subjected to
harmonic torsional or axial loading (or, in some cases, random noise or impulse loading). From
this, information can be obtained regarding the stiffness and damping characteristics of the soil.
Ultrasonic pulse test in this test stress high-frequency waves are produced in a piezoelectric
transmitter, sent through the soil, and received in a piezoelectric receiver. Through the measure
of the time the waves take to arrive, the wave velocity in the soil specimen can be determined.
This test is especially useful for very soft materials, since it does not require the soil samples to be
removed from the original sampling tube.
14

Piezoelectric bender element test this test consists in using piezoelectric bender elements to
measure wave travel velocities. A piezoelectric bender element is made up from two thin piezoceramic plates joined together. The plates in the element are bonded in such a way that when current
passes through them, one expands and the other contracts, causing the element to bend (see Figure 2.6). Conversely, when the element is bent, it produces a voltage which can be detected and
measured. An element can then be used either as a transmitter or as a receiver. Traditionally, bender elements are placed in either end of a soil sample, one a transmitter and the other a receiver.
The transmitter then is made to vibrate, producing an S-wave that is picked up by the receiver, and
the wave velocity through the material can be measured (Kramer, 1996).

Figure 2.6: Representation of a piezoelectric bender element. Source: Kramer (1996).

2.5.2

Medium to high strain tests

When the strain amplitudes imposed on the soil are higher, soils tend to exhibit volumetric changes,
which can manifest themselves through volumetric straining (for drained conditions) or through pore
pressure generation (for undrained conditions).
For this strain range, some typically used field tests are the following (Kramer, 1996; Chitas, 2008):
Standard Penetration Test (SPT ) in this test, the soil is loaded by a standardised apparatus that
hits the soil in successive blows until the test tube penetrates the soil by 150 mm. This blow count
can be correlated with various soil characteristics, including wave travel velocity and stiffness and
damping parameters. These correlations, however, must be made with increased care, as the
correlated values have significant amounts of statistical dispersion.
Cone Penetration Test (CPT ) this test consists in driving a cone into the ground at a steady
rate and measuring the force required to penetrate the cone into the ground. Similarly to the
Standard Penetration Test, the results of this test can be correlated to various soil characteristics.
Alternatively, a seismic version of this test (SCPT ) can be used to directly assess wave velocity
through the material. As with the SPT test, these correlations must be made with care.
To more accurately measure the soils characteristics for higher-strain cyclic loading, laboratory tests
are typically more reliable than field tests. Some of the usually applied tests in this strain range are the
following (Kramer, 1996):
15

Cyclic triaxial test this test is one of the most commonly used to measure cyclic soil properties at
high strain levels (Kramer, 1996). This test is identical to the standard static triaxial stress, where
a cylindrical specimen is subjected to a radial stress and an axial stress, the difference between
them being called the deviator stress. In the cyclic version of the test, the deviator stress is applied
cyclically. This test outputs measurements of stress and strain state over time, which can be used
to compute the shear modulus and damping ratio of the soil specimen, and the corresponding
evolution curves with strain.
Cyclic direct simple shear test while not as widely used as the cyclic triaxial test, this test is better
able to reproduce the stress state conditions that happen during an earthquake (Kramer, 1996).
In this test, a short, cylindrical specimen is rigidly bound at the side boundaries and applied cyclic
horizontal shear stresses to the top or the bottom of the specimen, emulating the deformations
the soil suffers under the influence of upward-propagating S-waves. The test also outputs stress
and strain measurements over time, allowing the measurement of the shear modulus and damping
ratio of the soil specimen. This test is also commonly used to test liquefaction susceptibility.
Cyclic torsional shear test this test improves on the cyclic triaxial and simple shear tests by
allowing initial stress states to be either isotropic or anisotropic and by permitting shear straining
through torsion to reach much higher values. This test is more commonly used to measure a soils
stiffness and damping characteristics over a wide range of strain levels (Kramer, 1996). The test
can be made using either a solid cylindrical specimen or a hollow specimen, the advantage of the
latter version being a more uniform distribution of stress along the soil (see Figure 2.7).

Figure 2.7: Representation of a hollow cyclic torsional shear test setup. Source: Kramer (1996).
Traditionally, very small-strain tests are used to measure the soils characteristics in the linear elastic
range, while leaving the measurement of the non-linear evolution with straining for higher strain tests.
For the purposes of this work, and especially considering the proposed Spline-based model (presented in Chapter 4), the experimental values that are used to calibrate the models are the shear modulus ratio and the damping ratio for various values of shear strain. These values can be obtained from
some of the tests presented above.

16

Chapter 3

Overview of soil models for cyclic


loading conditions
3.1

Introduction

Many constitutive soil models were developed over the time to deal with the soils very complex characteristics. Some models, such as the simple and widely-used Mohr-Coulomb model, are used to a large
extent in determining soil behaviour for a range of geotechnical applications.
Four soil models will be analysed in this chapter. As was previously mentioned, the choice of the
models to analyse was made on the basis of their availability in the Plaxis version used (version 8). The
models under analysis are, in order, the linear isotropic elasticity model, the Ramberg-Osgood model
(non-linear elastic stress-strain relationship with cycle independence), the Mohr-Coulomb model, and
the Hardening-Soil model.
Of these models, only the Ramberg-Osgood model has been developed to deal specifically with
cyclic loading conditions. However, the analysis of the other models, developed to deal primarily with
static loading behaviour, is also relevant in the context of cyclic loading conditions. To some extent, the
analysis of these models for dynamic loading conditions may even be thought of as being of increased
importance, since it is reasonable to assume that they have not been tested as thoroughly for cyclic
loading conditions as other models developed to specialise in that kind of behaviour.
It would have been interesting to analyse other constitutive soil models in the context of this work
(namely models that focused more on cyclic behaviour), but, due to time and size constraints and
especially to unavailability in the Plaxis version used , the analysis was limited to the models mentioned
above.
For each model analysed in this chapter, an overview of the models theoretical background will be
presented, followed by a set of considerations about its application possibilities and limitations when
dealing with cyclic loading conditions. The results of the testing of each model in the Plaxis software
and respective comparison between models (when relevant) will also be presented.

17

3.1.1

Important concepts

Constitutive behaviour
A materials constitutive behaviour is the relationship that is established between stress and strain. The
constitutive behaviour is usually expressed in the following manner:
{} = [D]{}

(3.1)

or

xz

yz

xy

D11

D12

D13

D14

D15

D16

D21

D22

D23

D24

D25

D26

D31

D32

D33

D34

D35

D36

D41

D42

D43

D44

D45

D46

D51

D52

D53

D54

D55

D56

D61

D62

D63

D64

D65

D66

xz

yz

(3.2)

xy

where [D] is the materials constitutive matrix, {} the vector of stress state, and {} the vector of strain
state.
In non-linear elastic models, the constitutive matrix may vary depending on the stress history of the
soil, and therefore the constitutive behaviour is evaluated in terms of increments of stress and strain
instead of total stresses and strains. Equation (3.1) can then be written as:
{} = [D]{}

3.2

(3.3)

Models based on elastic behaviour

3.2.1

Linear isotropic elasticity

Overview
One of the simplest models that can be used to define a soils stress-strain relationship is one that
assumes linear isotropic elasticity. This is a model that tries to simplify the characteristics of a soil down
to its most basic behaviour, and is a valid approximation only in very specific circumstances.
This model assumes that (Potts and Zdravkovic, 1999):
the soil behaves in a linear manner, i.e. its stiffness characteristics do not change with the stress
and/or strain level;
the soil has isotropic behaviour, i.e. every plane is a plane of symmetry for soil behaviour;
the soils behaviour is elastic, i.e. the directions of principal incremental stress and incremental
strain coincide.

18

In this idealised behaviour, only two independent constants are needed to represent the material
behaviour (typically, Youngs modulus, E, and Poissons ratio, ), and its constitutive matrix becomes
symmetrical (Potts and Zdravkovic, 1999):

[D] = [De ] =
(1 + )(1 2)

12
2

12
2

sym

12
2

(3.4)

In geotechnical analysis, it is often more convenient to express the constitutive matrix (3.4) in terms
of shear modulus, G, and bulk modulus, K:

K + 43 G

e
[D ] =

K 32 G

K 23 G

K + 43 G

K + 43 G 0 0 0

G 0 0

G 0

sym

K 23 G

0
0

(3.5)

where
K=

E
E
; G=
3(1 2)
2(1 + )

Relevance and applications


In a geotechnical context, this model is normally used as a good approximation only in some very
specific scenarios, such as the simulation of the behaviour of bedrock layers, or as a simplification of the
behaviour of some structural elements in interaction with the soil. For soil behaviour, the linear elastic
approximation is only valid if the soil is very lightly strained.
In the cases when the approximation can be made without a great loss in accuracy, this model is very
simple to use and only requires two easily-measurable parameters. This can be seen as an advantage
in comparison with the other tested soil models. However, the usage of this model on its own has to be
made with the previous knowledge that the soils strain state will not fall outside the linear elastic range,
which limits the models usefulness.
However, the formulation of elastic behaviour according to this model is present in various other soil
models (for example, in the Mohr-Coulomb model), as a way to deal with soil behaviour inside the linear
elastic range, while having additional rules to deal with soil behaviour outside this range.
Regarding specifically the context of cyclic loading behaviour, this model:
does not account for the reduction in shear modulus, G, with increasing strain amplitude;
19

does not account for the dissipation of energy through damping at any strain amplitude;
does not account for irreversible strains that occur in the soil for strains above a certain threshold.
In this context, this model can only be used when the strain amplitude of the loading cycles fall inside
of the linear elastic threshold (< 105 ). In alternative, for strains in the small to medium range, the
linear equivalent method can be applied considering a viscoelastic model with equivalent values for the
stiffness and damping soil properties.

Cyclic loading simulation with Plaxis


As part of the models available in Plaxis, a simple test was made to evaluate the use of the model in
cyclic loading conditions using the finite element software. The test made to analyse this model, similarly
to the tests made for the other soil models, simulates a simple shear test in undrained conditions.
The results of the testing of soil models in Plaxis will be presented in the form of a shear stressshear
strain relationship and also, when relevant, in the form of other derived relationships (e.g. strainstiffness
or straindamping).
In Figure 3.1 a representation of the tested soil model is presented. Note that for all subsequent soil
model analyses the only parameters that will change are the material model and possibly the loading
parameters. As such, Figure 3.1 represents each and all of the tests made for the soil models under
analysis. Similarly, the descriptions of model geometry and boundary conditions are equally unchanged
between the analysed soil models.

Figure 3.1: Representation of the soil geometry, boundary conditions and loading used in all soil models
tested. Dimensions: 10 m 10 m.
Model geometry:
The model consists of a square with 10 m 10 m, as can be seen in Figure 3.1.

20

Boundary conditions:
The model assumes plane strain conditions, i.e. it disregards strains in the direction perpendicular
to the working plane.
To simulate a simple shear test, the models plane boundary conditions are as follows (see Figure
3.1):
In the side boundaries (x = 0 and x = 10 m), displacements are not permitted in the vertical
(y) direction.
In the lower boundary (y = 0), displacements are not permitted in either plane direction.
In the upper boundary (y = 10 m), displacements are not permitted in the vertical (y) direction.
Loading conditions:
To simulate a simple shear test, a prescribed displacement was applied to the top boundary of the
soil model (see Figure 3.1).
Loading characteristics:
Number of tests: 1
Type of loading: harmonic prescribed displacement (sine function):
Amplitude: A = 0.5 m (corresponding to = 5 102 )
Frequency: f = 0.01 Hz or = 0.063 rad/s
Phase angle: = 0
Duration of loading: t = 325 s (i.e. 3.25 cycles)
Material characteristics:
Material model Linear Elastic.
Material parameters:
E = 30000 kPa
= 0.30
or
E
= 25000 kPa
3(1 2)
E
G=
= 11538.5 kPa
2(1 + )
K=

Additional information:
So as to simulate a simple shear test, the soils self-weight multiplier was set to zero. This avoids
problems such as dynamic effects and initial stresses influencing the model results. This measure
is only relevant in subsequent tested models, but for the sake of consistency it was applied to this
model as well.
Plaxis calculation tool-specific relevant parameters more information can be found in the Plaxis
manual (Brinkgreve et al., 2006):

21

Calculation type = Dynamic analysis


Number of calculation phases = 1
Additional steps = 300
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps = 1
Results:
The shear strainshear stress curve obtained by running the model1 is presented in Figure 3.2. The
results pertain to a calculation node situated approximately in the upper boundary of the soil model.

Figure 3.2: Shear strainshear stress curve obtained in the testing of the Linear Elastic model.
The results are as would have been expected. The slope of the curve is constant and equal to
G = 11538.5 kPa.
In the strain ranges tested, which far surpass the linear elastic strain threshold, this model does not
adequately represent the soils behaviour under cyclic loading, for the reasons mentioned in Subsection
3.2.1.
Using the linear elastic model, there is no meaning in presenting modulus and damping evolution
curves with strain amplitude, since the former would be always equal to the initial shear modulus and
the latter always equal to zero.
1 The

result graphs were made in Excel using data exported from the Plaxis software after running the tests.

22

3.2.2

Ramberg-Osgood model

Overview
The Ramberg-Osgood formula was developed by Ramberg and Osgood (1943) as a way to define the
stress-strain relationship of certain materials in terms of three parameters (namely, Youngs modulus and
two secant yield strengths). This model was developed with metal alloys in mind, but with appropriate
adaptations has since been proven to also adequately represent a soils backbone curve in certain
conditions, such as in the small to medium strain range (Ishihara, 1996).
In addition to defining the backbone curve according to this formulation, the extended Masing rule
can be used to model the unloading and reloading paths of the soil in a cyclic loading scenario. In such
a case, the overall model can be classified as a non-linear elastic cycle-independent model, as was
described in Subsection 2.4.2.
It should be noted that, strictly speaking, this is not an fully elastic model. Due to the combination
between the non-linear elasticity and the modelling of the unloading and reloading paths according to the
Masing rule, irreversible strains can and do occur after the soil is first loaded. In this sense, this model
simulates elastoplasticity by having the elastic parameters change with strain and behave differently
for first loading and for unloading/reloading. However, the model is implemented by making use of an
incremental elastic stiffness matrix, and incrementally, it behaves in a similar way as a fully elastic model.
It also doesnt feature any type of yield surface like the more traditional elastoplasic models.
The most distinguishable characteristic between models of this type lies in the definition of their
skeleton curves, which is why this model is named after the backbone curve formulation. The stressstrain relationship adapted from Ramberg and Osgoods original formula to define the skeleton curve for
the Ramberg-Osgood model is the following (Ishihara, 1996):
"
r1 #

1 +
=
y
y
y

(3.6)

where y and y are, respectively, reference values of shear stress and shear strain, and and r are
parameters that control the shape of the backbone curve.
Typically, the values of y and y are taken to be, respectively, the shear strength, f , and reference
strain, r , of the soil (Ishihara, 1996). Equation (3.6) can then be rewritten as:
"
r1 #

=
1 +
r
f
f

(3.7)

The four parameters of the model (f , r , , and r), are normally chosen and calibrated by means of
experimental testing.
Taking into account the fact that the initial shear modulus, G0 , relates with the shear strength and the

23

reference strain by G0 = f /r , Equation (3.7) can be rewritten as:


=

G0
r1

1 +

(3.8)

From Equation (3.8), the expression for the strain-dependent shear modulus can be easily obtained
by setting = a and = a :
G
=
G0

1


G a r1
1 +

G0 r

(3.9)

where a is the shear amplitude, a the corresponding shear stress, and G = a /a .


As this is a non-linear cycle-independent model, the expression for the damping coefficient given by
equations (2.10) and (2.11) can be used in the context of this model. As Equation (3.8) has a form of
= g( ), then substituting Equation (3.8) into Equation (2.11) yields (Ishihara, 1996):


G a r1


G0 r
2 r1
=



r+1
G a r1

1 +

G0 r

(3.10)

Eliminating a /r by substituting Equation (3.8) into Equation (3.10), the expression for the damping
coefficient becomes dependant only on the shear modulus ratio, G/G0 , and the parameter r:


G
2 r1
1
=
r+1
G0

(3.11)

Relevance and applications


This model is appropriate to simulate soil behaviour for small to medium strains (see Subsection 2.4.2).
It reproduces the observed soil behaviour in that strain range for cyclic loading, specifically the reduction of stiffness and the increase of damping with increasing strain amplitude, while remaining cycleindependent (i.e. exhibiting the same behaviour independently of the number of loading cycles applied).
However, its usefulness lessens when analysing soils above those strain levels. Specifically, it does
not model soil failure, and as such is inadequate to analyse geotechnical problems where the soil has
the possibility to enter a failure state. It also does not account for (accumulated) volumetric straining
and the subsequent changing of the soils response, which also starts to manifest itself for higher strain
levels.
Additionally, this models focus is on the analysis of the soil according to its shear stress and shear
strain state. For isotropic loading conditions, this soil model behaves as a linear elastic model, ignoring
soil behaviour such as isotropic hardening and the effect that varying confining pressure has on the soils
characteristics.
As to the definition of the model itself, the fact that it has only four controllable parameters can be

24

seen as both an advantage and a disadvantage. On the one hand, it makes for a relatively lightweight
model, but on the other hand it means the model may not be flexible enough to adapt itself to the
characteristics of a wide range of soils.

Model implementation into Plaxis


The Ramberg-Osgood soil model was not available by default in the Plaxis version used in this work.
However, a User-Defined Soil Model developed by (Chitas, 2008) was used instead to test the model.
The formulation adopted by Chitas (2008) is based on the method described by Chen and Mizuno
(1990). It consists in a non-linear incremental formulation based on the secant bulk modulus, K, and
the secant shear modulus, G.
Both the secant shear modulus and the secant bulk modulus are considered to be dependant on the
octahedral shear strain, oct :
oct =

2
3

q
(11 22 )2 + (22 33 )2 + (33 11 )2 + 6 212 + 6 223 + 6 231

(3.12)

where ij is a component of the strain tensor [].


The dependence of the secant shear modulus with the octahedral shear strain is controlled, in this
model, by the Ramberg-Osgood backbone curve formulation, i.e. assuming a = oct in Equation (3.9).
The secant bulk modulus, on the other hand, is assumed to follow a linear elastic behaviour, i.e.
Kt = K is constant and independent on the stress or strain state of the soil.
The incremental stress-strain formulation of the constitutive model can be expressed by (Chitas,
2008):

ij = 2

Kt
G

2
3


ij kl + G ik jl + ekl eij kl

(3.13)

with
4 Gt G

2
3
oct
d
dG
Gt =
=
oct + G
doct
doct
=

(3.14)
(3.15)

where Kt is the tangent bulk modulus, G is the secant shear modulus, Gt is the tangent shear modulus,
ij is the Kronecker delta, and eij is the deviatoric component of the incremental strain tensor.
Chitas (2008) warns that the formulation adopted has as a consequence that the volumetric and
distortional behaviours are independent, as it is based on the isotropic linear elastic formulation. This is
a valid approximation only in the very small to small strain range, making the adopted Plaxis soil model
inadequate for analysis outside of this range. The model will, however, be used in a strain range that
may go beyond the small strain range for comparison purposes, with the knowledge that the results
would not correctly approximate the soils behaviour in a real scenario.

25

Cyclic loading simulation with Plaxis


As was mentioned before, information about the Plaxis test regarding geometry and boundary conditions
was provided in the corresponding subsection for the Linear Elastic model (Subsection 3.2.1). These
conditions are unchanged between the Linear Elastic model and any of the subsequent models, and as
such their description will not be repeated.
Unlike what was done for the Linear Elastic model, for the Ramberg-Osgood model several tests
were made, each with a different shear strain amplitude. This was done in order to measure the damping
behaviour of the soil model for different shear strain amplitudes.
Loading conditions:
Loading characteristics:
Type of loading: harmonic prescribed displacement (sine function):
Number of tests: 14
Amplitude variable:
Minimum amplitude: Amin = 0.0001 m (corresponding to = 105 )
Maximum amplitude: Amax = 1.0 m (corresponding to = 101 )
Frequency variable2 :
For 103 , f = 0.01 Hz or = 0.063 rad/s
For > 103 , f = 100 Hz or = 628.3 rad/s
Phase angle: = 0
Duration of loading variable:
For 103 , t = 125 s (i.e. 1.25 cycles)
For > 103 , t = 0.0125 s (i.e. 1.25 cycles)
Material characteristics:
Material model Ramberg-Osgood (User-Defined Soil Model).
Material parameters:
Parameter 1 G0 = 10000 kPa
Parameter 2 K0 = 26000 kPa
Parameter 3 r = 103
Parameter 4 = 50
Parameter 5 r = 2.5
Additional information:
So as to simulate a simple shear test, the soils self-weight multiplier was set to zero. This avoids
problems such as dynamic effects and initial stresses influencing the model results.
Plaxis calculation tool-specific relevant parameters more information can be found in the Plaxis
manual (Brinkgreve et al., 2006):
Calculation type = Dynamic analysis
2 The frequency was increased for higher values of shear strain due to finite element calculation errors that occurred when using
low frequencies at high strain rates.

26

Number of calculation phases = 1


Additional steps3 = 300 1000
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps4 = 1 20
Results:
The shear strainshear stress curves obtained by running the model for different shear strain amplitudes are presented in Figure 3.3.
In Figures 3.4 and 3.5 the shear modulus ratio (G/G0 ) and damping ratio () values calculated for
each of the tests made with the Ramberg-Osgood model are compared with the models analytical
curves respectively, equations (3.8) and (3.11). The damping values were obtained by calculating the
area of each tests hysteresis loop, and subsequently using Equation (2.4) to determine the damping
ratio. The stiffness values were calculated directly from the obtained values of the stress-strain curve.
It can be seen from the results that the damping ratio values obtained from processing the data
resulting from the Plaxis model are slightly inaccurate when compared to the analytical curve, and more
so than the shear modulus values. This can be explained by the fact that the shape of the hysteresis loop,
and consequently its area and the damping ratio, is strongly dependent on the precision and number
of points that constitute the loop. On the other hand, the shear modulus values are only dependent on
the value of shear stress at the point of maximum shear strain, which does not heavily depend on the
precision chosen. Naturally, as the precision parameter is limited, the higher the strain, the less precise
the results are, which is why the error is greater at higher strain rates5 .

Figure 3.3: Shear strainshear stress curves of the tests made to the Ramberg-Osgood model, for
different strain amplitudes.
3 For higher values of shear strain, due to finite element calculation errors, the number of additional steps and the value of the
dynamic sub-stepping had to be increased.
4 See footnote 3.
5 For reasons explained in Footnote 3, the precision had to be increased for 5 102 , where it can be seen that the error
in the damping ratio curve suffers a reduction.

27

Figure 3.4: Analytical shear strainshear modulus ratio curve and corresponding points calculated from
each of the tests made with the Ramberg-Osgood Plaxis model.

Figure 3.5: Analytical shear straindamping ratio curve and corresponding points calculated from each
of the tests made with the Ramberg-Osgood Plaxis model.

28

3.3
3.3.1

Models based on elasto-plastic behaviour


Important concepts

The underlying principle of elasto-plastic behaviour is that material strains (or incremental material
strains) can be divided into an elastic component and a plastic component, i.e.:
= e + p ; = e + p

(3.16)

Every elasto-plastic model has to obey to the following four basic criteria (Potts and Zdravkovic,
1999):
1. Coincidence of axes
The principal directions of accumulated stress coincide with the principal directions of incremental
plastic strain.
2. Yield function
The soil state is dependent on a yield function:
F ({}, {k}) = 0

(3.17)

This function separates purely elastic behaviour (F ({}, {k}) < 0) from elasto-plastic behaviour
(F ({}, {k}) = 0). It is also a limit for the impossible stress states of the soil, which are characterised by
F ({}, {k}) > 0.
The yield function plots as a surface in tridimensional stress space, and is a function of the current stress state {} and the state parameters of the soil {k}. The state parameters {k} control the
hardening and/or softening plasticity of the soil, and typically change with either plastic strains (strain
hardening/softening) or plastic work (work hardening/softening).
Note that the yield function can only be represented as a surface in tridimensional stress space if the
soil is assumed to be isotropic. Else-wise, if the soil has anisotropic behaviour, the soil stress state is
defined by six stress parameters, and forms a surface in six-dimensional stress space.
3. Plastic potential function
When the soil yields and its behaviour turns from elastic to plastic, the direction of plastic straining is
governed by a plastic potential function:
P ({}, {m}) = 0

(3.18)

More specifically, it is the derivative of the plastic potential function with respect to the stress state
that governs the plastic straining, by means of a flow rule which can be expressed as:
pi =

P ({}, {m})
i

29

(3.19)

where pi represents the six components of plastic straining, {m} is a vector of (immaterial) state
parameters and is a scalar parameter that controls the magnitude of the plastic straining.
It is common to simplify the plastic straining behaviour of a soil by assuming that the plastic potential
function is the same as the yield function (i.e. F ({}, {k}) = P ({}, {m})), in which case the flow rule
is said to be associated. However, in the more general case this simplification does not apply, and the
plastic potential and yield functions do not coincide.
4. Hardening and/or softening rules
The hardening and/or softening rules govern the change of the state parameters {k} with plastic
R
straining, p (or plastic work, W p = {}T {p }), in Equation (3.18), and also quantify the scalar
parameter in Equation (3.19).
In the case of a perfectly plastic material, which exhibits indefinite plastic strains while the material
is at yield (i.e. F ({}, {k}) = 0), the state parameters {k} are constant and the scalar parameter is
indeterminate.

3.3.2

Mohr-Coulomb model

Overview
The Mohr-Coulomb model is based on perfect plasticity of the soil. As such, the state parameters of the
yield function, {k}, are constant, and are not affected by plastic straining.
This model assumes that the line tangent to the Mohrs circles of stress at failure of a given material
is straight. This line is called the Coulomb failure criterion (Potts and Zdravkovic, 1999), and has the
following expression:
0
0
f = c0 + n,
f tan

(3.20)

0
0
where f and n,
f are, respectively, the shear and normal effective stresses at failure, c is the soils

cohesion and 0 the angle of shearing resistance or angle of internal friction.

Figure 3.6: Yield function of the Mohr-Coulomb model plotted in normal stress shear stress ( 0 )
space, with indication of the Mohrs circles of effective stresses. Source: Potts and Zdravkovic (1999).

30

Based on Figure 3.6, the failure criterion (3.20) can be rewritten as a function of the principal stresses
(Brinkgreve et al., 2006):
10 30 = 2c0 cos 0 + (10 + 30 ) sin 0

(3.21)

where 10 and 30 are, respectively, the major and minor principal stresses.
In this model, Equation (3.21) is adopted as the yield function, i.e.:
F ({}, {k}) = (10 30 ) 2c0 cos 0 (10 + 30 ) sin 0 = 0

(3.22)

The yield function (3.22), in triaxial stress space, plots to form the surface illustrated in Figure 3.7.

Figure 3.7: Yield function of the Mohr-Coulomb model plotted in triaxial stress space. Source: Potts and
Zdravkovic (1999).
In addition to the yield function, the Mohr-Coulomb model is often used with an additional definition
for the plastic potential (Brinkgreve et al., 2006):
P ({}, {m}) = (10 30 ) (10 + 30 ) sin 0 = 0

(3.23)

where 0 is called the dilatancy angle.


If 0 = 0 , then the material has an associated flow rule, and F ({}, {k}) = P ({}, {m}). Note that
Equation (3.24) does not have the term with cohesion c0 that is present in the yield functions Equation
(3.22). This comes from the fact that this term is irrelevant for the plastic potential function, as only the
functions derivative with respect to the stress components is considered when determining the direction
and magnitude of the plastic straining (see Subsection 3.3.1).
In the elastic domain (i.e. F ({}, {k}) < 0), the material behaves with linear isotropic elasticity, and
is therefore governed by two parameters, E and (as seen in Subsection 3.2.1). Therefore, this model
is fully defined by five parameters: E, , c0 , 0 , and 0 .

31

If 0 = 0 and c0 > 0, then this model becomes identical to the Tresca model, which is a model similar
in nature to the Mohr-Coulomb model (Potts and Zdravkovic, 1999). The Tresca model is typically used to
characterize soil behaviour in undrained conditions, where the soils internal friction can be disregarded.

Analytical description of the stiffness and damping curves


This model was not developed with cyclic loading behaviour in mind. However, since the model will be
used in a simulation of this type with Plaxis, it would be useful to have analytical shear modulus ratio and
damping ratio curves to compare with the obtained Plaxis values. As such, their analytical formulation
will be determined.
The model will be tested assuming undrained conditions (i.e. shear strength f = Su ). This assumption does not have any influence on the results from testing the model, since only one point of
the soil model will be analysed with regards to the stress-strain relationship and stiffness and damping
curves. This means that, for that point, only the ultimate shear strength is a relevant parameter, which
for undrained conditions is equal to the soils undrained shear strength.
For the shear modulus ratio evolution curve, it is important to remember that the shear modulus
being analysed is the secant shear modulus. This means that, for strains below the perfect plasticity
threshold strain, we have G = G0 (essentially emulating the Linear Elastic model); and, for strains above
this threshold, G depends only on the shear amplitude, a , and shear strength, f , through:
G=

Su
G
Su
f
=

=
a
a
G0
a G0

(3.24)

With regards to the damping ratio, in the linear elastic range its value is zero. For strains that enter
the plasticity domain the damping is dependent on the shape of the hysteresis loop. This shape, in the
conditions assumed for the model, is a parallelogram with a height of 2Su and a length that depends on
the strain amplitude, and its area is given by (see Figure 3.8):


Aloop


2Su
= 2Su a
(a )
Gur


Su
= 4Su a
Gur

(3.25)

where Gur is the shear modulus for unloading and reloading.


Remembering that the damping ratio is given by Equation (2.4), and that W = Aloop and W =
a Su
, it follows that:
2
=

a a
=
2

1 W
4 W



Su
4Su a
1
Gur
=

a Su
4
2 

2
Su
= 1

Gur a

32

(3.26)

Figure 3.8: Representation of a Mohr-Coulomb hysteresis loop for undrained conditions.

Relevance and applications


Mohr-Coulombs model is widely used as a first approximation to the behaviour of soil in some geotechnical analyses. It is simple enough that it only requires five parameters that are easily determined by
in-situ or laboratory testing, but competent enough to simulate soil yielding, which is sometimes all that
is required in a preliminary analysis.
However, its simplicity also means that it doesnt adequately reproduce the complexity of soil behaviour under most circumstances. As such, the usefulness of this model lessens if more complex soil
analysis are required.
Additionally, in the context of the behaviour of soil under cyclic loading, this model has several drawbacks:
In the elastic domain (i.e., for < f ), this model is just as limited as the linear elastic model (in
fact, they are undistinguishable), i.e.:
It does not account for the reduction in shear modulus, G, with increasing strain amplitude.
It does not account for the dissipation of energy through damping.
This models linear elastic domain, in most cases, has a much higher range than what is normally
observed in soils.
Shear modulus reduction and damping only manifest themselves when the soil yields, which is
known not to be the case for real soil behaviour.
The shape of the stress-strain curve and hysteresis loops do not correctly reproduce the observed
soil behaviour under cyclic loading.
Tied to the item above, this models shear modulus and damping ratio curves do not conform to
experimental data in most circumstances.
33

The unloading and reloading paths have the same shape as the first loading path, which is known
not to be the case for real soils in most circumstances. However, some adaptations of the MohrCoulomb model, such as the one available in Plaxis, may define an additional elastic parameter
specifically for the unloading and reloading scenarios.

Cyclic loading simulation with Plaxis


The geometry and boundary conditions used to test this model are unchanged from the ones used in
both the Linear Elastic and in the Ramberg-Osgood models.
As was done for the Ramberg-Osgood model, several tests were made using this model, each with
a different shear strain amplitude. This was done in order to measure the damping behaviour of the soil
model for different shear strain amplitudes.

Loading conditions:
Loading characteristics:
Type of loading: harmonic prescribed displacement (sine function):
Number of tests: 8
Amplitude variable:
Minimum amplitude: Amin = 0.001 m (corresponding to = 104 )
Maximum amplitude: Amax = 1.0 m (corresponding to = 101 )
Frequency: f = 100 Hz or = 628.3 rad/s
Phase angle: = 0
Duration of loading: t = 125 s (i.e. 1.25 cycles)
Material characteristics:
Material model Mohr-Coulomb.
Material parameters elastic range:
E = 30000 kPa
Eur = 30000 kPa (Youngs modulus for the unloading-reloading paths)
= 0.30
or
K = Kur =

E
3(12)

G = Gur =

E
2(1+)

= 25000 kPa

= 11538.5 kPa

Material parameters yield:


c = 200 kPa
0 = 0o
0 = 0o

34

Additional information:
Similarly to what was done for the previous models, so as to simulate a simple shear test, the soils
self-weight multiplier was set to zero. This avoids problems such as dynamic effects and initial
stresses influencing the model results.
Plaxis calculation tool-specific relevant parameters:
Calculation type = Dynamic analysis
Number of calculation phases = 1
Additional steps = 300
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps = 1
Results:
The shear strainshear stress curves obtained by running the model for different shear strain amplitudes are presented in Figure 3.9. As usual, the results pertain to a calculation node situated approximately in the upper boundary of the soil model.

Figure 3.9: Shear strainshear stress curves of the tests made to the Mohr-Coulomb model, for different
strain amplitudes.
In Figures 3.10 and 3.11 the shear modulus ratio (G/G0 ) and damping ratio () values calculated for
each of the tests made with the Plaxis Mohr-Coulomb model are compared with the analytical curves
respectively, equations (3.25) and (3.26).
The damping values were obtained by calculating the area of each tests hysteresis loop, and subsequently using Equation (2.4) to determine the damping ratio. The stiffness values were calculated
directly from the obtained values of the stress-strain curve.
35

Figure 3.10: Analytical shear strainshear modulus ratio curve and corresponding points calculated from
each of the tests made with the Mohr-Coulomb Plaxis model.

Figure 3.11: Analytical shear straindamping ratio curve and corresponding points calculated from each
of the tests made with the Mohr-Coulomb Plaxis model.
The results show that the values obtained from running the model with Plaxis conform exactly with
the analytical curves. This, as opposed to what happened in the Ramberg-Osgood model, is due to
the fact that the shape and area of the hysteresis loop do not change significantly depending on the
precision of the calculation.
The resulting curves show, as expected, a sharp change at the linear elastic threshold (in this case,
this was at = f /G0 = 1.73 102 ). For values below this threshold, the damping ratio is zero and the
shear modulus ratio is equal to unity.

36

3.3.3

Hardening-Soil model

Overview
A simple improvement that can be made to the Mohr-Coulomb model to improve its ability to reproduce
real soil behaviour is to allow the strength parameters of the soil to vary with accumulated plastic strains.
A hardening plasticity model does not have a fixed yield surface like a perfectly plastic model, but
instead has a surface that can expand with plastic strain. This plastic straining can be separated into
two different types: shear strains and compression strains. Similarly, in this model the distinction is also
made between shear hardening, which governs irreversible strains due to primary deviatoric loading, and
compression hardening, which governs irreversible strains due to primary compression in oedometer or
isotropic loading (Brinkgreve et al., 2006).
The Hardening-Soil model, similarly to other models such as the hyperbolic model, shows a relationship between axial strain and deviatoric stress which can be well approximated by a hyperbole.
However, the Hardening-Soil model differs from the hyperbolic model in three main points (Brinkgreve
et al., 2006): it uses the theory of plasticity instead of the theory of elasticity to model the hardening of
the soil; it models soil dilatancy; and it has a yield cap, beyond which the soil behaves as a perfectly
plastic material.
In this model, while the soils stress state is below the yield cap, soil stiffness is dependent on
the stress state. The distinction is made (Schanz et al., 1999) between compression hardening, in
oedometer conditions, governed by the parameter Eoed :
Eoed =

ref
Eoed

pref

m
(3.27)

and shear hardening, in deviatoric loading conditions, governed by the parameter E50 :
E50 =

ref
E50

c cos 0 30 sin 0
c cos 0 + pref sin 0

m
(3.28)

ref
ref
where Eoed
and E50
are the reference soil stiffness moduli for primary compression loading and for

primary deviatoric loading, respectively; pref is the reference stress value for which E = E ref ; c and 0
are the Mohr-Coulomb strength parameters; and m is the power parameter that quantifies the amount
of stress dependency of the modulus.
The unloading and reloading paths of the soil are treated differently, using a separate Youngs modulus for loading and unloading, Eur , which varies non-linearly with the confining pressure in the same way
as the Youngs modulus for deviatoric loading, E50 (Schanz et al., 1999):
Eur =

ref
Eur

c cos 0 30 sin 0
c cos 0 + pref sin 0

m
(3.29)

The power m typically ranges from 0.5 and 1.0 (Brinkgreve et al., 2006). For soft soils, m should
be equal to unity, which simulates the logarithmic stress dependency observed in these types of soils
(Schanz et al., 1999).

37

The Hardening-Soil model has the following yield function:


F ({}, {k}) = f p

(3.30)

in which f is a function of stress and p is a function of plastic strains, which, for triaxial loading conditions
(10 20 = 30 ), have the following expressions:
1
q
2q
f =

E50 1 q/qa
Eur
p = (2p1 pv ) 2p1

(3.31)
(3.32)

where qa is the hyperboles asymptote, i.e. the asymptotic value of the shear strength.
The approximation made in Equation (3.32), p 2p1 , or pv 0, stems from the fact that, for hard
soils, plastic volume changes tend to be relatively small (Schanz et al., 1999; Brinkgreve et al., 2006),
and as such can be discarded.
Combining equations (3.30), (3.31) and (3.32), it follows that the yield surface has the following
expression:
F ({}, {k}) = 0
1
q
2q

+ 2p1 = 0
E50 1 q/qa
Eur
q
q
1
p1 =

2E50 1 q/qa
Eur

(3.33)

Equation (3.33) describes the hyperbolic relationship between the axial strain, 1 , and the deviatoric
stress, q, in triaxial loading conditions. The yield curves of standard drained triaxial tests tend to be
described by a hyperbolic relationship of this type (Schanz et al., 1999). This relationship is exactly true
in the absence of plastic volumetric strains, i.e. when pv 0. In truth, plastic volumetric strains will
never be exactly zero. However, for hard soils, volume changes tend to be small when compared with
the axial strain, so this approximation is generally sufficiently accurate (Schanz et al., 1999; Brinkgreve
et al., 2006).
Note that this model uses an additional parameter, the ultimate deviatoric stress, qf , that serves as
a yield cap. When the stress state reaches this value, the soil enters a state of perfect plasticity. This
limiting value has the following expression, which is derived from the Mohr-Coulomb failure criterion
(Schanz et al., 1999):
qf = (c cot 0 30 )
qa =

2 sin 0
1 sin 0

qf
Rf

(3.34)
(3.35)

where Rf is the relationship between the ultimate deviatoric stress, qf , and the asymptotic shear
strength, qa . Naturally, it follows that Rf < 1.0.
In Figure 3.12 the stress-strain relationship of the Hardening-Soil model is presented.
38

Figure 3.12: Stress-strain relationship behind the Hardening-Soil model, in primary loading for a standard drained triaxial test. Source: Brinkgreve et al. (2006).
The theoretical background for the plastic potential function and isotropic hardening of this model
will not be explored in this work, since it is of some complexity and has no practical interest for the
analysis that is being done for this model. However, more information on this subject can be found in the
bibliography (Schanz et al., 1999; Brinkgreve et al., 2006).

Relevance and applications


Both this model and the Mohr-Coulomb model are normally meant to be used when there is good input
data on a soils strength parameters but poor quality or insufficient data on its stiffness parameters
(Schanz et al., 1999). This means that the scope of these models differ from the scope of other models
that deal with cyclic loading behaviour, for which the experimental data available usually consists of
stiffness and damping parameters.
This model was developed as an improvement over the Mohr-Coulomb model, incorporating a doublestiffness model for elasticity that distinguishes between compression and shear hardening, in combination with isotropic strain hardening (which was also lacking from the M-C model).
In the simulation of cyclic loading behaviour, this model offers an improvement over the MohrCoulomb model for strains below the fully plastic threshold, in the sense that it allows some plastic
deformations for small strains and consequently exhibits stiffness reduction and non-zero damping.
The hardening effect can also be used in this model as a way to simulate dependency on the number
of loading cycles, which manifests itself in real soil behaviour for larger strain ranges.
However, a limitation of this model and especially so when evaluating behaviour under cyclic loading , is that the unloading or reloading paths are considered to be linear elastic. This has two consequences: it doesnt correctly model the soils tendency to produce hysteretic loops in unloading and
reloading, through nonlinear evolution of stiffness; and it does not account for the high soil stiffness
observed immediately after unloading or reloading (Brinkgreve et al., 2007).

39

To surpass this limitation, a modified version of the Hardening-Soil model is often used, with added
capabilities that deal with small strain stiffness behaviour. The modified model is called the Hardening
Soil model with Small-Strain Stiffness. This model uses the same formulation as the original HardeningSoil model, with two additional parameters to describe the stiffness behaviour at small strains (Brinkgreve
et al., 2007). The Plaxis version used in this work did not, however, include a Hardening-Soil model with
Small Strain. The modified model was, therefore, not tested alongside the other models in this work.

Cyclic loading simulation with Plaxis


The geometry and boundary conditions used to test this model, as always, are unchanged from the
ones used in the previously presented models. Similarly, the damping behaviour for increasing strain
amplitudes was evaluated by running the model through several tests with varying strain amplitudes.

Loading conditions:
Loading characteristics:
Type of loading: harmonic prescribed displacement (sine function):
Number of tests: 14
Amplitude variable:
Minimum amplitude: Amin = 0.01 m (corresponding to = 103 )
Maximum amplitude: Amax = 0.5 m (corresponding to = 5 102 )
Frequency: f = 1 Hz or = 6.28 rad/s
Phase angle: = 0
Duration of loading: t = 10.25 s (i.e. 10.25 cycles)
Material characteristics:
Material model Hardening-Soil
Material parameters:
m = 0.5
ref
ref
ref
Eoed
= Eur
= E50
= 10000 kPa

ur = 0.20
or
ref
Kur
=

Gref
ur =

ref
Eur
3(12ur ) = 5555.6 kPa
ref
Eur
2(1+ur ) = 11538.5 kPa

Material parameters yield:


c = qf = 50 kPa
0 = 0 = 0o

40

Additional information:
Similarly to what was done for the previous models, so as to simulate a simple shear test, the
soils self-weight multiplier was set to zero, to avoid problems such as dynamic effects and initial
stresses influencing the model results.
Plaxis calculation tool-specific relevant parameters:
Calculation type = Dynamic analysis
Number of calculation phases = 1
Additional steps = 1000
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps6 = 1 10
Results:
The shear strainshear stress curve obtained by running the model for the strain amplitude of a =
1.50 102 is presented in Figure 3.13. In the case of this model, only this curve will be displayed (which
is considered to be representative of all the tests made), as the displaying of all tests made for a very
confusing graph.

Figure 3.13: Shear strainshear stress curve of the test made to the Hardening-Soil Plaxis model with
a = 1.50 102 for the last cycle (each test having a total of 10.25 loading cycles).
It can be seen that, for strains that push the stress state above the ultimate failure stress, qf (in the
test of Figure 3.13 this is after the second stress-strain reversal), the Hardening-Soil model starts to
behave as the Mohr-Coulomb model, as its hysteresis loops start to take the shape of parallelograms.
6 For higher values of shear strain, due to finite element calculation errors, the value of the dynamic sub-stepping had to be
increased.

41

This was to be expected, since the Hardening-Soil model assumes perfect plasticity when failure is
reached, similarly to the Mohr-Coulomb model.
In Figures 3.14 and 3.15 the shear modulus ratio (G/G0 ) and damping ratio () values calculated for
each of the tests made with the Hardening-Soil (H-S) model, for the last cycle, are compared with the
analytical curves of the Mohr-Coulomb (M-C) model respectively, equations (3.25) and (3.26). This
comparison was made because of the knowledge that the H-S model would start to behave in a similar
manner to the M-C model when it reached failure, and to more easily determine the differences between
the two (namely, for smaller strain ranges when the soil is hardening). These differences only manifest
themselves, in the tests made, for the lower strain ranges, since the results pertain to the last loading
cycle, and only in the lower strain amplitude tests does this last loading cycle fall in a non-failure state
range (i.e. when hardening is under-way and when the two models differ).
As always, the damping values were obtained by calculating the area of each tests hysteresis loop,
and subsequently using Equation (2.4) to determine the damping ratio. The stiffness values were calculated directly from the obtained values of the stress-strain curve.
The results show that the values obtained from running the model with Plaxis conform with the
analytical curves for the M-C model for all strain amplitudes except for a certain strain range. This is
expected, since such a strain range is between the linear elastic phase and the perfect plasticity phase
(i.e. while hardening is under-way), which is where the M-C and the H-S models differ. It can be
observed, due to this factor, that the stiffness and damping curves have a more gradual transition from
the linear elasticity to the perfect plasticity strain range. This can be seen as an improvement over the
M-C model, and can be used by the model as a way to simulate dependency of the soil behaviour on
the number of loading cycles.
Note that, for the damping curve, the error observed for the higher strain amplitudes can be attributed
to errors in the finite element calculation for high strain rates.

Figure 3.14: Analytical shear strainshear modulus ratio curve and corresponding points calculated from
each of the tests made with the Hardening-Soil Plaxis model, for the last loading cycle.

42

Figure 3.15: Analytical shear straindamping ratio curve and corresponding points calculated from each
of the tests made with the Hardening-Soil Plaxis model, for the last loading cycle.

43

Chapter 4

The Spline-based model


4.1

Introduction

One of the objectives of this work was the development of a non-linear elastic soil model that, given
strain-dependent modulus and damping results from laboratory tests, generates and adapts a splinebased backbone curve in stress-strain space so that the resulting strain-dependent modulus and damping curves are as close as possible to both sets of experimental results.
The developed model can be classified as a non-linear cycle-independent model (see Subsection
2.4.2), similar in nature to the Ramberg-Osgood (R-O) model. However, a key difference between those
models and this one is that, instead of having a single formula to generate the backbone curve for the
R-O model, this is equation (3.8), with four parameters , this model generates a backbone curve that is
a spline made up from a variable number of polynomials, with an equally variable number of parameters.
There are many potential advantages associated with choosing a spline for the backbone curve of a
non-linear cycle-independent model. The main advantage of this formulation is the potential adaptability
and flexibility it can offer. As it is up to the user to choose the resolution of the backbone curve (i.e.
the number of polynomials that constitute the spline), in theory there is much more control over the end
result, as opposed to other formulation with fewer controllable parameters.
Additionally, with this method it is potentially easier for the user to input experimental data directly,
pick-and-choose experimental data points that best suit the desired behaviour, and even add in virtual
data points, so as to force the model to behave in a specific manner. While in other models this can
also be done, this formulation gives the backbone curve more flexibility to adapt itself to the changes or
constraints imposed on the experimental data by the user.
Finally, as a spline is built from piecewise polynomials, it is very easily analytically integrable. This is
obviously an important consideration in the context of this model, as it will be necessary to integrate the
backbone curve in order to obtain the damping ratio for the error checking, and having it done analytically
is both more accurate and less computationally-intensive.
Given a set of experimental data, the end result of the model is a set of polynomial coefficients that
fully define a backbone curve. This curve is calculated by the model to approximate the experimental

44

data that was given as an input as well as possible. This approximations accuracy depends on the
resolution chosen for the backbone curve and on the characteristics of the experimental data.
This chapter will start with an overview of the model, listing the basic steps that go from receiving
the experimental stiffness and damping data points to the final definition of the backbone curve that
best approximates the input data. Then each of the steps will be described further, providing theoretical
considerations about the used methods when relevant. Following this, the models implementation into
Plaxis will be explained, as well as the implementation of the model in the Excel environment (using
VBA). The model will be compared with the Ramberg-Osgood model as they are very similar in nature
and scope , both analytically and using the Plaxis software. Finally, the limitations of the model will be
presented, alongside foreseeable applications and improvements in the future.
The developed model will be referred to in this work, for the sake of convenience, as simply the
Spline-based model.

4.2

Methodology

4.2.1

Overview

The developed model will follow the methodology summarised below. More information about some of
the points listed here will be presented in the next subsections.
1. Receive input of experimental data ( G and points);
2. Generate two analytical G and curves that closely approximate the experimental points;
3. Based on a user-defined resolution, generate a set of points for both curves using the analytical
expressions (the greater the resolution, the more points generated - at the cost of processing time
down the line);
4. Using the values of G at the points generated, initialise the i -values of the backbone curve
using = G , obtaining a set of backbone curve points (i , i );
5. Based on the backbone curve points (i , i ), generate the spline that defines the backbone curve;
6. Based on the backbone curve points, calculate the shear modulus error at each point defined in 3,
using = (G/G0 ) G0 and comparing it to the analytical points obtained in 2;
7. Integrate the generated spline (see Subsection 4.2.4) and calculate the damping ratio at the points
defined in 3 using equation (2.10), and then check the error at each point by comparing the calculated values with the analytical points obtained in 2;
8. Check the overall error by adding the total errors on both shear modulus and damping values,
multiplied by the corresponding error weights;
9. Minimise the error by changing the i -values of the backbone curve defined at 4, and repeating
steps 5 through 8.
45

4.2.2

Analytical approximation of shear modulus and damping curves

While developing this model, it was observed that for it to generate well-behaved shear-dependent modulus and damping curves, it was necessary to have a sizeable amount of experimental points. If few
points were supplied, the generated curves would approximate the experimental points closely, but would
fluctuate wildly between them, which was undesirable.
As experimental results do not normally offer the amount of points necessary for the model to produce
well-behaved curves under normal conditions, the model had to be changed and forced to generate
curves that behaved as expected between experimental points.
It was observed that the G and curves of different materials have similar shapes. If the -axis
is expressed in logarithmic coordinates, they normally appear to have either an exponential shape, an
S-shape with two asymptotes, or something in-between. After some research, it was found that almost
all series of experimental data of either G or can be approximated very closely by a function
named Generalised logistic function or Richards function, no matter their overall shape.
This function was developed by Richards (1959) and, despite being commonly used in different
areas of study for example, to estimate growth patterns in ecosystems (Fekedulegn et al., 1999) or
plant mortality (von Fircks and Verwijst, 1993) , it was found to conform accurately to various different
types of experimental data from a range of diverse soils.
The generalised logistic (or Richards) function (Richards, 1959) can be expressed by:
K A

L(x) = A +

1 + QeB(xM )

1/v

(4.1)

in which: A is the lower asymptote; K is the upper asymptote; B is the functions growth rate; v > 0
affects where the maximum growth occurs; and M is the x of maximum growth if Q = v.
Based on the general expression (4.1), the functions used to calculate the G and approximation curves in the model were the following (remembering that the shape types are observed if the
strain is expressed in a logarithmic scale):
G() = AG +
1 + QG
() = A +
1 + Q

KG AG
1/vG
B
e G (log()MG )

K A
1/v
B
e (log()M )

(4.2)
(4.3)

In Figure 4.1 the fitting of curves with this formulation to well known curves of G and by
Vucetic and Dobry (1991) is presented. The data points were picked from the evolution curves mentioned
earlier in this work (see Figures 2.1 and 2.2).
Note that the fitting is almost always very accurate. In the presented cases only the curve correspondent to the shear modulus ratio with plasticity index of 0 was not accurate in the full strain range, having
deviated at the higher values of strain. However, the cases where this happens were found to be extremely uncommon throughout the range of data from different sources that was tested with the model.
This is, however, a limitation of the model: in the unlikely scenario in which a general logistic curve can

46

Figure 4.1: Empirical data from Vucetic and Dobry (1991) (represented as points) approximated by
generalised logistic functions (represented as lines).
not be found that properly approximates the experimental data, the final backbone curve generated will
probably not be accurate as well.

4.2.3

Spline interpolation

A spline curve is a combination of piecewise polynomial curves that follow specific rules with regards to
their junction points.
Polynomials have the general form:
f (x) = a + bx + cx2 + dx3 + ...

(4.4)

The highest power of x with a non-zero coefficient defines the degree of the polynomial. For example,
if every coefficient above the third power is 0 (i.e. all coefficients above d), the polynomial is of the third
degree, and is called a cubic polynomial.
There are many different kinds of spline curves, the differences between them being the degree of
its constituent polynomials and the rules that govern their junction points. One of the most basic types
of spline formulation is called the natural cubic spline, and is commonly used due to its relative simplicity
and usefulness.
The determining characteristics of a natural cubic spline are the following:
it is made up from cubic polynomials (i.e. third degree polynomials);
it passes through a set of control points, which are also its polynomial junction points;
the first and second derivatives are continuous throughout the spline (including at the junction
points);
the second derivative at the endpoints is equal to zero.
For most spline applications, including this one, the usage of cubic polynomials is preferred over
other degree polynomials. As the polynomials increase in degree, they are increasingly more prone to
erratic fluctuations, which result in splines with odd or ill-fitting shapes. Additionally, as the degree of the
polynomials increases, the spline formulations complexity increases exponentially, as more conditions
have to be set and solved to obtain each polynomials coefficients. On the other hand, setting the degree
47

of the polynomials too low results in spline curves that are not visually smooth, as the curves lose their
flexibility and it becomes impossible to guarantee that its derivatives are continuous up to a certain
degree.
A spline made up from cubic polynomials is malleable enough to allow changes in inflexion, allowing
for good data approximation and visually smooth curves, but its formulation is simple enough to be easily
computed. Choosing cubic polynomials for the spline construction is, therefore, a good compromise
between smoothness, risk of erratic fluctuation, and complexity.

Input and conditions


The only necessary input in order to build a natural cubic spline is a set of control points through which
the spline will pass. As these control points are also the junction points between polynomials, a natural
cubic spline made up from n + 1 control points will have a total of n cubic polynomials.
As the polynomials are of the third degree, a set of n polynomials require a total of 4n coefficients
(ai , bi , ci and di , with i = 1, 2, ..., n). For the spline to be fully defined, one must therefore provide the
same number of conditions.
The fact that the spline must pass through each of the control points generates a set of 2n conditions,
namely:
P0 (x0 ) = y0

(4.5)

Pi (xi ) = Pi+1 (xi ) = yi

(4.6)

Pn (xn ) = yn

(4.7)

with i = 1, ..., n 1; Pi being a polynomial of index i; and the control points defined as (xj , yj ), with
j = 0, ..., n.
Furthermore, to guarantee the continuity of the first and second derivatives at each of the control
points, an additional 2n 2 conditions must be set:
0
Pi0 (xi ) = Pi+1
(xi )

(4.8)

00
Pi00 (xi ) = Pi+1
(xi )

(4.9)

with i = 1, ..., n 1.
Equations (4.5) through (4.9) total 4n 2 conditions, meaning that two more conditions must be set
in order to fully define the spline. These final conditions are, in the case of a natural cubic spline, the
setting of the second derivative at the endpoints to 0, that is:
P000 (x0 ) = Pn00 (xn ) = 0

48

(4.10)

Construction process
The general approach taken when constructing a natural cubic spline given a set of n + 1 points (xj , yj )
is the following (Buchanan, 2010):
For j = 0, 1, ..., n 1, each polynomial is defined as:
Pj (x) = aj + bj (x xj ) + cj (x xj )2 + dj (x xj )3

(4.11)

To guarantee that the spline passes through the control points, let hj = xj+1 xj , then:
(4.12)

Pj (xj ) = aj = yj
Pj+1 (xj+1 ) = aj+1 = Pj (xj+1 ) = aj + bj hj + cj h2j + dj h3j

(4.13)

Each polynomials first derivative is defined as:


Pj0 (x) = bj + 2cj (x xj ) + 3dj (x xj )2

(4.14)

To guarantee the continuity of the first derivative at the control points, then:
Pj0 (xj ) = bj

(4.15)

0
Pj+1
(xj+1 ) = bj+1 = Pj0 (xj+1 ) = bj + 2cj hj + 3dj h2j

(4.16)

Each polynomials second derivative is defined as:


Pj00 (x) = 2cj + 6dj (x xj )

(4.17)

To guarantee the continuity of the second derivative at the control points, then:
Pj00 (xj ) = 2cj

(4.18)

00
Pj+1
(xj+1 ) = 2cj+1 = Pj00 (xj+1 ) = 2cj + 6dj hj

(4.19)

Assembling (4.13), (4.16) and (4.19):


aj+1 = aj + bj hj + cj h2j + dj h3j

(4.20)

bj+1 = bj + 2cj hj + 3dj h2j

(4.21)

cj+1 = cj + 3dj hj

(4.22)

in which aj = yj and hj = xj+1 xj are known parameters.

49

Solving (4.22) for dj and substituting in (4.20) and (4.21):


dj =

cj+1 cj
3hj

(4.23)

aj+1 = aj + bj hj + cj h2j +

bj+1

cj+1 cj
3hj

h3j

h2j
= aj + bj hj + cj h2j + (2cj + cj+1 )
3


cj+1 cj
= bj + 2cj hj + 3
h2j
3hj
= bj + hj (cj + cj+1 )

(4.24)

(4.25)

Solving (4.24) for bj :


bj =

1
hj
(aj+1 aj ) (2cj + cj+1 )
hj
3

(4.26)

Replacing (4.26) in (4.25) (with the indexes j and j + 1):


1
hj+1

(aj+2 aj+1 )

hj+1
1
hj
(2cj+1 + cj+2 ) =
(aj+1 aj ) (2cj + cj+1 ) + hj (cj + cj+1 )
3
hj
3

(4.27)

or, re-indexing:
1
1
hj
hj1
(2cj1 + cj ) + hj1 (cj1 + cj )
(aj+1 aj ) (2cj + cj+1 ) =
(aj aj1 )
hj
3
hj1
3

(4.28)

And finally, collecting all terms involving c to one side:


hj1 cj1 + 2cj (hj1 + hj ) + hj cj+1 =

3
3
(aj+1 aj )
(aj aj1 )
hj
hj1

(4.29)

for j = 1, 2, ..., n 1.
This leaves us with n 1 equations and n + 1 unknowns (c0 , c1 , ..., cn ). Finally, setting the second
derivative at the endpoints to 0, as per equation (4.10), we have:
P000 (x0 ) = 2c0 = 0 c0 = 0

(4.30)

Pn00 (xn ) = 2cn = 0 cn = 0

(4.31)

which, together with equations (4.12), (4.23), (4.26) and (4.29), fully define all the parameters necessary
to build the spline (ai , bi , ci and di ).
Algorithm
A relatively simple algorithm to compute the process described above is the following (Buchanan, 2010):
1. INPUT {(x0 , y0 ), (x1 , y1 ), ..., (xn , yn )}.
2. For i = 0, 1, ..., n 1 set ai = yi ; set hi = xi+1 xi .
50

3. For i = 1, 2, ..., n 1 set i =

3
3
(ai+1 ai )
.
hi
hi1 (ai ai1 )

4. Set l0 = 1; set 0 = 0; set z0 = 0.


5. For i = 1, 2, ..., n 1 set li = 2(xi+1 xi1 ) hi1 i1 ; set i =

hi
i hi1 zi1
; set zi =
.
li
li

6. Set ln = 1; set cn = 0; set zn = 0.


7. For j = n 1, n 2, ..., 0 set cj = zj j cj+1 ; set bj =
cj+1 cj
.
3hj

hj (cj+1 + 2cj )
aj+1 aj

; set dj =
hj
3

8. For j = 0, 1, ..., n 1 OUTPUT aj , bj , cj , dj .


The source code of the model that deals with the generation of the backbone curve is based off of this
algorithm, and is presented in Annex B. The source code was written in the Visual Basic for Applications
(VBA) language, with the support of Excel 2010.

4.2.4

Spline integration

In order to calculate the damping ratio, it is necessary to integrate the backbone curve, as per equation
(2.10). As this model generates a backbone curve using a spline made up from piecewise polynomials,
its integration can be done analytically and using very few computing resources.
The integral function I(x) of a generic spline S(x) made up from a series of polynomials Pi (x) is the
following:
Z

I(x) =

S(x) dx =
x0

k1
X Z xi+1
i=0

 Z
Pi (x) dx +

xi

Pk (x) dx

(4.32)

xk

in which k is the index for which xk is the greatest value of xi that is smaller than x.
The integral of each cubic polynomial Pi (x) = ai + bi x + ci x2 + di x3 is:
Z

Pi (x) dx = ai (b a) +
a

ci
di
bi
(b a)2 + (b a)3 + (b a)4
2
3
4

(4.33)

Combining (4.32) with (4.33) and remembering that hi = xi+1 xi , then:

I(x) =

k1
X
i=0

ci
di
bi
ai hi + h2i + h3i + h4i
2
3
4


+ ak (x xk ) +

bk
ck
dk
(x xk )2 + (x xk )3 + (x xk )4
2
3
4
(4.34)

The integration of the backbone curve based on this formulation was incorporated into the models
code (see Annex B).

4.2.5

Error minimisation

In the model, the calculations of the error of the G and curves generated by backbone curve
are made using the the minimum squared error method. After each adjustment of the backbone curve,
51

the squared difference between the calculated values of G and and the values obtained from the
experimental data is calculated in each point, and then added together.
The model allows the user to specify an error weight to be applied to both the error in modulus
calculation and in the damping calculation (respectively wG and w ), should the user decide that the
minimisation of the error of one of the curves should should be given priority over the other.
The total calculated error, T , in each iteration is, therefore, the following:

T =

"
#2
X  G calc  G exp
X
wG

+ w
(icalc iexp )2
G
G
0 i
0 i
i
i
wG + w

(4.35)

The model uses the Excel softwares tool Solver to check and minimise this total error in each iteration, by changing the values of the backbone curves (or, which is the same, the splines) control
points.

4.2.6

Implementation into Plaxis

Introduction
As was mentioned before, the version of the finite element software that was used in this work was
Plaxis version 8. The reason for choosing this software was the fact that it is a well-known and widely
used program in the context of geotechnical engineering. While the software version used is, at the time
of writing, a bit outdated, the results are still valid, and in principle the adaptation to a newer version of
the software can be made following the same methodology.
In addition to the soil models available by default in the software some of which were analysed in
this work , Plaxis gives the user the possibility of using so-called User-Defined Soil Models (UDSM)
to incorporate custom constitutive soil models (namely stress-strain-time relationships), and use them
in conjunction with the software finite-element analysis capabilities. These UDSM allow the user to go
beyond the software capabilities and incorporate new, lesser-known, or experimental soil models into
the software and use them as if they were available on the software by default.
These models have to be programmed in a programming language such as Fortran, following a set
of defined rules and procedures, and subsequently compiled as Dynamic Link Libraries (i.e. .dll files)
and added to the softwares root directory.
The implementation of the Spline-based model as a Plaxis UDSM was developed based on the same
implementation made by Chitas (2008) for the Ramberg-Osgood model, with the necessary changes to
the programming code to incorporate the new models rules. The coding of this model was made using
the Fortran 90 programming language and compiled with Compaq Visual Fortran 6.6. The operating
system used was Windows 7 64-bit.
Due to space and time limitations, this subsection will only contain a brief description of the implementation of the model into Plaxis, with emphasis on the steps unique to this particular model. For a
more complete account of the steps used in making a User-Defined Soil Model, the author suggests

52

the reading of P. Chitas work on the implementation of the Ramberg-Osgood model into Plaxis (Chitas,
2008), as well as the Plaxis software manual (Brinkgreve et al., 2006).

Overview
As per the Plaxis software manual (Brinkgreve et al., 2006), four tasks are performed during the calculation of a UDSM:
Initialisation of the state variables;
Calculation of the constitutive stresses (through the material model at each step);
Creation of the effective material stiffness matrix;
Creation of the elastic material stiffness matrix.
The first task the initialisation of the state variables , is essential for the initialisation of the model.
While running the model, the updating of the state variables (i.e. hardening parameters), is performed
at each calculation step. At the end of each calculation step, the resulting value of the state variables is
stored and used in the next step. However, the information about the state variables from the previous
step may not be present (e.g. in the very first calculation step), and in that case the state variables have
to be initialised, which is typically done based on the actual stress state.
The second task the calculation of the constitutive stresses , is the essence of the user subroutine.
In this stage, the stress integration and correction procedures are performed in accordance with the soil
models constitutive rules.
As for the third task the creation of the effective material stiffness matrix, [D] , it defines the
models behaviour. This task is intimately connected with the second task, as the evolution of the constitutive stresses depends on the stiffness matrix. If the model is purely elastic, this matrix only contains
elastic components; otherwise, this matrix is the full elastoplastic material stiffness matrix. Note that, for
undrained behaviour, the water bulk stiffness is added separately by the software, and a bulk stiffness
for water must be specified (if not, Plaxis will input a default value).
Finally, the fourth task the creation of the elastic material stiffness matrix, [De ] , is similar in nature
to the third task. This matrix will be used when the material is under stress and strain conditions that
fall into the purely elastic domain. If the model itself is purely elastic, this matrix is equal to the effective
material stiffness matrix, i.e. [D] = [De ].
These four tasks (initialisation of state variables, constitutive rules, effective material stiffness matrix
and elastic material stiffness matrix) have to be written into the models code by the creator of the model.
The subroutine developed to use the Spline-based model with Plaxis follows these four basic tasks.
As was mentioned earlier, the subroutine used to test this model with Plaxis was based on the subroutine
developed by Chitas (2008). More information about each task can be found in P. Chitas work and in
the Plaxis user manual (Brinkgreve et al., 2006).

53

Stress and strain definition


In the Plaxis user model used to simulate the Ramberg-Osgood model behaviour, the backbone curve
definition was considered to be a function of the octahedral shear strain, oct (Chitas, 2008), as described
in Subsection 3.2.2. This model will follow the same principle. The reasons for choosing the octahedral
shear strain as the reference strain to determine the soil behaviour are the following (Chitas, 2008):
For a given infinitesimal point of soil, the octahedral shear strain is a scalar measure of the points
three-dimensional shear deformation, and therefore serves as a good characterisation of that deformation.
The model formulation assumes isotropic linear elastic behaviour. As such, if the backbone curve
is a function of the octahedral strain, the adopted formulation is guaranteed to be path-independent
and, therefore, integrable.
The octahedral constitutive relation can be expressed by:
oct = G oct

(4.36)

where oct is the octahedral shear stress.


The backbone curves formulation in this model is, based on the mentioned criteria, the following:
oct = f (oct ) = S(oct )

(4.37)

in which S(oct ) is a spline function given by:


S
S
S(oct ) = Pi (oct ) , for oct,
i1 oct oct, i

(4.38)

S
S
where Pi (oct ) represents the set of polynomials that constitute the spline and oct,
i1 and oct, i repre-

sent the set of control points that separate said polynomials.


The adopted formulation has as a consequence that the volumetric and distortional behaviours are
independent, due to the fact that it is based on the isotropic linear elastic formulation (Chitas, 2008).
This is a valid approximation only in the very small to small strain range, making the adopted Plaxis
formulation inadequate for analysis outside of this range.

Masing rule
The definition of the Masing rule was presented in Subsection 2.4.2. The main challenges in incorporating the Masing rule into the model are the detection of strain reversals, the storage of the greatest
shear strain attained (in order to maintain the stress path envelope), and the detection of unloading and
reloading situations. Once again, these topics were further explained by P. Chitas in his work (Chitas,
2008).
With the means with which to detect the location of the stress state in the backbone curve, the
implementation of the Masing rule becomes relatively straightforward. All that was needed to do was to
54

create a parameter (named masing in the routine), which takes the value 1 or 2 depending on whether
the soil state is on the backbone curve or outside it. This parameter acts in the following way:

= masing f

masing


(4.39)

emulating in this way the masing rule, as defined by equations (2.7) and (2.8).

Exporting backbone curve information to Plaxis


The Spline-based model, unlike other models such as the Ramberg-Osgood model, has a variable
number of parameters for each backbone curve. A backbone curve may be a spline made up from 10
polynomials, which have 4 10 = 40 parameters, plus the information about the 10 control points that
determine the range of each polynomial (totalling 40 + 10 = 50 parameters), while another may be a
spline made up from 30 polynomials (totalling 4 30 + 30 = 150 parameters).
As such, and because of the large amount of parameters that even the most basic splines tend to
have, it would be very impractical, and sometimes even impossible (due to software limitations), to have
the user input all the backbone curves parameters manually into Plaxis or another software.
To eliminate this problem, the model was adapted to supply the backbone curve information by itself.
As the Plaxis software was used, the Excel VBA routine was modified so that it automatically creates
the Dynamic Link Library file needed to use the model with Plaxis, containing all the needed information
to completely define the backbone curve.
The Excel VBA routine creates the Plaxis .dll file with the data values from an X 5 matrix containing
the splines control points gamma-values in the first column and the parameters ai , bi , ci and di in
the other four columns. The Plaxis subroutine then chooses the necessary parameters automatically,
depending on the current strain state in the model. All of this information is contained in the .dll file
created by the Excel VBA subroutine.
The only parameters that the user must input directly into Plaxis when using this model are the elastic
parameters, namely G0 (Parameter 1) and K0 (Parameter 2).

55

4.3

Implementation and usage

This model was implemented having as a base the Excel 2010 software and the programming language
Visual Basic for Applications (VBA). The result of the development of the model is an Excel file named
spline model.xlsm, with its associated routine.
The appearance of the Excel file developed is presented in Figure 4.2.

Figure 4.2: Appearance of the Spline-based models implementation into Excel 2010.
To use this model, the user has to input the experimental data into columns B, C, E and F (starting
from row 8). Optionally, the user can also input the value of the initial shear modulus, G0 and of the error
weights, wG and w , as per equation (4.35). Following this, to start the routine the user has to press the
Run button.
The steps that the Excel routine takes are summarised below:
1. Firstly, the routine asks the user if the values for the parameters G0 , wG and w have already been
input. If not, the routine asks the user directly for those values.
2. Following this, the routine asks the user to point to where the experimental data is located in the
spreadsheet.
3. Having chosen the location of the experimental data, the routine asks the user to choose the value
of the global resolution wanted for the spline. This value is the number of piecewise polynomials
that the spline will be made up of.
4. Following the input of the global resolution, the routine asks the user if there is some part of the
spline that the user wants to have increased resolution (i.e. local resolution). If the user answers
affirmatively, the routine will ask for the lower and upper boundaries of the part of the spline that is
to have increased resolution, and also the multiplying value. As an example, if the user chooses
the bounds 104 and 103 and a multiplying value of 5, the spline will have a density of polynomials

56

in the range from 104 to 103 that is five times that of the rest of the spline (while the polinomial
density of the rest of the spline is dependant on the global resolution chosen in 3).
5. Following this, the routine will approximate the experimental data points using generalised logistic
functions (see Section 4.2.2), showing the results to the user.
6. Having defined the analytical functions to approximate the experimental data points, the routine
will proceed to calculate the backbone curve so as to minimise the total error between the G
and curves that result from the backbone curve and the analytical curves generated in 5.1
7. Having generated the backbone curve, the model will display the results to the user (see Figure
4.3) and ask if the routine should be run again with a different resolution.
8. If the user chooses not to run the routine again, the routine will ask the user if the generated
backbone curve data (spline coefficients and control points) should be exported to a .dll file to be
used as a User-Defined Soil Model in Plaxis. If the user chooses to export the data, the routine
will ask for the user to supply the path in which the model will create the .dll file, which should then
be copied to the Plaxis root directory.
9. Having created the .dll file to be used with Plaxis, the routine will end.
The Excel VBA routine source code is presented in Annexes A, B, and C. Annex A refers to the
general routine that takes the steps described above (called Module 1). Annex B refers to the function
that deals with the generation of the spline curve, its coefficients, integral, stiffness and damping ratios,
etc. (called Module 2). And finally, Annex C refers to the routine that deals with the creation of the .dll
file to be used with Plaxis (called Module 3).

Figure 4.3: Appearance of the graphs generated by the Excel routine (backbone curve on the top, and
stiffness and damping curves on the bottom).

1 In the computer tested, this step took about one minute for a global resolution of 40, up to ten minutes for a global resolution
of 150. Typically, global resolution values of 40 are sufficient to obtain good approximations.

57

4.4
4.4.1

Results and comparison


Introduction

In this section the model will be tested, both in its ability to approximate experimental data and in the
implementation into Plaxis. As this model is very similar in scope to the Ramberg-Osgood model, special
attention will be given in comparing both models.
As such, firstly a comparison will be made with the R-O model. The ability of the Spline-based model
to emulate the R-O model will be investigated, and following this both models will be used to try and
approximate sets of experimental data analytically (i.e. without running the models through Plaxis).
Finally, to test the models implementation into Plaxis, a set of experimental points will be approximated by the model and the resulting backbone curve will be exported to Plaxis, where a simple model
will be run to check the consistency of the resulting data.

4.4.2

Comparison with the Ramberg-Osgood model

Emulation of a Ramberg-Osgood backbone curve


To compare the Spline-based model with the Ramberg-Osgood model, the first step was to investigate
the ability of the proposed model to emulate Ramberg-Osgood backbone curves. The idea for this came
from the fact that, typically, Ramberg-Osgood curves have a shape that at least in appearance looks like
it can be reasonably approximated by a Spline curve. Additionally, the motivation for this test is that, if
this ability can be proven to a reasonable degree, it follows that the proposed model has the potential to
be just as good as the Ramberg-Osgood model at approximating experimental data, since the parity at
least is guaranteed.
To investigate this possibility, several Ramberg-Osgood curves were created by changing the models
parameters (f , r , , and r). As can be seen in Figure 4.4, the backbone curves generated by the
Ramberg-Osgood model see equation (3.7) have smooth curved shapes. As such, it is intuitive
to assume that these shapes may be reasonably approximated by a spline curve, if the resolution is
sufficiently high.
In order to prove this assumption, a series of tests were made whereas Ramberg-Osgood curves with
different parameters were created, and their corresponding G and curves plotted. Following
this, from the resulting G and curves some points were extracted and used as an input for the
Spline-based model.
A sizeable amount of tests were made in order to verify the assumption made. Some of the results,
which are meant to be a representative sample of all the tests made, can be seen in Figure 4.5. The
results are divided into three pairs of graphs so that they can be more easily read. The shown data points
were extracted from the stiffness and damping curves derived from the backbone curves presented in
Figure 4.4.
The results are encouraging: in most cases the curves have a very good fit. However, as it can
be seen in the last damping ratio graph, the Spline-based model did not correctly approximate the R-O
58

Figure 4.4: Examples of Ramberg-Osgood backbone curves with varying parameters.


curve with r = 1.5, and the approximation to the R-O curve with r = 1.6 has a slightly worse fit than
average. This means that it cannot be said that the Spline-based model can emulate a R-O curve in
every situation, but based on the testing made it can be said with a reasonable amount of confidence
that it can do so in most cases.
This has an interesting consequence, which is that, in most cases, the Spline-based model has the
potential to be at least just as good at approximating G and experimental data as the R-O
model. This means that most approximations made by the R-O model can, in theory, be matched or
surpassed by the Spline-based model.

59

Figure 4.5: Stiffness and damping data points extracted from R-O curves, and respective approximations
made by running the Spline-based model (represented as lines).
It can be seen in the last graph of Figure 4.5 a behaviour of the model that tends to occur for certain
damping curve shapes: the curves are slightly wavy for strains close to the lower bound. This possibly
has to do with the fact that the spline that makes up the backbone curve is not defined in the range from
= 0 to the lower strain bound of the experimental data. This limitation has to do with the way the model
is implemented, as the backbone curve is only defined in the strain range that contains the experimental
data points.
The limitation can possibly be eliminated, or its consequences minimised, by adapting the model
to provide an added definition for the backbone curve in the range between the experimental lower
boundary and = 0. This approach wasnt followed due to the fact that it would be fairly time-consuming
to implement, and also because this behaviour doesnt have any major practical consequences. This
is because damping values for low strain values do not have any appreciable effect on the overall soil
behaviour, especially when considering an earthquake scenario where the soil is subjected to a wide
range of straining values. Additionally, if one does not wish for this wavy behaviour to happen in the lower

60

bound of the experimental data, there is a way to avoid it: the user simply has to provide an additional
virtual experimental point for a lower value of strain, which is where the wavy behaviour will happen. The
wavy curve will still be there, but it will not be present in the required strain range.

Approximation to experimental data


In order to compare both models more accurately, they were tested in the presence of experimental
data from Vucetic and Dobry (1991). In Figure 4.7 the results of approximating both models to the
experimental data points are presented.
The approximation regarding the Spline-based model was made using the developed Excel VBA
routine. On the other hand, the calibration of the R-O parameters to approximate the experimental data
was made using a bi-logarithmic regression, as proposed by Ueng and Chen (1992).
As it can be seen from these results, both models approximate the results in a very similar manner.
These results indicate that, at least for these sets of experimental points, both models perform similarly,
even with the theoretical added flexibility of the Spline-based model.

Figure 4.6: Experimental stiffness data points extracted from the empirical curves by Vucetic and Dobry
(1991), and respective approximations made by running the Spline-based model and by adjusting the
coefficients of R-O backbone curves.
It may be the case, seeing as the spline curve adapted itself into a shape that is very similar to
a R-O curve shape, that the ideal smooth backbone shape configuration that best adapts to the typical stiffness and damping logarithmic experimental points is one that can be well approximated by a
Ramberg-Osgood backbone curve. That being the case, it is natural that the Spline-based model, as it
converges on a solution, starts to take on a shape similar to that of a R-O curve, which results in stiffness
and damping curves that are themselves similar (as can be seen in the results obtained).

61

Figure 4.7: Experimental damping data points extracted from the empirical curves by Vucetic and Dobry
(1991), and respective approximations made by running the Spline-based model and by adjusting the
coefficients of R-O backbone curves.

4.4.3

Results using experimental data

The developed model was tested using data points extracted from some well known empirical curves by
Vucetic and Dobry (1991) and Darendeli (2001). These curves are normally used as a replacement for
soil analyses when experimental data is not available. The amount of points extracted from the curves
was not exhaustive, since the analytical approximation of the experimental points can be done just as
accurately with a few well-distributed points as with several points (see Section 4.2.2).
The curves by Vucetic and Dobry (1991) were used to evaluate the Spline-based models behaviour
for increasing Plasticity Indexes (see Figure 4.8), while the curves by Darendeli (2001) were used to test
the model for increased confining pressures (see Figure 4.9).
Every model was run with a value of the initial shear modulus equal to G0 = 10 MPa. This value
has no influence on the shape of either the G/G0 curve or the curve. The initial shear modulus
only affects the backbone curve as a multiplier, i.e. for the same experimental points, the model run
with G0 = 10 MPa will have a backbone curve that has the same shape as the same model run with
G0 = 5 MPa but multiplied by a factor of 2. Every set of experimental points was therefore run with the
same value of G0 for comparison purposes.
It can be seen that, when approximating some sets of experimental points, the model has some
trouble approximating the damping ratio points for low strains. The observable effect is the undervaluation of the damping ratio for lower strains and a slightly wavy behaviour of the damping ratio and shear
modulus curves for very small strains (which was explained previously). However, as can be seen in
Chapter 5, this does not seem to have any major implication in an earthquake motion analysis, possibly
because the damping at very small to small strains does not have a major influence on the observed
accelerations at ground surface. On the other hand, at higher strains the model seems to overvalue the

62

Figure 4.8: Stiffness and damping data points extracted from the empirical curves by Vucetic and Dobry
(1991), and respective approximations made by running the Spline-based model (represented as lines).
Corresponding Spline backbone curves presented above.

Figure 4.9: Stiffness and damping data points extracted from the empirical curves by Darendeli (2001),
and respective approximations made by running the Spline-based model (represented as lines). Corresponding Spline backbone curves presented above.

63

stiffness modulus ratio while improving its approximation of the damping ratio points.
In Figure 4.8 it can be seen that the model seems to approximate the empirical data points for lower
Plasticity Indexes better than for higher PI. Additionally, Figure 4.9 seems to suggest that the model also
behaves better for lower confining pressures, but in this case the results are less conclusive.

4.4.4

Cyclic loading simulation with Plaxis

As was done with the analysed existing soil models in Chapter 3, the Spline-based model was also
subjected to a Plaxis cyclic loading test. As with the analysed soil models, the Plaxis model tries to
simulate a perfect direct shear test, and the geometry and boundary conditions are the same as were
previously used.
A description of the models specific characteristics will be made now. Much of the remarks regarding
the Ramberg-Osgood models use with Plaxis made in Subsection 3.2.2 are also valid for this model,
seeing as the implementation into Plaxis was done in the same way.
The backbone curve definition used to test the model with Plaxis corresponds to the empirical curve
by Vucetic and Dobry (1991) for PI = 15 (see Figure 4.8). This curve was chosen because the model
approximated the experimental points to a good degree. However, any other curve could have been
chosen, since this Plaxis test serves to check the models implementation in the software, and therefore
to check if the resulting stiffness and damping points from Plaxis match the values from the generated
curves in the Excel routine.
The information about the backbone curve was exported to Plaxis using the developed Excel routine,
as was explained in Subsection 4.2.6.
Loading conditions:
Loading characteristics:
Type of loading: harmonic prescribed displacement (sine function):
Number of tests: 13
Amplitude variable:
Minimum amplitude: Amin = 0.0001 m (corresponding to = 105 )
Maximum amplitude: Amax = 0.1 m (corresponding to = 102 )
f = 0.01 Hz or = 0.0628 rad/s
Phase angle: = 0
Duration of loading: t = 125 s (i.e. 1.25 cycles)
Material characteristics:
Material model Spline-based model - Vucetic backbone curve for PI = 15 (User-Defined Soil
Model).
Material parameters:
Parameter 1 G0 = 10000 kPa
Parameter 2 K0 = 26000 kPa
64

Additional information:
So as to simulate a simple shear test, the soils self-weight multiplier was set to zero. This avoids
problems such as dynamic effects and initial stresses influencing the model results.
Plaxis calculation tool-specific relevant parameters more information can be found in the Plaxis
manual (Brinkgreve et al., 2006):
Calculation type = Dynamic analysis
Number of calculation phases = 1
Additional steps = 300
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps = 1
Results:
The shear strainshear stress paths obtained by running the model for different shear strain amplitudes are presented in Figure 4.10. The results pertain to a calculation node situated approximately in
the upper boundary of the soil model.
In Figures 4.11 and 4.12 the shear modulus ratio (G/G0 ) and damping ratio () values calculated
for each of the tests made with the Spline-based model are compared with the corresponding curves
obtained with the Excel routine and with the experimental points that were at the basis of the model
(Vucetic and Dobry, 1991).
The damping values were obtained by calculating the area of each tests hysteresis loop, and subsequently using equation (2.4) to determine the damping ratio. The stiffness values were calculated
directly from the obtained values of the stress path.
The results show that the models implementation into Plaxis was successful. The hysteresis loops
from the stress paths in Figure 4.10 coincide to a good degree with the backbone curve obtained from
the Excel VBA routine. Additionally, the resulting stiffness and damping points from each of the tests
made are also approximately coincident with the corresponding curves from the Excel VBA routine, in
Figures 4.11 and 4.12.
Naturally, the coincidence is not perfect, which can be attributed to small errors that are natural to
occur in the finite element calculation (for example, if the calculation step is not small enough), or, in the
case of the damping ratio calculation, errors that may come from the calculation of the hysteresis loops
area (which is always an approximation since the loop is formed by discrete points).

65

Figure 4.10: Shear strainshear stress paths obtained from the tests made to the Spline-based model,
for different strain amplitudes; and backbone curve calculated with the Excel VBA routine.

Figure 4.11: Shear strainshear modulus ratio curve obtained from the Excel VBA routine and corresponding points calculated from each of the tests made with the Spline Plaxis model, and original
experimental points from the empirical curve by Vucetic and Dobry (1991).

66

Figure 4.12: Shear straindamping ratio curve obtained from the Excel VBA routine, corresponding
points calculated from each of the tests made with the Spline Plaxis model, and original experimental
points from the empirical curve by Vucetic and Dobry (1991).

4.5

Model limitations and workarounds

In this section some limitations of the model will be mentioned, along with their relevance, relative importance and, when possible, workarounds to minimise their consequences.
One limitation of this model is that it is only capable of establishing the shape of the backbone curve in
the strain range given by the experimental data. That is, if, for example, the input experimental data has
values in the strain range from 104 to 102 , the backbone curve will only be defined in that range. This
can be clearly seen in Figure 4.8. For lower values of strain lower than the lower bound of experimental
values, the backbone curve is linear between the point of zero strain and the first point of the spline. This
limitation can, however, be easily surpassed by the creation of virtual experimental points outside of the
experimental strain range. In fact, the model already automatically defines conditions for the extremely
small strain range (namely, for = 1010 ), where it assumes that G/G0 = 1.00 and = 0.
Another limitation is that not every experimental set of G and results can be well approximated by a spline-based backbone curve. Even with high spline resolutions (e.g. > 100 constituting
polynomials), which confer more flexibility to the spline, some experimental results simply cannot be
well approximated by a backbone curve of this shape, as was seen in Section 4.4. Specifically, as was
observed in Subsection 4.4.3, the model sometimes has difficulty in approximating the damping ratio values for lower strains, while behaving much better for higher strains. In order to understand why this is, it
is important to remember that, since the damping ratio depends on the area of the hysteretic loop, and
this area in turn depends on the integral of the backbone curve, in essence the damping ratio is directly
dependent on the integral of the backbone curve. At the same time, since the damping ratio curves are
expressed in a logarithmic scale, the lower strain points are much closer together on the backbone curve

67

than the higher strain points. It is therefore intuitive to think that a change in the shape of the backbone
curve for lower strain values has a lower effect on the integral of the curve, since the points are packed
more closely together, than in the higher strains, where a small change in the backbone curve shape
can have a significant effect on the integral of the curve. Therefore, in order to make a change in the
damping ratio for lower strain values equal to that of the higher strain values, the backbone curve has to
change its shape significantly more, which may compromise the shape of the shear modulus reduction
curve. This is why, for some shapes that are of higher difficulty for the model to approximate, it is to
be expected that the values that will be the most sacrificed are the damping ratio values for low strains.
This limitation is always going to be a problem when using the model to approximate specific kinds of
curves that are of harder approximation. However, if one considers an application of this model to a
more realistic scenario, such as an earthquake loading, this limitation becomes less important. This is
because the effects of damping for lower strains are, naturally, less important to model the overall soil
behaviour than the effects of damping for higher strain rates (and, consequently, higher damping rates).
A third limitation of this model is the fact that it is virtually impossible to establish empirical relationships between the models parameters and measurable soil characteristics, such as Plasticity Index or
clay content. It is easy to see why: with the splines generated by this model having upwards of a hundred parameters, any attempt to correlate them with specific soil characteristics would be a massive and
ineffectual task. This models parameters must therefore remain conceptually removed from the soils
measurable characteristics.
Finally, the results from the tests made seem to point towards the fact that the Spline-based model
and the Ramberg-Osgood model produce very similar results in most circumstances. This may mean
that the increased flexibility inherent to the developed model may not have a practical increase in the
accuracy of the results, when comparing with the results from the R-O model. This will be explored
further in the next chapter.

4.6

Possible applications

This model is very similar to the already analysed Ramberg-Osgood model. As such, their respective
ranges of application are essentially the same. This model is appropriate to simulate soil behaviour
under cyclic loading for small to medium strains, at it correctly models the reduction of stiffness and the
increase of damping with increasing strain amplitude, while remaining cycle-independent.
This model does not incorporate soil failure, as it will allow for ever increasing shear stresses being
applied for the soil. As such, the model should not be used in a geotechnical context in which the soil
is expected to be taken to very high strain rates. The model also does not account for (accumulated)
volumetric straining and the subsequent changing of the soils response with the successive application
of loading cycles, which starts to manifest itself for higher strain levels.
This model also does not incorporate isotropic hardening, and as such should not be used in a
context where this behaviour is a significant part of the soils expected behaviour.

68

4.7

Possible improvements

The author considers that the implementation of this model should be perceived as a proof of concept,
and not as the only or best way to implement and use the theory behind the model in soil analyses. That
is to say, the aim of the creation of this model, and its implementation, is firstly to show that a model
following these rules can be developed, and secondly to evaluate its practical results and compare them
with other models.
As such, even if in the course of this models creation and implementation some paths in which the
model may have been improved or streamlined were identified, sometimes due to time limitations they
were not explored or followed up on. Some of these prospective improvements are mentioned in this
section, and the author strongly encourages interested parties to improve the tool by following these or
other paths of development:
The tool used to adjust the backbone curve is the Solver function available in Excel. Perhaps the
use of other tools, incorporated into the source code itself, might make the model more efficient.
While the developed model was implemented in Excel with the VBA programming language, other
programming languages might prove more efficient in executing the algorithm behind the model.
While the approximation to experimental data with generalised logistic functions is, for the most
part, very accurate, other analytical curves might prove to be even more accurate for a wider
range of different soils.
As both the stiffness and the damping curves are directly dependant on the formulation of the
backbone curve, which is analytically defined in its domain, it might be interesting to investigate
the possibility of implementing the model routine in a completely analytical fashion (i.e. without
having to resort to numerical approximations and error minimisations).
The backbone curves generated by the model routine are only defined in the strain range given
by the experimental data points, which seems to cause a wavy behaviour of the damping curve
at very small strains. It may therefore be interesting to try and solve this problem by providing an
added definition for the backbone curve in the strain range from = 0 and the lower bound of the
damping experimental data.
The model uses the Masing rule to model the unloading and reloading paths, which is just an
approximation to the real soil behaviour. Perhaps modelling these paths in some other manner
might improve the ability of this model (and other models) to approximate experimental data.
Related to the previous point, the modelling of the unloading and reloading paths (and also of the
first loading path) could be done using experimental points from hysteretic loops, possibly with the
help of spline curves.

69

Chapter 5

Site response simulation


5.1

Introduction

Having developed the Spline-based model in Excel and successfully tested its incorporation into Plaxis,
the interest arose in applying the model to a more complex scenario, to gauge its usefulness in a more
realistic geotechnical context. The idea of a comparison with the other analysed soil models also surfaced as a way of further testing the model. To this effect, the idea came about to use existent data from
a known earthquake event to cross-check with a simulation made with Plaxis using the analysed models
for an one-dimensional ground response analysis.
The earthquake chosen was the Loma Prieta earthquake of 1989. This earthquake happened in
California, U.S.A., on October 17, 1989, at 5:04 PM local time, and was felt from Monterey to San
Francisco. The earthquakes epicentre was near the Loma Prieta peak and registered a magnitude of
6.9 in the Richters scale. A total of 63 people were killed in this earthquake, and it costed an estimated
$6 000 million to $10 000 million in property loss (Page et al., 1999).
The main reason this earthquake constitutes an interesting target for a finite element test of the
developed model is that a good amount information could be found in the literature both regarding
the soils characteristics and the earthquake ground motion records. The information about the soils
characteristics is essential to be able to run the developed model and the earthquake ground motion
records can be used both to simulate the earthquake in Plaxis and to compare with the obtained results.
In this chapter, Plaxis models will be made that try to simulate the geology of the ground motion
record site, using the analysed constitutive soil models, including the Spline-based model. Data from the
soil layers stiffness and damping curves and elastic parameters will be used to calibrate each models
parameters for each soil layer. Then, a one-dimensional soil analysis will be made by inputting a ground
motion record from the site measured in a rock outcropping (as a good approximation to the ground
motion at the sites bedrock layer) with the computed models. The results of the one-dimensional Plaxis
analyses with the soil models will then be compared between themselves, with the results from a linearequivalent earthquake analysis program, and with the ground motion records measured at the earthquake site in soil.

70

5.2

Important concepts

Time domain versus frequency domain


One of the most intuitive methods to represent a vibratory motion such as an earthquake consists in
making a graph showing the evolution of a measurable parameter that represents the motion (e.g. the
acceleration) in the time domain. In such a graph the earthquake event can be easily and quickly
understood: it becomes obvious when the earthquake had the strongest amplitudes, when it increased
or decreased in power, etc.
However, in many engineering scenarios it is often more useful to plot the earthquake motion in the
frequency domain. In the XIX century, J.B.J. Fourier showed that any periodic function under certain
circumstances can be expressed as a sum of harmonic functions (e.g. sine functions) with different
amplitudes, frequencies, and phase angles. This sum of harmonic functions is itself a function, and it is
commonly called a Fourier series. A Fourier series can be expressed by (Kramer, 1996):
f (t) = a0 +

(5.1)

(an cos n t + bn sin n t)

n=1

where n = 2n/Tf is the angular frequency of each constituent harmonic function, Tf is the period of
f (t), and a0 , an and bn are the Fourier coefficients:
1
Tf

2
Tf

2
bn =
Tf

a0 =
an =

Tf

f (t) dt
0
Tf

f (t) cos n t dt
0
Tf

f (t) sin n t dt
0

Alternatively, equation (5.1) can be expressed as:


f (t) = c0 +

(5.2)

cn sin(n t + n )

n=1

where c0 = a0 is the average value of f (t) over the range from t = 0 to t = Tf , cn =

p
a2n + b2n is the

amplitude of the nth harmonic, and n = tan1 (an /bn ) is the phase angle of the nth harmonic.
The decomposition of a vibratory motion into a Fourier series has several useful applications. For
example, in linear systems it is often much easier to compute changes to the constituent harmonic
functions and then add them together than it is to compute the changes directly from the original motion.
Another useful application of this methodology in the context of earthquake engineering is the possibility
to express an earthquake motion as a function in the frequency domain. This function is typically a
plot of cn (amplitude) versus n (frequency), or a Fourier amplitude spectrum. A Fourier spectrum is
of great interest in the context of earthquake engineering because it can easily show what range of
frequencies an earthquake is most rich in. This information can be used, for example, to compare with
the frequencies that overlying structures are most susceptible to, and gauge the damage that a given
earthquake will cause to such structures.

71

Transfer and amplification functions


A transfer function is a useful tool used in the context of ground response analyses. This function
expresses the relationship between the motion at two different points. Typically, transfer functions are
used to measure the relationship between the ground motion at a specific point located somewhere in
the surface layers and the motion at the top of the bedrock layer, located below the surface layers.
Transfer functions are expressed in the frequency domain, and they determine how each frequency
in the input motion is amplified, or de-amplified, by the soil deposit (Kramer, 1996). They are an essential
tool to assess the characteristics of a soil deposit in an earthquake scenario, since a transfer function is
only dependant on the soil material characteristics.
Analytical transfer functions for idealised geotechnical scenarios are commonly used in earthquake
engineering practice (Kramer, 1996). These can range from the very simple, which represent only the
most basic effects of soil deposits on ground motion but do so with relative mathematical simplicity, to the
more complex, which are able to describe the most important aspects of ground response, albeit with
increased mathematical complexity. Note that, since the use of transfer functions relies on the principle
of superposition, they can only be used when analysing linear systems (Kramer, 1996).
In many cases it is more useful to analyse cyclic behaviour using amplification functions instead
of transfer functions. An amplification function is defined as being simply the modulus of the transfer
function.

One-dimensional ground response approximation


The genesis of a seismic event typically occurs at great depths below the ground surface. From the
source of the event the seismic waves travel in all directions through the terrain, which, at those depths,
is typically made up from very stiff materials (generally rock). As the waves approach the surface, the
quality of the terrain, in most cases, starts to diminish, and the waves have to travel through progressively
less stiff materials. Since the wave propagation velocities are directly dependant on the stiffness of the
materials through which they are passing, this means that the seismic waves slow down progressively as
they reach the surface. This slowing down of the seismic waves generally causes them to be refracted
into a more vertical direction (Kramer, 1996). An example of a typified earthquake scenario where this
process is illustrated can be seen in Figure 5.1.
The process described above can be approximated to a reasonable degree by a so-called onedimensional approximation. The approximation consists in assuming that the earthquake site is level
and that the superficial soil layers are parallel to each other and are situated above a semi-infinite
homogeneous bedrock layer. In this scenario, of the three dimensions that are present in an earthquake
event, only the vertical direction is considered to influence the earthquake behaviour. In such a case,
the only variables of interest are the layer material characteristics, and their width and relative position.
This approximation is used to gauge the effects that the upper layers of soil have on the seismic
waves. This is very important because the uppermost soil layers can have a significant impact on the
magnitude and frequency distribution of the waves that reach the surface, which in turn affects the

72

consequences of the earthquake. However, the use of this approximation is only valid in some specific
scenarios: it is only meaningful when modelling level or approximately level sites with parallel material
boundaries (Kramer, 1996). If attempting to model sites with different characteristics using this method,
one can incur in grave underestimations, since other effects may occur that the model does not account
for (e.g. valley effects).

Figure 5.1: Example of the path taken by the seismic waves in a typified earthquake scenario. Source:
Kramer (1996).
Equivalent-linear approximation
As was described to a significant degree in this work, for strains over the very small range soil behaviour
under increasing strain is known to be non-linear. This means that the stiffness of the soil tends to
decrease with strain and material damping tends to similarly increase.
This poses a problem when dealing with earthquake soil analysis using linear methods (e.g. analytical transfer functions). These methods, as the name implies, assume that the soil exhibits linear
behaviour, and as such are inadequate to represent the non-linearity that is observed in soils for most
strain ranges. To circumvent this problem, the linear approach can be modified so that it deals with
equivalent linear soil properties, instead of using elastic soil properties. Typically, the secant shear modulus is used as the equivalent shear modulus, and the equivalent damping ratio is such that it produces
the same energy loss in a cycle as the actual hysteresis loop (Kramer, 1996).
However, the choice of the values to use for the equivalent linear soil properties have to be consistent
with the level of strain that is attained in each layer. This attained strain level is estimated based on the
peak shear strain amplitude reached in the earthquake loading. As values at or near the peak strain
amplitude are only reached a few times on the ground motion record, the effective shear strain used to
evaluate the equivalent linear soil properties is often taken as 65% of the peak strain (Kramer, 1996).
As the computed strains depend on the equivalent linear properties, an iterative approach is needed
to have the method converge to the appropriate values of effective strain and equivalent linear material
properties. This iterative procedure follows these steps (Kramer, 1996):
1. Initial estimates of G and are made for each layer (typically, the elastic or low-strain values).
2. The estimated G and values are used to calculate the ground response, most importantly the
maximum shear strain in each layer.

73

3. The effective shear strain in each layer is calculated from the maximum shear strain by using a
reducing factor (e.g. 65%).
4. Based on the calculated effective shear strain, new equivalent linear values are chosen for the next
iteration.
5. Steps 2 and 4 are repeated until the difference between equivalent linear properties in successive
iterations fall below a predetermined value.
It is important to note that this methodology has an intrinsic error associated with it, which stems
from the fact that it analyses the soil in a linear manner (even though it tries to approximate non-linear
behaviour by using equivalent parameters). This method is then incapable of representing the changes
in soil stiffness that occur during an earthquake, and as such may be inadequate to analyse complex
soil deposits or to model complex soil-structure interactions in finite element programs.
This equivalent-linear method is used to model one-dimensional ground response of layered sites
in a popular computer program called SHAKE, or in an Excel routine named EERA (Equivalent-linear
Earthquake site Response Analysis).

5.3

Ground motion records

Information was found about the acceleration time series of the Loma Prieta earthquake as measured
in several seismically instrumented sites. Two sites that are of particular interest in the context of this
analysis are called the Gilroy #1 and Gilroy #2 sites. These relate to two instrumented sites in the Gilroy
area, which is located near to the earthquakes epicentre. The Gilroy #1 instrumented site is located in a
rocky outcropping and the Gilroy #2 instrumented site is located in a soil deposit for which soil analyses
were made and information about the soils characteristics in depth is available in the literature.
The East-West acceleration time series for both sites are presented in Figures 5.2 and 5.3. These
will be the acceleration time series used in the Plaxis simulations. Note that the East-West components
were chosen arbitrarily, as any of the records other components could have been used instead.

74

Figure 5.2: Acceleration time series for the East-West component of the Gilroy #1 (rock) ground motion
record.

Figure 5.3: Acceleration time series for the East-West component of the Gilroy #2 (soil) ground motion
record.

5.4

Soil characteristics

In addition to ground motion record data, information about the soils characteristics on the site is essential to be able to test the soil models. Namely, information is needed about the width of the soil layers,
stiffness and damping behaviour with increasing strain for each layer, and elastic soil parameters.
Note that the developed model can be used with empirical curves available in the literature (Vucetic
and Dobry, 1991; Ishibashi and Zhang, 1993; Darendeli, 2001), but for this specific test it was important
to have specific information about the soils on site so as to more accurately judge the results of testing
each of the models.

75

Information was found in Andrade and Borja (2006) regarding both the elastic soil parameters and
the stiffness degradation and damping curves for the soil layers down to the bedrock layer, for the Gilroy
#2 site. These are presented, respectively, in Figures 5.4 and 5.5.
The local geotechnical profile at the Gilroy #2 site consists of sands and clays up to a depth of 40 m.
Beyond 40 m is a deposit of gravel underlain by weathered bedrock at about 170 m depth (Andrade and
Borja, 2006).
Note that the curves in Figure 5.5 represent the mean of the values measured on site. The information about the statistical variation of these curves was omitted in this work, as only the mean values
were used in the testing of the developed soil model, but it is important to have in mind that these are
only approximations of the actual measured characteristics of the soil on site.

Figure 5.4: Initial/elastic shear modulus Ge = G0 for the soil layers at the Gilroy #2 site, obtained from
tests made for soil from the site, down to the assumed bedrock layer. Source: Andrade and Borja (2006).

Figure 5.5: Stiffness degradation and damping curves (mean values) for the soil layers for various depths
at the Gilroy #2 site, obtained from tests made for soil from the site. Source: Andrade and Borja (2006).

76

5.5

Approximation using the Spline-based model

For the modelling of the soil site in Plaxis, based on the experimental data from Andrade and Borja
(2006), six different homogeneous soil layers were considered. The layer configuration and corresponding elastic parameters used are the following (based on the information from Figure 5.4):
Layer 1: H = 0 12 m, G0 = 65 MPa
Layer 2: H = 12 24 m, G0 = 430 MPa
Layer 3: H = 24 40 m, G0 = 220 MPa
Layer 4: H = 40 82 m, G0 = 860 MPa
Layer 5: H = 82 98 m, G0 = 530 MPa
Layer 6: H = 98 170 m, G0 = 1050 MPa
These elastic parameters, together with data points extracted from the curves presented in Figure
5.5, were used as input for the Excel VBA routine to generate spline backbone curves.
The results of running the Excel VBA routine are presented in Figure 5.6. Note that the stiffness and
damping curves are the same for the layers below 40 m but the backbone curves are not, since the latter
also depend on the elastic parameters of each layer, namely the initial shear modulus, G0 .
It can be noted that the model did not approximate to a good degree the damping ratio for lower
strains ( < 104 ). This is a model limitation that was explained in Subsection 4.5, but, as was mentioned
in said subsection, this inaccuracy in the lower damping values is not as important as an eventual
inaccuracy in the higher damping values (which is not the case). This means that the model should
provide good results regardless of this imprecision.

Figure 5.6: Stiffness and damping data points extracted from the experimental curves by Andrade and
Borja (2006) for the Gilroy #2 site, and respective approximations made by running the Spline-based
model (represented as lines). Corresponding Spline backbone curves presented above.
77

5.6

Approximation using other models

So as to compare the developed model with the analysed existing soil models, the experimental soil
data obtained from the earthquake site was also approximated using said models. The following models
were used: the linear elastic model, the Mohr-Coulomb model and the Ramberg-Osgood model.
The Hardening-Soil model was not used for this purpose due to the relative complexity of trying to
calibrate its parameters to approximate the stiffness and damping curves. Additionally, due to the fact
that this model did not differ to any significant degree from the Mohr-Coulomb model with regard to the
stiffness and damping curves, the need to analyse both in this context was not very significant.

5.6.1

Linear elastic model

For the linear elastic model, the elastic parameters of the soil, as defined in Section 5.4, were used.

5.6.2

Mohr-Coulomb model

The approximation using the Mohr-Coulomb model was made assuming constant shear strength with
depth and the elastic range governed by the elastic parameters of the soil, as defined in Section 5.4.
As for the yield parameter f = c, it was chosen so that the analytical values of G/G0 and given by
equations (3.25) and (3.26) approximated as well as possible the experimental values. Note that, by
choosing this methodology to approximate the stiffness and damping curves, the obtained values may
be lower than what would be expected of a Mohr-Coulomb definition of the soil site using typical values
for c and (especially at higher depths and confining pressures). The values of c obtained are as follows:
Layer 1 (h = 0 12 m): c = 41.8 kPa
Layer 2 (h = 12 24 m): c = 291.7 kPa
Layer 3 (h = 24 40 m): c = 257.9 kPa
Layer 4 (h = 40 82 m): c = 425.8 kPa
Layer 5 (h = 82 98 m): c = 262.4 kPa
Layer 6 (h = 98 170 m): c = 519.9 kPa
The resulting backbone curve and stiffness and damping curves are presented in Figure 5.7.

5.6.3

Ramberg-Osgood model

For the Ramberg-Osgood model, the calibration of the parameters was made using a bi-logarithmic
best-fit regression method, as proposed by Ueng and Chen (1992). The Ramberg-Osgood parameters
determined in this fashion for each layer are the following:
Layer 1 (H = 0 12 m): G0 = 65 MPa, r = 0.154, f = 10.0 MPa, = 16361.7, r = 2.50
Layer 2 (H = 12 24 m): G0 = 429 MPa, r = 0.233, f = 100.0 MPa, = 10000.0, r = 2.45
Layer 3 (H = 24 40 m): G0 = 220 MPa, r = 0.182, f = 40.0 MPa, = 1623.9, r = 2.24
Layer 4 (H = 40 82 m): G0 = 860 MPa, r = 0.129, f = 110.9 MPa, = 95000.0, r = 2.66
Layer 5 (H = 82 98 m): G0 = 530 MPa, r = 0.129, f = 68.4 MPa, = 95000.0, r = 2.66
Layer 6 (H = 98 170 m): G0 = 1050 MPa, r = 0.129, f = 135.5 MPa, = 95000.0, r = 2.66
The resulting stiffness and damping curves are presented in Figure 5.8.
78

Figure 5.7: Approximation of the stiffness and damping curves for the Gilroy #2 site made using the
Mohr-Coulomb model. Corresponding backbone curves presented above.

Figure 5.8: Approximation of the stiffness and damping curves for the Gilroy #2 site made using the
Ramberg-Osgood model. Corresponding backbone curves presented above.

79

5.7

Plaxis simulation

5.7.1

Overview

The modelling of the earthquake simulation in Plaxis was made assuming a one-dimensional site characterisation. The way to model this is to create a geometry in Plaxis that is much longer than it is wide,
which has as a consequence that the natural interferences felt at the side boundaries are not felt at the
middle of the geometry, from where the results are extracted.
Essentially, in order to correctly model the situation on site, the model has to contain soil layers in
sufficient amount, up to a depth that in which the soil can be considered to be bedrock. It is necessary,
in this case, to know the approximate location of the bedrock layer and the characteristics of the soil
down to that layer, as the input motion used was measured in a rock outcropping near to the site. It
can be assumed that the rock outcropping seismic motion is the same that the bedrock seismic motion,
if one assumes the simplification that the rock outcropping has characteristics similar to the bedrock
layer, and a sufficiently high stiffness to propagate the seismic waves from the bedrock layer depth to
the outcropping ground surface without significant changes in the wave motion.

5.7.2

Plaxis calibration

Unlike what happened for the simple, idealised tests that were done earlier in this work to test the
fundamental behaviour of the analysed constitutive models, an earthquake simulation in Plaxis has to
be done with much more care as to the calibration of the software itself.
This need for increased care with the calibration of the finite element software is in a large part due
to one specific characteristic that changes between the earlier, idealised tests, and a more realistic onedimensional earthquake simulation: dynamic mass behaviour. Whereas in the simple shear tests done
previously the soil was assumed to be massless (because only the internal soil stress and strain properties that happen as a response to the external loading were of interest), in an earthquake simulation
the soil has to be modelled as having mass so that the full dynamic effects that occur in the soil in an
earthquake scenario can be accurately simulated.
The simple fact of considering the mass in the soil analysis means that several otherwise somewhat
unimportant parameters become very important, and as such their configuration has to be approached
carefully and with full conscience of its implications in the overall model results. To calibrate the Plaxis
simulation so as to guarantee that the earthquake simulation is as accurate as possible, the following
steps were taken:
The model dimensions and mesh refinement were chosen so that the model simulates a onedimensional case as accurately as possible.
A comparison was made with the equivalent linear one-dimensional earthquake analysis tool
EERA for a simple elastic scenario, to gauge the performance of the finite element software.
Newmark time integration parameters were chosen so that no numeric time integration damping is
felt.
80

Rayleigh damping parameters were chosen to compensate for the lack of radiation damping in the
model, and to provide some damping when the strain levels are still small.

Model dimensions and mesh refinement


In order for the model to simulate accurately a one-dimensional earthquake motion scenario, its dimensions have to be chosen such that the influence of the side boundaries do not affect the response at the
middle of the model. This can be achieved by choosing the dimensions so that the length of the model
is several times that of its height.
For this reason, and seeing as the model needs to ha have a height of 170 meters to fit the measured
soil layers, the dimensions chosen for the model were 170 m 3000 m, as is illustrated in Figure 5.13.
The models finite element mesh was set to coarse, and a strip of 200 m in the middle of the model
was refined up to the maximum allowed by the software. A further refinement would have been preferred,
and also a wider refined band at the middle, but in the first case the Plaxis software would not allow for
more refinement and in the second case the total calculation time was found not be viable.
In fact, it is important to note that the chosen refinement may influence the correct modelling of the
seismic waves. Experience demonstrates that, to achieve good precisions, it is convenient to have about
8 to 10 finite elements in a single wavelength (Lemos, 2011). The maximum wave frequency that will be
accurately calculated by a finite element mesh can be expressed by:
fmax =

vs
vs
=
min
8 Delem

(5.3)

in which fmax is the maximum frequency for which a mesh made up from elements with size Delem and a
material with shear wave velocity vs will perform accurate calculations.
Considering each layers shear wave velocities (calculated using the elastic parameters and soil
weights), and the average size of the elements in each layer (which is exemplified in Figure 5.9), a
prediction of the maximum frequency that can be accurately calculated can be made:
Layer 1 (vs = 185.2 m/s, Delem 3 m): fmax = 7.7 Hz
Layer 2 (vs = 452.5 m/s, Delem 6 m): fmax = 9.4 Hz
Layer 3 (vs = 323.7 m/s, Delem 8 m): fmax = 5.1 Hz
Layer 4 (vs = 640.0 m/s, Delem 7 m): fmax = 11.4 Hz
Layer 5 (vs = 502.4 m/s, Delem 6 m): fmax = 10.5 Hz
Layer 6 (vs = 707.1 m/s, Delem 7 m): fmax = 12.6 Hz
The maximum frequencies dictate that the frequency spectrum results for frequencies above these
levels have to be taken with the knowledge that the finite element calculation may be incorrect. Fortunately, these are high enough so that a good part of the frequency spectrum and in which earthquakes
are typically richer can be accurately simulated by Plaxis.

81

Figure 5.9: Close-up of the finite element mesh at the refined band in the center of the Plaxis model
(which simulates the one-dimensional earthquake approximation).
EERA comparison
Having chosen the model dimensions, in order to guarantee that Plaxis could correctly simulate the
basic characteristics of a one-dimensional earthquake scenario, a simple model was created in Plaxis
and replicated in the EERA program.
As was mentioned earlier in this chapter, EERA is an Excel-VBA tool that uses the equivalent-linear
method to do a one-dimensional earthquake analysis. The inputs required are an acceleration time
series and the single or multi-layered soil characteristics of the simulated terrain, including height of
each layer.
The model that was used for this simple test consists in a single layer made up from a linear elastic
material with the following material parameters:
G = 50 MPa
d = 20 kN/m3
vs = 156.6 m/s
H = 170 m
The signal is then applied to the bottom of the layer, simulating a terrain overlaying a rigid bedrock
layer. In this test the Gilroy #1 signal was used, since that is the signal that will be used in the earthquake
simulation.
This simple model can be described by the transfer function of ground motion at the top of the
bedrock layer to the top of the soil layer. This transfer function has an analytical solution, which can be

82

expressed by (Kramer, 1996):


F () =

umax (0, t)
1
=
umax (H, t)
cos(H/vs )

(5.4)

where is the amplified angular frequency, umax (h, t) is the motion registered at depth h over time t, H
is the layer width, and vs is the shear wave velocity through the layer. This relationship can be in terms
of displacement, velocity, or acceleration.
Alternatively, the amplification function is often used instead of the transfer function:
H() = |F ()| =

1
| cos(H/vs )|

(5.5)

The results of running the EERA tool and the Plaxis model are presented in Figure 5.10. Only the
amplification function is presented since it conveys all the necessary information to compare the two
approaches taken.

Figure 5.10: Amplification function of a single layer overlaying rigid bedrock modelled both in the Plaxis
software and with the EERA tool.
It can be seen that in both the Plaxis model and the EERA tool the fundamental frequencies of
the system are correctly identified (i.e. the frequencies for which H() tends to infinity). The Plaxis
model does so in a more erratic fashion than the EERA tool, which is to be expected in a finite element
calculation software with a complex signal such as the Gilroy #1 ground motion record.
Additionally, it becomes obvious that the Plaxis model has a tendency to damp the peaks more and
more as the frequency increases. This can be attributed to three main factors: numerical damping
caused by the model performing the calculations in discreet time steps, insufficient mesh refinement
to capture the higher frequencies (which have lower wavelengths) and time integration damping that
is enabled by default in the Plaxis version used. These factors influence the results in all frequencies,
but have more weight for higher frequencies. The first two factors were minimised by choosing a mesh
83

refinement and number of calculation steps taken by the software that were as precise as possible
without compromising too much regarding the calculation time, while the dealing with the third factor will
be approached below.

Time integration and damping


Generally, the dynamic response of structural systems is calculated using direct numerical integration of
the dynamic equilibrium equations (Wilson, 1995). This is done by satisfying the equilibrium equations
at discreet points in time.
Several methods have been developed to deal with this integration, and the method used by Plaxis
is called the Newmark method. This method assumes two specific parameters, and , which are associated, respectively, with the mass and damping matrices. In fact, the Newmark method is a collection
of sub-methods based on the same set of governing formulas, and between them the parameters and
vary (Wilson, 1995).
The sub-method that will be used is called the average acceleration method, which provides no time
integration damping, at the cost of some instability in certain situations. Wilson (1995) says that this
instability brought about by the average acceleration method happens because, in some situations, the
numerical solution tends to oscillate about the true solution, which is solved through the use of time
integration damping. However, for the earthquake simulation done in this work, it was considered more
appropriate to control the damping through other means, since it would hard to assess the consequences
of the numerical time integration damping in the final results.
In order to use the average acceleration method, the default Newmark parameters used by Plaxis
( = 0.3025 and = 0.6), which provide some numerical damping, were replaced by = 0.25 and
= 0.5 (Wilson, 1995; Brinkgreve et al., 2006). The test made to compare the simple elastic, singlelayered model with EERA (which had the damped Newmark parameters) was remade with the average
acceleration parameters, and the results are presented in Figure 5.11.
It can be seen that the change in Newmark parameters has had a significant effect on the amplification of the soil, especially at higher frequencies. By removing the time integration damping, the overall
damping can be better controlled by other means, as will be seen next.

Radiation and Rayleigh damping


If the model were to be defined as-is, only material damping would be simulated by the model (disregarding some damping that naturally occurs due to numerical approximations and finite element calculations). In the context of an earthquake loading overlaying an elastic bedrock, another important physical
component of damping that highly influences earthquake behaviour is radiation damping. This kind of
damping was briefly mentioned earlier in this work, but never before expanded upon due to the fact that
it is largely irrelevant in determining the soils material behaviour under cyclic loading.
However, when modelling an earthquake scenario, radiation damping has to be considered in order
to provide for an accurate simulation. The main cause of radiation damping in a real scenario is the

84

Figure 5.11: Amplification function of a single layer overlaying rigid bedrock modelled in the Plaxis
software with and without Newmark time integration damping, and comparison with the EERA tool.
escaping of seismic waves through the bottom layer into the (approximately) elastic bedrock layer,
where they are assumed to not come back again. If one models the bedrock layer as a rigid layer, as is
the case with a model of this type in Plaxis, the seismic waves will be reflected in the boundary between
the last layer and the bedrock layer and will further load the soil, causing artificially increased movements
in the soil.
In order to simulate this radiation damping effect, as it cannot easily be simulated directly, an alternative means of damping has to be considered. Specifically, Plaxis allows for each material model to
incorporate a form of viscous damping called Rayleigh damping (Rayleigh, 1900). This is simplification
of the damping characteristics of a material, in which the overall damping exhibited by the material can
be though of as being a linear combination of the mass and stiffness matrices, or:
[] = [M ] + [D]

(5.6)

where and are the Rayleigh coefficients.


Plaxis allows for the input of the and parameters for each material model. These coefficients can
be approximately determined by using the following expression (Chitas, 2008):
=

+ 2
2

(5.7)

where is the natural or fundamental angular frequency of the material.


In order to compensate for the lack of radiation damping (and to provide some damping at low
strains), an overall Rayleigh damping ratio was assumed. This is only an approximation, but it should
be sufficient to account for at least part of the radiation damping phenomenon. This overall damping
ratio will be simulated by applying Rayleigh parameters to all soil layers based on the sites natural
frequencies.
85

To determine which fundamental frequencies to apply the Rayleigh damping on, a test was made
where the results of a Plaxis model with Rayleigh damping applied to the first and second natural frequencies and to the first and third natural frequencies were compared with the results from EERA. To
estimate the natural frequencies of the soil site, EERA was loaded with the soil terrains elastic and
weight parameters described in the literature (Andrade and Borja, 2006), which were presented previously, assuming linear elastic behaviour. The damping ratio considered for these tests was = 2%.
With the obtained natural frequencies, two tests were made in Plaxis, also assuming linear elastic
behaviour with the elastic parameters presented in the literature. The Rayleigh coefficients calculated
using equation (5.7) for each combination of natural frequencies tested are as follows:
For = 2%, f1 = 0.96 Hz (1 = 6.03 rad/s), f2 = 2.34 Hz (2 = 14.70 rad/s):
= 0.171, = 1.929 103
For = 2%, f1 = 0.96 Hz (1 = 6.03 rad/s), f3 = 3.66 Hz (3 = 23.00 rad/s):
= 0.191, = 1.378 103
The obtained Plaxis results were compared with the EERA results, which can be seen in Figure 5.12.

Figure 5.12: Amplification function of a multi-layered model overlaying rigid bedrock modelled in the
Plaxis software with Rayleigh damping applied to different combinations of natural frequencies, and
comparison with the EERA model, for = 2%.
The results show that applying the Rayleigh damping to the first and second natural frequencies
yields better results in the peaks observed in the lower frequencies, and worse results in the other
frequencies, which was the expected behaviour.
As for the actual damping ratio chosen to compensate for the lack of radiation damping and to provide
some low-strain damping, a value of = 4% was chosen.

86

5.7.3

Model characteristics

Model geometry: (see Figure 5.13)


Length: 3000 m
Depth: 170 m
Layer configuration:
Layer 1: h = 0 12 m
Layer 2: h = 12 24 m
Layer 3: h = 24 40 m
Layer 4: h = 40 82 m
Layer 5: h = 82 98 m
Layer 6: h = 98 170 m

Figure 5.13: Geometry of the Plaxis model used to simulate the Loma Prieta earthquake.
Boundary conditions:
The model assumes plane strain conditions, i.e. it disregards strains in the direction perpendicular
to the working plane.
To simulate a one-dimensional earthquake analysis, the models plane boundary conditions are as
follows (see Figure 3.1):
In the side boundaries (x = 0 and x = 3000 m), displacements are not permitted in the vertical
(y) direction, and absorbent boundaries were set.
In the lower boundary (y = 170 m), displacements are not permitted in either plane direction.
Loading conditions:
To simulate an earthquake loading at the bedrock layer, a prescribed displacement was applied to
the lower boundary of the soil model (see Figure 5.13).
Loading characteristics:
Type of loading: acceleration time series (Gilroy #1 ground motion record, E-W component).
Sampling rate: 200 Hz
Duration of loading: 23 s
Material characteristics:
Material model variable.
Elastic model parameters used for each layer (Andrade and Borja, 2006), assuming 0.30:
Layer 1: G0 = 65 MPa, K0 = 140 MPa
87

Layer 2: G0 = 430 MPa, K0 = 930 MPa


Layer 3: G0 = 220 MPa, K0 = 480 MPa
Layer 4: G0 = 860 MPa, K0 = 1860 MPa
Layer 5: G0 = 530 MPa, K0 = 1150 MPa
Layer 6: G0 = 1050 MPa, K0 = 2275 MPa
Soil volume mass or weight, respectively or d , for each layer (Andrade and Borja, 2006):
Layers 1 to 2: = 1900 kg/m3 or d = 18.6 kN/m3
Layers 3 to 6: = 2100 kg/m3 or d = 20.6 kN/m3
Rayleigh coefficients, assuming = 4%, and 1 = 6.03 rad/s and 2 = 14.70 rad/s according to
equation (5.7), for all layers:
Rayleigh = 0.342
Rayleigh = 3.858 103
Additional information:
Unlike the more simple direct shear tests done previously in this work, the soils self-weight multiplier was left at unity, as the dynamic soil effects in this test are very important to accurately gauge
the soils behaviour.
Plaxis calculation tool-specific relevant parameters more information can be found in the Plaxis
manual (Brinkgreve et al., 2006):
Calculation type = Dynamic analysis
Number of calculation phases = 1
Additional steps = 1000
Tolerated error = 0.01
Over relaxation = 1.20
Maximum iterations = 60
Dynamic sub steps = 25
Newmark time integration parameters (average acceleration method):
Newmark = 0.25
Newmark = 0.50

88

5.7.4

Results

Having run the models with the mentioned configuration and having as an input the Gilroy #1 E-W
ground motion record, the obtained acceleration time series at the top of the Plaxis model (i.e. at ground
surface) are presented in Figure 5.14, together with the result of running the model in EERA, and also
with the measured Gilroy #2 E-W ground motion record. Since the results from the Spline-based model
were very similar to the ones from the Ramberg-Osgood model, these are compared in a separate
chart. In Figures 5.15 and 5.16 the Fourier amplitude spectra and the amplification functions can also
be compared.

Figure 5.14: Comparison between the acceleration time series obtained: from the Plaxis earthquake
simulation using the different constitutive models; from the EERA simulation; and from the measured
Gilroy #2 E-W ground motion record.

89

Figure 5.15: Comparison between the Fourier amplitude spectra obtained: from the Plaxis earthquake
simulation using the different constitutive models; from the EERA simulation; and from the measured
Gilroy #2 E-W ground motion record.

90

Figure 5.16: Comparison between the amplification function spectra obtained from the Plaxis earthquake
simulation with the Spline-based model, from the EERA simulation, and from the measured Gilroy #2
E-W ground motion record.
From the results obtained, the following considerations can be made regarding each of the models:
Linear elastic model:
Significantly over-estimates the acceleration peaks in the acceleration time series;
Does not correctly identify the observed frequency peaks, and significantly over-estimates the
amplification felt at the peaks, as can be seen both in the Fourier amplitude spectrum and in the
amplification function.

91

Mohr-Coulomb model:
Over-estimates the acceleration peaks in the acceleration time series;
Does not accurately predict the major frequency peaks, as can be seen especially in the amplification function, and over-estimates the amplification. Additionally, a phenomenon unique to this
model can be seen, where the amplification keeps being felt for the larger frequencies. This phenomenon is not typically observed in a real earthquake scenario, as seen by the measured ground
motion records, which do not exhibit these peaks for the higher frequencies.

Ramberg-Osgood model:
Generally agrees with the measured acceleration ground motion record;
Correctly identifies the major frequency peaks in the Fourier spectrum and in the amplification
function. Identifies some peaks that do not exist in the measured records, especially one at f
3 Hz.

EERA:
Over-estimates the acceleration peaks in the acceleration time series;
Generally identifies the major frequency peaks, while over-estimating their peak value. The peak
observed at f 2.5 Hz is predicted but the peaks frequency range is significantly wider than what
is observed in the records.
The amplification function has a shape that is very different from the rest of the models (much
smoother), and from the measured ground motion record.

Spline-based model:
Generally agrees with the measured acceleration ground motion record;
Correctly identifies the major frequency peaks in the Fourier spectrum and in the amplification
function. Identifies some peaks that do not exist in the measured records, especially one at f
3 Hz of much higher magnitude than the others (which is also picked up by the M-C and R-O
models, and as such is possibly attributable to an exogenous source such as insufficient mesh
refinement of the Plaxis model).
Produces results that are very similar to the Ramberg-Osgood model.
Considering that both the R-O model and the Spline model were said to be a valid approximation
only in the low to medium strain range, it is interesting to note what were the maximum measured strains
in depth for each of the models. This information is presented in Figure 5.17. It can be seen that for
the R-O and Spline models the maximum strains reached are in the 103 range, which still classifies as
medium strain range. The average strains measured are about an order of magnitude lower.
It is easily observable that, of the models tested, only the Ramberg-Osgood model and the Splinebased model produced results that are a good approximation to the measured records. The equivalent

92

Figure 5.17: Maximum strains reached with depth in the Plaxis simulation, for each of the models tested.
linear method, using EERA, can also be said to reasonably approximate the measured records, although
to a lesser degree.
It was expected that the results from using the linear elastic and the elastic perfectly-plastic models
would not be very accurate, for reasons explored earlier in this work. The EERA model has flaws that
were also previously mentioned, but as a lightweight tool to make a quick one-dimensional analysis, it
performed well. As for the striking similarities in the results from the use of the Spline-based model and
the Ramberg-Osgood model, it doesnt come as much of a surprise after the results obtained in Chapter
4, namely in Subsection 4.4.2.
It is important to note the fact that the Spline-based model provides good results when applied to
a more realistic scenario, which means it can be reliably used in cyclic loading scenarios. However,
the observed similarities with the Ramberg-Osgood model, now seen in two different contexts, seems
to suggest that the increased flexibility of the developed model does not translate into any measurable
improvement in the practical results.

93

Chapter 6

Concluding remarks
The initial purpose of this work was to analyse the limitations and range of application of some commonly used constitutive soil models in their ability to simulate soil behaviour for cyclic loading conditions.
However, with the progress of the work the possibility came about to improve on the works objectives by
trying to create and test a new constitutive soil model. The author can confidently say that both of these
objectives were successfully completed. To achieve the proposed objectives, the work was divided in
four main parts, each given a specific chapter.
It was found, in the analysis of the existing constitutive soil models, that most of them were not
prepared to accurately represent the soils characteristics in cyclic loading conditions. This is because,
with the exception of the Ramberg-Osgood model, they were developed with static loading conditions
in mind. It is therefore necessary to be careful in the use of these popular constitutive models when
dealing with dynamic, and specifically cyclic, behaviour.
Regarding the developed soil model, the objective of this work was to make a proof of concept,
i.e. to demonstrate that it would be viable and possibly advantageous to build a constitutive soil model
with a spline backbone curve formulation to deal with soil behaviour in cyclic loading scenarios. To this
effect, a soil model with a non-linear elastic cycle independent stress-strain relationship was developed
that, given strain-dependent modulus and damping experimental data, generates and adapts a spline
backbone curve in stress-strain space so that the resulting strain-dependent modulus and damping
curves are as close as possible to both sets of experimental results. The model was developed up to
the point where it was usable and sufficiently optimised, and in doing so the objective of this work was
achieved. Based on the tests made, it can be said that the model manages to adequately approximate
most sets of experimental data points. However, the model seems to have some trouble approximating
damping ratio values for very small strains, which is proving to be a limitation for this model. However,
very small strain damping values are not typically significant to the overall soil behaviour in complex cyclic
loading conditions, which means that, even with this discrepancy, the model is still capable of adequately
simulating soil behaviour. Additionally, to compensate for the undervaluing of the small-strain damping,
the model can be used with an added definition of damping (for example, using Rayleigh damping as
was done in Chapter 5). For higher strain damping values, where the accuracy of the model becomes

94

more important, the model generally seems to behave in a satisfactory fashion.


In fact, when the model was tested in a more realistic scenario, it performed well, having adequately
predicted the the measured Loma Prieta earthquake motion records at the Gilroy #2 site while having
received as an input only the ground motion record at the Gilroy #2 rock outcropping and the characteristics of the soil at the earthquake site. In this regard, the model behaved in a satisfactory manner,
having generated results that are an improvement in accuracy when compared with some of the existing
soil models and with the one-dimensional analysis using the equivalent linear elastic method (using the
program EERA), and that are generally in agreement with the measured records.
However, based on the tests made, the developed model proved to be very similar to the RambergOsgood model. This similarity manifested itself when comparing the shapes of the curves obtained from
each model, and also in the results from the Plaxis earthquake simulation. Given the added flexibility of
the Spline-based model, this similarity suggests that the developed model is creating spline backbone
curves with shapes that very closely resemble the shape of Ramberg-Osgood backbone curves. This,
in turn, seems to suggest that the range of shapes that a Ramberg-Osgood backbone curve can take is
the best approximation that can be made in the context of a cycle-independent non-linear elastic model.
In light of this, it is reasonable to conclude that, when dealing with existing non-linear elastic soil models
following the Masing rule, the Ramberg-Osgood backbone curve formulation is possibly as good an
approximation as there can ever be achieved, and further developments in the field of soil modelling
for cyclic loading conditions should focus on other aspects such as the definition of the unloading and
reloading paths.
In the making of this work not only were all the proposed objectives achieved, but also a much deeper
understanding was gained regarding soil mechanics and soil behaviour for dynamic loading conditions.
This last point is also a very important, albeit sometimes undervalued, objective in a work of this type.

95

96

Bibliography
J.E. Andrade and R.I. Borja. Quantifying sensitivity of local site response models to statistical variations
in soil properties. Acta Geotechnica, 1:314, 2006.
R.B.J. Brinkgreve, W. Broere, and D. Waterman. Plaxis 2D Version 8 Manual. Plaxis BV, Delft,
Netherlands, 2006.
R.B.J. Brinkgreve, M.H. Kappert, and P.G. Bonnier. Hysteretic damping in a small-strain stiffness model.
In Pande, G.N. and Pietruszczak, S., editor, Numerical Models in Geomechanics: NUMOG X, Proceedings and Monographs in Engineering, Water and Earth Sciences, pages 737742, 2007. 10th
International Symposium on Numerical Models in Geomechanics (NUMOG X), Rhodes, Greece, April,
2007.
J.R. Buchanan. Cubic Spline Interpolation. MATH 375, Numerical Analysis, 2010.
W.F. Chen and E. Mizuno. Nonlinear analysis in soil mechanics: theory and implementation. Developments in geotechnical engineering. Elsevier, 1990.
P. Chitas. Site-effect Assessment Using Acceleration Time Series - Application to Sao Sebastiao Volcanic Crater. Masters thesis, Universidade Nova de Lisboa, 2008.
M.B. Darendeli. Development of a new family of normalized modulus reduction and material damping
curves. PhD thesis, University of Texas, Austin, Texas, USA, 2001.
D. Fekedulegn, M.P. Mac Siurtain, and J.J. Colbert. Parameter estimation of nonlinear growth models in
forestry. SILVA FENNICA, 33(4):327336, 1999.
I. Ishibashi and X. Zhang. Unified dynamic shear moduli and damping ratios of sand and clay. Soils and
Foundations, 33(1):182191, 1993.
K. Ishihara. Soil Behaviour in Earthquake Geotechnics. Oxford Engineering Science Series. Oxford
University Press, USA, 1996.
R.L. Kondner. A Hyperbolic Stress-strain Formulation for Sands. Northwestern University, Chicago,
USA, 1963.
S.L. Kramer. Geotechnical Earthquake Engineering. Prentice-Hall International Series in Civil Engineering and Engineering Mechanics. Prentice-Hall, 1996.
97

J.V. Lemos. Analise


Dinamica
em Macicos Rochosos (in portuguese), 2011.
R.A. Page, P.H. Stauffer, and J.W. Hendley II. Progress toward a safer future since the 1989 Loma Prieta
earthquake. In Fact Sheet. U.S. Geological Survey, 1999. USGS Fact Sheet-151-99.
D.M. Potts and L. Zdravkovic. Finite Element Analysis in Geotechnical Engineering: Theory. Finite
Element Analysis in Geotechnical Engineering. Thomas Telford, 1999.
W. Ramberg and W.R. Osgood. Description of stress-strain curves by three parameters. National
Advisory Comittee for Aeronautics, Washington, D.C., USA, 1943. Technical Note 902.
J.W.S. Rayleigh. Theory of Sound (two volumes). Dover Publications, 1900.
F.J. Richards. A flexible growth function for empirical use. Journal of Experimental Botany, 10(2):290
301, 1959.
T. Schanz, P.A. Vermeer, and P.G. Bonnier. The hardening soil model: Formulation and verification. In
R.B.J. Brinkgreve, editor, Beyond 2000 in Computational Geotechnics, pages 281296, 1999.
T. Ueng and J. Chen. Computational procedures for Determining Parameters in Ramberg-Osgood
Elastoplastic Model Based on Modulus and Damping Versus Strain. Technical report, United States
Government, July 1992.
A. Verruijt. Soil Dynamics. Delft University of Technology, Delft, Netherlands, 1994.
H.A. von Fircks and T. Verwijst. Plant Viability as a Function of Temperature Stress (The Richards
Function Applied to Data from Freezing Tests of Growing Shoots). Plant Physiology, 103(1):125130,
1993.
M. Vucetic. Cyclic threshold shear strains in soils. Journal of Geotechnical Engineering, 120(12):2208
2228, 1994.
M. Vucetic and R. Dobry. Effect of soil plasticity on cyclic response. Journal of Geotechnical Engineering,
117:89107, 1991.
E.L. Wilson. Three Dimensional Static and Dynamic Analysis of Structures A Physical Approach With
Emphasis on Earthquake Engineering. Computers amd Structures, Inc., 1995.

98

Annex A

Spline-based model VBA source


code (Module 1)
Attribute VB_Name = " Module1 "
Option Explicit

Sub Backbone ()
Dim Prompt As Integer , repeat As Integer , export As Integer , resolution As Integer
Dim l o c a l _ r e s o l u t i o n _ p r o m p t As Integer , r e s o l u t i o n _ e r r o r _ p r o m p t As Integer
Dim spline_parts As Integer

Dim range_G As Range , range_D As Range , range_yD As Range


Dim G0 As Double , wG As Double , wD As Double
Dim sum As Double
Dim xG As Variant , yG As Variant , xD As Variant , yD As Variant
Dim i As Long , P As Integer
Dim LB As Double , UB As Double

Code developed by Pedro Pinto as part of the Master s Thesis titled :


" Study of Constitutive Models for Soils Under Cyclic Loading - Introducing the Spline
- Based Model "
( IST , Lisbon , Portugal )

Given a set of experimental values of Shear strain - Shear modulus ratio and Shear
strain - Damping ratio ,
calculates the parameters of a spline that serves as a backbone curve and minimizes
the error on both sets
of experimental points .

Application . Calculation = x l C a l c u l a t i o n M a n u a l

Prompt = MsgBox ( Prompt := " Do you wish to run the Backbone routine ? " , _
Buttons := vbYesNo , Title := " Run Backbone " )

99

If Prompt = vbNo Then Exit Sub

LB = Sheets ( " Calc " ) . Range ( " $F$2 " ) . Value2


UB = Sheets ( " Calc " ) . Range ( " $F$3 " ) . Value2

Create the auxiliary points at the start ( basically , the values of G / G0 and Damp . for
gamma =~ 0) :
If the gamma values are already there and lower than 10^ -10 , they may be kept .
Otherwise , they become 10^ -10.

If Sheets ( " Calc " ) . Range ( " $B$7 " ) . Value2 > 0.0000000001 Then _
Sheets ( " Calc " ) . Range ( " $B$7 " ) . Value2 = 0.0000000001

Sheets ( " Calc " ) . Range ( " $C$7 " ) . Value2 = 1

If Sheets ( " Calc " ) . Range ( " $E$7 " ) . Value2 > 0.0000000001 Then _
Sheets ( " Calc " ) . Range ( " $E$7 " ) . Value2 = 0.0000000001

Sheets ( " Calc " ) . Range ( " $F$7 " ) . Value2 = 0

If Sheets ( " Calc " ) . Range ( " $G$7 " ) . Value2 > 0.0000000001 Then _
Sheets ( " Calc " ) . Range ( " $G$7 " ) . Value2 = 0.0000000001

Sheets ( " Calc " ) . Range ( " $H$7 " ) . Value2 = 1


Sheets ( " Calc " ) . Range ( " $J$7 " ) . Value2 = 0

Prompt = MsgBox ( Prompt := " Did you already input all the necessary data ? ( G0 and error
weights ) ? " , _
Buttons := vbYesNo , Title := " Data input " )

If Prompt = vbNo Then


G0 = Application . InputBox ( Prompt := " Enter G0 value ( kN / m2 ) : " , Title := " G0 " , Type :=1)
If G0 <= 0 Then
Prompt = MsgBox ( Prompt := " Invalid value . Do you want to exit the routine ? " , _
Buttons := vbYesNo , Title := " Exit routine " )
If Prompt = vbYes Then Exit Sub
End If
Sheets ( " Calc " ) . Range ( " $C$2 " ) . Value2 = G0

wG = Application . InputBox ( Prompt := " Enter G / G0 error weight value : " , Title := " G / G0
weight " , Type :=1)
If wG <= 0 Then
Prompt = MsgBox ( Prompt := " Invalid value . Do you want to exit the routine ? " , _
Buttons := vbYesNo , Title := " Exit routine " )
If Prompt = vbYes Then Exit Sub
End If
Sheets ( " Calc " ) . Range ( " $I$2 " ) . Value2 = wG

100

wD = Application . InputBox ( Prompt := " Enter Damping error weight value : " , Title := "
Damping weight " , Type :=1)
If wD <= 0 Then
Prompt = MsgBox ( Prompt := " Invalid value . Do you want to exit the routine ? " , _
Buttons := vbYesNo , Title := " Exit routine " )
If Prompt = vbYes Then Exit Sub
End If
Sheets ( " Calc " ) . Range ( " $I$3 " ) . Value2 = wD
End If

Ask for input : G / G0 and Damping experimental data :

Set range_G = Application . InputBox ( Prompt := " Input range of gamma ( G / G0 ) values : " , Title
:= " G / G0 curve " , Type :=8)

If range_G = vbCancel Then Exit Sub

xG = range_G . Value2
ReDim yG ( LBound ( xG ) To UBound ( xG ) , 1)
For i = LBound ( xG ) To UBound ( xG )
yG (i , 1) = xG (i , 2)
Next i
ReDim xG ( LBound ( xG ) To UBound ( xG ) , 1)

Set range_yG = Application . InputBox ( prompt :=" Input G / G0 values :" , Title :=" G / G0 curve " ,
Type :=8)
yG = range_yG . Value2

Set range_D = Application . InputBox ( Prompt := " Input range of gamma ( Damp ) values : " , Title
:= " Damping curve " , Type :=8)

If range_D = vbCancel Then Exit Sub

sum = 0
For i = LBound ( range_D . Value2 ) To UBound ( range_D . Value2 )
sum = sum + range_D . Value2 (i , 2)
Next i

If sum / ( UBound ( range_D . Value2 ) - LBound ( range_D . Value2 ) ) > 1 Then


For i = LBound ( range_D . Value2 ) To UBound ( range_D . Value2 )
range_D (i , 2) . Formula = " = " & range_D . Value2 (i , 2) & " /100 "
Next i
End If

xD = range_D . Value2
ReDim yD ( LBound ( xD ) To UBound ( xD ) , 1)

101

For i = LBound ( xD ) To UBound ( xD )


yD (i , 1) = xD (i , 2)
Next i
ReDim xD ( LBound ( xD ) To UBound ( xD ) , 1)

range_yD = Application . InputBox ( prompt :=" Input Damping values :" , Title :=" Damping curve
" , Type :=8)
yD = range_yD . Value2

Resolution :

Rerun :
Sheets ( " Calc " ) . Select
Application . Sc reenUpda ting = True

resolution = Application . InputBox ( Prompt := " Please specify the desired resolution ( i
. e . the number of polylines that will constitute the spline ) . " _
& " Please note that the higher the resolution the longer the calculation
time will be . Value must be an integer between 2 and 200. " , _
Title := " Data input " , Type :=1)

Error :
If resolution < 2 Or resolution > 200 Or Round ( resolution , 1) <> resolution Then
Prompt = MsgBox ( Prompt := " Invalid value . Do you wish to exit the routine ? " , _
Buttons := vbYesNo , Title := " Exit routine " )

If Prompt = vbYes Then Exit Sub

resolution = Application . InputBox ( Prompt := " Please input a value between 2 and
61 for the global resolution . " , _
Title := " Data input " , Type :=1)
End If

If resolution < 2 Or resolution > 200 Then


GoTo Error
End If

Sheets ( " Calc " ) . Range ( " $L$2 " ) . Value2 = resolution

local_resolution :

resolution = Sheets ( " Calc " ) . Range ( " $L$2 " ) . Value2

l o c a l _ r e s o l u t i o n _ p r o m p t = MsgBox ( Prompt := " Do you want to set different local


resolutions for different segments of the spline ? " , _
Buttons := vbYesNo , Title := " Global resolution " )

If l o c a l _ r e s o l u t i o n _ p r o m p t = vbYes Then

102

spline_parts = Application . InputBox ( Prompt :=" Please input the number of parts in
which you want to divide the backbone curve to specify the local resolutions ." ,
_
Title := " Number of spline parts " , Type :=1)

Dim LBp As Double , UBp As Double

resolution_LB :
LBp = Application . InputBox ( Prompt := " Please input the lower bound of the spline
segment in which you want to refine the resolution . " , _
Title := " Spline segment lower bound " , Type :=1)

Calculate

If LBp < LB Then


r e s o l u t i o n _ e r r o r _ p r o m p t = MsgBox ( Prompt := " Invalid value . Lower bound must be
equal or higher than the spline s " _
& " lower bound . Do you want to use an uniform global resolution instead ? " ,
_
Buttons := vbYesNo , Title := " Invalid value . Use global resolution ? " )
If r e s o l u t i o n _ e r r o r _ p r o m p t = vbYes Then
l o c a l _ r e s o l u t i o n _ p r o m p t = vbNo
GoTo a f t e r _ r e s o l u t i o n
Else
GoTo resolution_LB
End If
End If

resolution_UB :
UBp = Application . InputBox ( Prompt := " Please input the upper bound of the spline
segment in which you want to refine the resolution . " , _
Title := " Spline segment upper bound " , Type :=1)

Calculate

If UBp > UB Then


r e s o l u t i o n _ e r r o r _ p r o m p t = MsgBox ( Prompt := " Invalid value . Upper bound must be
equal or lower than the spline s " _
& " upper bound . Do you want to use a uniform global resolution instead ? " , _
Buttons := vbYesNo , Title := " Invalid value . Use global resolution ? " )
If r e s o l u t i o n _ e r r o r _ p r o m p t = vbYes Then
l o c a l _ r e s o l u t i o n _ p r o m p t = vbNo
GoTo a f t e r _ r e s o l u t i o n
Else
GoTo resolution_UB
End If
End If

If UBp <= LBp Then

103

r e s o l u t i o n _ e r r o r _ p r o m p t = MsgBox ( Prompt := " Invalid value . Upper bound must be


higher than lower bound . " _
& " Do you want to change the lower bound ? " , _
Buttons := vbYesNo , Title := " Invalid value . Change lower bound ? " )
If r e s o l u t i o n _ e r r o r _ p r o m p t = vbYes Then
GoTo resolution_LB
Else
GoTo resolution_UB
End If
End If

Sheets ( " Calc " ) . Range ( " $G$8 : $G$1000 " ) . ClearContents

Dim PI As Integer , N As Integer


Dim L_count As Integer , Z_count As Integer , U_count As Integer , Zp_count As Integer

PI = Application . InputBox ( Prompt := " Please input the desired increase in resolution
" _
& " ( e . g . 1 equals no resolution increase and 5 equals an increase of five times
in the local resolution ) . " , _
Title := " resolution increase " , Type :=1)

L_count = 0
Z_count = 0
U_count = 0

For i = 1 To resolution
If Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (
resolution - 1) * ( i - 1) ) , 10) < LBp Then L_count = L_count + 1
If Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (
resolution - 1) * ( i - 1) ) , 10) >= LBp And _
Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (
resolution - 1) * ( i - 1) ) , 10) <= UBp Then Z_count = Z_count + 1
If Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (
resolution - 1) * ( i - 1) ) , 10) > UBp Then U_count = U_count + 1
Next i

Zp_count = Z_count * PI + 2

resolution = L_count + Zp_count + U_count

If resolution > 61 Then


Prompt = MsgBox ( Prompt := " The global resolution would be equal to " & resolution
& " ," _
& " which is over the limit of 61. Do you want to abort the routine ? " , _
Buttons := vbYesNo , Title := " Updated global resolution " )

If Prompt = vbYes Then Exit Sub Else GoTo l o c a l _ r e s o l u ti o n

104

End If

Prompt = MsgBox ( Prompt := " The global resolution will be equal to " & resolution & " .
" _
& " Is this OK ? " , _
Buttons := vbYesNo , Title := " Updated global resolution " )

If Prompt = vbNo Then GoTo l o c a l _ r e so l u t i o n

Sheets ( " Calc " ) . Range ( " $L$2 " ) . Value2 = resolution

If L_count > 0 Then


For i = 0 To L_count - 1
Sheets ( " Calc " ) . Range ( " $G$8 " ) . Offset ( i ) . Value2 = _
Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( LBp ) / Log (10) - Log ( LB ) / Log (10)
) / L_count * i ) , 10)
Next i
End If

For i = 0 To Zp_count
Sheets ( " Calc " ) . Range ( " $G$8 " ) . Offset ( L_count + i ) . Value2 = _
Round (10 ^ ( Log ( LBp ) / Log (10) + ( Log ( UBp ) / Log (10) - Log ( LBp ) / Log (10) )
/ Zp_count * i ) , 10)
Next i

If U_count > 0 Then


For i = 1 To U_count - 1
Sheets ( " Calc " ) . Range ( " $G$8 " ) . Offset ( L_count + Zp_count + i ) . Value2 = _
Round (10 ^ ( Log ( UBp ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( UBp ) / Log
(10) ) / ( U_count - 1) * i ) , 10)
Next i
End If

End If

after_resolution :

Application . Sc reenUpda ting = False


Sheets ( " Calc " ) . Range ( " $K$8 : $K$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $S$35 : $T$40 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $AG$7 : $AN$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $AE$7 : $AE$1002 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $AD$7 : $AD$1002 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $AC$7 : $AC$1002 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $Z$7 : $AB$1002 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $N$7 : $N$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $L$7 : $L$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $J$8 : $J$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $H$8 : $H$1000 " ) . ClearContents

105

Sheets ( " Calc " ) . Range ( " $I$8 : $I$1000 " ) . ClearContents
Sheets ( " Calc " ) . Range ( " $Y$7 : $Y$2000 " ) . ClearContents
Sheets ( " Calc " ) . Calculate
Sheets ( " Charts " ) . Select
Application . Sc reenUpda ting = True

Sheets ( " Calc " ) . Range ( " $S$35 " ) . Value2 = 1.5
Sheets ( " Calc " ) . Range ( " $S$36 " ) . Value2 = 0.05
Sheets ( " Calc " ) . Range ( " $S$37 " ) . Value2 = 0.0000003
Sheets ( " Calc " ) . Range ( " $S$38 " ) . Value2 = 2
Sheets ( " Calc " ) . Range ( " $S$39 " ) . Value2 = 1.5
Sheets ( " Calc " ) . Range ( " $S$40 " ) . Value2 = 1

Sheets ( " Calc " ) . Range ( " $T$35 " ) . Value2 = 0


Sheets ( " Calc " ) . Range ( " $T$36 " ) . Value2 = 0.3
Sheets ( " Calc " ) . Range ( " $T$37 " ) . Value2 = 0.001
Sheets ( " Calc " ) . Range ( " $T$38 " ) . Value2 = 2
Sheets ( " Calc " ) . Range ( " $T$39 " ) . Value2 = 0.2
Sheets ( " Calc " ) . Range ( " $T$40 " ) . Value2 = 3

Application . Sc reenUpda ting = False


Application . Calculation = x l C a l c u l a t i o n A u t o m a t i c

Logistic approximation : replace gamma log .:


If l o c a l _ r e s o l u t i o n _ p r o m p t = vbNo Then
Sheets (" Calc ") . Range (" $G$8 : $G$68 ") . ClearContents
For P = 1 To resolution
Sheets (" Calc ") . Range (" $G$8 ") . Offset ( P - 1) . Formula = _
"=10^( LOG10 ( $F$2 ) +( LOG10 ( $F$3 ) - LOG10 ( $F$2 ) ) /( COUNTBLANK ( $A$8 : $A$ " &
resolution + 8 - 1 & ") -1) *( COUNTBLANK ( $A$8 : A " & 8 + P - 1 & ") -1) ) "
Next P
End If

spline_model : calculate interp . values Xint :


Sheets (" Calc ") . Range (" $Z$7 : $AB$1002 ") . ClearContents
For P = 1 To 996
Sheets ( " Calc " ) . Range ( " $Y$7 " ) . Offset ( P - 1) . Value2 = _
Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (996
- 1) * ( P - 1) ) , 10)
Next P

Logistic approximation : replace gamma log .:


If l o c a l _ r e s o l u t i o n _ p r o m p t = vbNo Then
Sheets ( " Calc " ) . Range ( " $G$8 : $G$1000 " ) . ClearContents
For P = 1 To resolution
Sheets ( " Calc " ) . Range ( " $G$8 " ) . Offset ( P - 1) . Value2 = _
Round (10 ^ ( Log ( LB ) / Log (10) + ( Log ( UB ) / Log (10) - Log ( LB ) / Log (10) ) / (
resolution - 1) * ( P - 1) ) , 10)
Next P

106

End If

Logistic approximation : replace G / G0 :


Sheets (" Calc ") . Range (" $H$8 : $H$68 ") . ClearContents
For P = 1 To resolution
Sheets ( " Calc " ) . Range ( " $H$8 " ) . Offset ( P - 1) . Formula = " =( S$35 +( S$36 - S$35 ) /(1+ S$37 *
EXP ( - S$38 *( LOG10 ( $G " & 8 + P - 1 & " ) - S$39 ) ) ) ^(1/ S$40 ) ) "
Next P

Logistic approximation : replace tau_i :


Sheets (" Calc ") . Range (" $I$8 : $I$68 ") . ClearContents
For P = 1 To resolution
Sheets ( " Calc " ) . Range ( " $I$8 " ) . Offset ( P - 1) . Formula = " = H " & 8 + P - 1 & " * G " & 8 +
P - 1 & " * $C$2 "
Next P

Backbone : initialise tau_i :


Sheets ( " Calc " ) . Calculate

For P = 0 To resolution
Sheets ( " Calc " ) . Range ( " $K$7 " ) . Offset ( P ) . Value2 = Sheets ( " Calc " ) . Range ( " $I$8 " ) . Offset
( P ) . Value2
Next P

Logistic approximation : replace damp :


Sheets (" Calc ") . Range (" $J$8 : $J$68 ") . ClearContents
For P = 1 To resolution
Sheets ( " Calc " ) . Range ( " $J$8 " ) . Offset ( P - 1) . Formula = " =( T$35 +( T$36 - T$35 ) /(1+ T$37 *
EXP ( - T$38 *( LOG10 ( $G " & 8 + P - 1 & " ) - T$39 ) ) ) ^(1/ T$40 ) ) "
Next P

spline_model : calculate damp :


Sheets (" Calc ") . Range (" $L$7 : $L$68 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $L$7 : $L$ " & resolution + 7) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -5]: R [ " & resolution & " ] C [ -5] , RC [ -1]: R [ " & resolution & " ] C
[ -1] , R2C3 , RC [13]: R [995] C [13] , RC [ -5]: R [ " & resolution & " ] C [ -5] ,5) "

spline_model : calculate G / G0 :
Sheets (" Calc ") . Range (" $N$7 : $N$68 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $N$7 : $N$ " & resolution + 7) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -7]: R [ " & resolution & " ] C [ -7] , RC [ -3]: R [ " & resolution & " ] C
[ -3] , R2C3 , RC [11]: R [995] C [11] , RC [ -7]: R [ " & resolution & " ] C [ -7] ,7) "

Sheets ( " Calc " ) . Range ( " $M$7 : $M$ " & resolution + 7) . Formula = _
" =( RC [ -1] - RC [ -3]) ^2 "

Sheets ( " Calc " ) . Range ( " $O$7 : $O$ " & resolution + 7) . Formula = _
" =( RC [ -1] - RC [ -7]) ^2 "

107

Sheets ( " Calc " ) . Range ( " $T$27 " ) . Formula = " = SUM ( M7 : M " & resolution + 7 & " ) * $I$3 + SUM ( O7 : O
" & resolution + 7 & " ) * $I$2 "
Sheets ( " Calc " ) . Range ( " $T$28 " ) . Formula = " =( AVERAGE ( M7 : M " & resolution + 7 & " ) * $I$3 +
AVERAGE ( O7 : O " & resolution + 7 & " ) * $I$2 ) /( $I$3 + $I$2 ) "

Application . Scr eenUpdat ing = True

Prompt = MsgBox ( Prompt := " The experimental points will now be approximated by a
Generalised Logistic Function . " , _
Buttons := vbOKCancel , Title := " Run Backbone " )

If Prompt = vbCancel Then


Exit Sub
End If

Logistic curve errors

Sheets ( " Calc " ) . Range ( " $R$46 : $T$1000 " ) . ClearContents

For i = 0 To UBound ( xG ) - LBound ( xG ) + 1

Sheets ( " Calc " ) . Range ( " $R$46 " ) . Offset (i , 0) . Formula = " = IF ( ISNUMBER ( " _
& range_G . Cells (i , 1) . Address & " ) ,(( S$35 +( S$36 - S$35 ) /(1+ S$37 * EXP ( - S$38 *( LOG10 (
" _
& range_G . Cells (i , 1) . Address & " ) - S$39 ) ) ) ^(1/ S$40 ) ) * " _
& range_G . Cells (i , 1) . Address & " * $C$2 - " & range_G . Cells (i , 2) . Address _
& " * $C$2 * " & range_G . Cells (i , 1) . Address & " ) ^2 ,0) "

Sheets ( " Calc " ) . Range ( " $S$46 " ) . Offset (i , 0) . Formula = " = IF ( ISNUMBER ( " _
& range_G . Cells (i , 1) . Address & " ) ,(( S$35 +( S$36 - S$35 ) /(1+ S$37 * EXP ( - S$38 *( LOG10 (
" _
& range_G . Cells (i , 1) . Address & " ) - S$39 ) ) ) ^(1/ S$40 ) ) " & " -" & range_G . Cells (i ,
2) . Address & " ) ^2 ,0) "

Next i

For i = 0 To UBound ( xD ) - LBound ( xD ) + 1

Sheets ( " Calc " ) . Range ( " $T$46 " ) . Offset (i , 0) . Formula = " = IF ( ISNUMBER ( " _
& range_D . Cells (i , 1) . Address & " ) ,(( T$35 +( T$36 - T$35 ) /(1+ T$37 * EXP ( - T$38 *( LOG10 (
" _
& range_D . Cells (i , 1) . Address & " ) - T$39 ) ) ) ^(1/ T$40 ) ) " & " -" & range_D . Cells (i ,
2) . Address & " ) ^2 ,0) "

Next i

Application . Sc reenUpda ting = False


Sheets ( " Calc " ) . Select

so that the solver works correctly

108

SolverReset
SolverAdd CellRef := " $S$40 " , Relation :=3 , FormulaText :=0.1
SolverOk SetCell := Sheets ( " Calc " ) . Range ( " $S$44 " ) , MaxMinVal :=2 , ValueOf :=0 , ByChange :=
Sheets ( " Calc " ) . Range ( " $S$35 : $S$40 " ) , _
Engine :=1 , EngineDesc := " GRG Nonlinear "
SolverSolve userFinish := True

SolverReset
SolverAdd CellRef := " $S$40 " , Relation :=3 , FormulaText :=0.1
SolverOk SetCell := Sheets ( " Calc " ) . Range ( " $S$44 " ) , MaxMinVal :=2 , ValueOf :=0 , ByChange :=
Sheets ( " Calc " ) . Range ( " $S$35 : $S$40 " ) , _
Engine :=1 , EngineDesc := " GRG Nonlinear "
SolverSolve userFinish := True

SolverReset
SolverAdd CellRef := " $T$40 " , Relation :=3 , FormulaText :=0.1
SolverOk SetCell := Sheets ( " Calc " ) . Range ( " $T$44 " ) , MaxMinVal :=2 , ValueOf :=0 , ByChange :=
Sheets ( " Calc " ) . Range ( " $T$35 : $T$40 " ) , _
Engine :=1 , EngineDesc := " GRG Nonlinear "
SolverSolve userFinish := True

SolverReset
SolverAdd CellRef := " $T$40 " , Relation :=3 , FormulaText :=0.1
SolverOk SetCell := Sheets ( " Calc " ) . Range ( " $T$44 " ) , MaxMinVal :=2 , ValueOf :=0 , ByChange :=
Sheets ( " Calc " ) . Range ( " $T$35 : $T$40 " ) , _
Engine :=1 , EngineDesc := " GRG Nonlinear "
SolverSolve userFinish := True

Sheets ( " Charts " ) . Select


Sheets ( " Calc " ) . Range ( " $K$8 : $K$1000 " ) . ClearContents

Application . Calculation = x l C a l c u l a t i o n M a n u a l
Application . Sc reenUpda ting = True

Sheets ( " Calc " ) . Calculate


Application . Calculation = x l C a l c u l a t i o n A u t o m a t i c

Prompt = MsgBox ( Prompt := " The backbone curve will now be calculated . " , _
Buttons := vbOKCancel , Title := " Backbone calculation " )

If Prompt = vbCancel Then


Exit Sub
End If

~ Logistic approximation : replace initial tau :

Sheets ( " Calc " ) . Range ( " $K$7 : $K$ " & resolution + 7) . Value2 = Sheets ( " Calc " ) . Range ( " $I$7 :
$I$ " & resolution + 7) . Value2

109

Application . Sc reenUpda ting = False


Sheets ( " Calc " ) . Select

SolverReset
SolverAdd CellRef :=" $T$40 " , Relation :=3 , FormulaText :=0.001
SolverOk SetCell := Sheets ( " Calc " ) . Range ( " $T$28 " ) , MaxMinVal :=2 , ValueOf :=0 , ByChange :=
Sheets ( " Calc " ) . Range ( " $K$8 : $K$ " & resolution + 7) , _
Engine :=1 , EngineDesc := " GRG Nonlinear "
SolverSolve userFinish := True

spline_model : calculate interp . values tau :


Sheets (" Calc ") . Range (" $Z$7 : $AB$1002 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $Z$7 : $AB$1002 " ) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -19]: R [ " & resolution & " ] C [ -19] , RC [ -15]: R [ " & resolution & " ]
C [ -15] , R2C3 , RC [ -1]: R [995] C [ -1] , RC [ -19]: R [ " & resolution & " ] C [ -19] ,2) "

spline_model : calculate interp . values G / G0 :


Sheets (" Calc ") . Range (" $AC$7 : $AC$1002 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $AC$7 : $AC$1002 " ) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -22]: R [ " & resolution & " ] C [ -22] , RC [ -18]: R [ " & resolution & " ]
C [ -18] , R2C3 , RC [ -4]: R [995] C [ -4] , RC [ -22]: R [ " & resolution & " ] C [ -22] ,6) "

spline_model : calculate interp . values int sp .:


Sheets (" Calc ") . Range (" $AD$7 : $AD$1002 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $AD$7 : $AD$1002 " ) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -23]: R [ " & resolution & " ] C [ -23] , RC [ -19]: R [ " & resolution & " ]
C [ -19] , R2C3 , RC [ -5]: R [995] C [ -5] , RC [ -23]: R [ " & resolution & " ] C [ -23] ,3) "

spline_model : calculate interp . values damp .:


Sheets (" Calc ") . Range (" $AE$7 : $AE$1002 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $AE$7 : $AE$1002 " ) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -24]: R [ " & resolution & " ] C [ -24] , RC [ -20]: R [ " & resolution & " ]
C [ -20] , R2C3 , RC [ -6]: R [995] C [ -6] , RC [ -24]: R [ " & resolution & " ] C [ -24] ,4) "

spline_model : calculate coefficient h :


Sheets (" Calc ") . Range (" $AG$7 : $AN$80 ") . ClearContents
Sheets ( " Calc " ) . Range ( " $AG$7 : $AN$ " & resolution + 8 - 1) . FormulaArray = _
" = s pl in e_ i nt eg ra l ( RC [ -26]: R [ " & resolution & " ] C [ -26] , RC [ -22]: R [ " & resolution & " ]
C [ -22] , R2C3 , RC [ -8]: R [995] C [ -8] , RC [ -26]: R [ " & resolution & " ] C [ -26] ,1) "

Sheets ( " Charts " ) . Select


Application . Sc reenUpda ting = True

repeat = MsgBox ( Prompt := " Do you wish to re - run the model with a different resolution to
possibly enhance the results ? " , _
Buttons := vbYesNo , Title := " Re - run calculation " )

110

If repeat = vbYes Then


GoTo Rerun
End If

On Error GoTo 0

export_PLAXIS

End Sub

111

Annex B

Spline-based model VBA source


code (Module 2)
Attribute VB_Name = " Module2 "
Option Explicit

Function s p li ne _i n te gr al ( xG As Variant , Taug As Variant , _


G0 As Double , Xitp As Variant , xD As Variant , Optional Output As Long = 2) As Variant

Dim Tau_calc_itp As Variant , CoefA () As Double , ItgA () As Double


Dim Yd_calc_itp As Variant , Yd_calc_exp As Variant , ErrD As Variant , ErrG As Variant
Dim Yg_calc_itp As Variant , Yg_calc_exp As Variant
Dim NumG As Long , NumItp As Long , NumD As Long
Dim x As Double
Dim i As Long , j As Long , k As Long

Code developed by Pedro Pinto as part of the Master s Thesis titled :


" Study of Constitutive Models for Soils Under Cyclic Loading - Introducing the Spline
- Based Model "
( IST , Lisbon , Portugal )

Spline calculation code based on the source - free program available online at
http :// n ew to ne x ce lb ac h . wordpress . com /2009/07/02/ cubic - splines /

xG

Input points X - values ( backbone curve )

Taug

Input points Y - values ( backbone curve )

G0

Initial / maximum shear modulus

Xitp

X - values for which to interpolate the spline ( only to display graphically )

xD

X - values of the points for which to calculate the damping ratio

Output 1 - Polynomial coefficients and auxiliary parameters

2 - Interpolated values of the spline Y - points + first and second derivatives


at the points Xitp ( default )

3 - Integral of the spline at the points Xitp

4 - Damping ratio values calculated at the points Xitp

112

5 - Damping ratio values calculated at the points xD

6 - Shear modulus ratio values calculated at the points Xitp

7 - Shear modulus ratio values calculated at the points xG

xG = xG . Value2
Taug = Taug . Value2
Xitp = Xitp . Value2
xD = xD . Value2

NumG = UBound ( xG )
NumD = UBound ( xD )
NumItp = UBound ( Xitp )

If UBound ( Taug ) <> NumG Then


s pl in e_ i nt eg ra l = " Xg and Taug must be equal length "
Exit Function
End If

ReDim CoefA (1 To NumG , 1 To 8)

ReDim Tau_calc_itp (1 To NumItp , 1 To 3)


ReDim ItgA (1 To NumItp , 1 To 1)

ReDim Yd_calc_itp (1 To NumItp , 1 To 1)


ReDim Yg_calc_itp (1 To NumItp , 1 To 1)

ReDim Yg_calc_exp (1 To NumG , 1 To 1)


ReDim Yd_calc_exp (1 To NumD , 1 To 1)

For i = 1 To NumG - 1
h
CoefA (i , 1) = xG ( i + 1 , 1) - xG (i , 1)
Next i

For i = 2 To NumG - 1
alpha
CoefA (i , 2) = (3 / CoefA (i , 1) ) * ( Taug ( i + 1 , 1) - Taug (i , 1) ) - (3 / CoefA ( i - 1 ,
1) ) * ( Taug (i , 1) - Taug ( i - 1 , 1) )
Next i

CoefA (1 , 3) = 1
CoefA (1 , 4) = 0
CoefA (1 , 5) = 0

For i = 2 To NumG - 1
Calculate the parameter " l "
CoefA (i , 3) = 2 * ( xG ( i + 1 , 1) - xG ( i - 1 , 1) ) - CoefA ( i - 1 , 1) * CoefA ( i - 1 , 4)
Calculate the parameter " mu "
CoefA (i , 4) = CoefA (i , 1) / CoefA (i , 3)

113

Calculate the parameter " z "


CoefA (i , 5) = ( CoefA (i , 2) - CoefA ( i - 1 , 1) * CoefA ( i - 1 , 5) ) / CoefA (i , 3)
Next i

CoefA (i , 3) = 1
CoefA (i , 5) = 0
CoefA (i , 7) = 0

For i = NumG - 1 To 1 Step -1


Calculate the parameter " c "
CoefA (i , 7) = CoefA (i , 5) - CoefA (i , 4) * CoefA ( i + 1 , 7)
Calculate the parameter " b "
CoefA (i , 6) = ( Taug ( i + 1 , 1) - Taug (i , 1) ) / CoefA (i , 1) - CoefA (i , 1) * ( CoefA ( i
+ 1 , 7) + 2 * CoefA (i , 7) ) / 3
Calculate the parameter " d "
CoefA (i , 8) = ( CoefA ( i + 1 , 7) - CoefA (i , 7) ) / (3 * CoefA (i , 1) )
Next i

CoefA ( NumG , 6) = 3 * CoefA ( NumG - 1 , 8) * CoefA ( NumG - 1 , 1) ^ 2 + 2 * CoefA ( NumG - 1 ,


7) * CoefA ( NumG - 1 , 1) + CoefA ( NumG - 1 , 6)

If Output = 1 Then
s pl in e_ i nt eg ra l = CoefA
Exit Function
End If

j = 1
For i = 1 To NumItp
x = Xitp (i , 1)
If x >= xG (1 , 1) And x <= xG ( NumG , 1) Then
Do While j < NumG
If x < xG (j , 1) Then Exit Do
j = j + 1
Loop
j = j - 1
x = x - xG (j , 1)
Interpolated values of the spline Y - points :
Tau_calc_itp (i , 1) = x ^ 3 * CoefA (j , 8) + x ^ 2 * CoefA (j , 7) + x * CoefA (j ,
6) + Taug (j , 1)
Interpolated values of the spline s first derivative :
Tau_calc_itp (i , 2) = 3 * x ^ 2 * CoefA (j , 8) + 2 * x * CoefA (j , 7) + CoefA (j ,
6)
Interpolated values of the spline s second derivative :
Tau_calc_itp (i , 3) = 6 * x * CoefA (j , 8) + 2 * CoefA (j , 7)

Else
If x < xG (1 , 1) Then j = 1 Else j = NumG
x = x - xG (j , 1)
Tau_calc_itp (i , 1) = x * CoefA (j , 6) + Taug (j , 1)

114

Tau_calc_itp (i , 2) = CoefA (j , 6)
Tau_calc_itp (i , 3) = 0
End If
Next i

If Output = 2 Then
s pl in e_ i nt eg ra l = Tau_calc_itp
Exit Function
End If

j = 1
For i = 1 To NumItp
x = Xitp (i , 1)
If x >= xG (1 , 1) Then

Check if X is inside the spline

If x <= xG ( NumG , 1) Then


Do While j < NumG
If x < xG (j , 1) Then Exit Do Increase Xg incrementally until it is
higher than X , check the corresponding index j , and ...
j = j + 1
Loop
j = j - 1 ... reduce the index j to j - 1 , obtaining the index for which
Xg has the highest value that is smaller than X
x = x - xG (j , 1) X becomes relative to the beggining of the polynomial it
is a part of

Calculate the integral of the current polynomial up until X


ItgA (i , 1) = ItgA (i , 1) + x ^ 4 * CoefA (j , 8) / 4 + x ^ 3 * CoefA (j , 7) / 3
+ x ^ 2 * CoefA (j , 6) / 2 + x * Taug (j , 1)

Else
j = NumG Calculate the full integral of the spline

If the interpolated values go higher than the spline s last point ,


calculate the integral of that excedent ( linear ) :
x = x - xG ( NumG , 1)

ItgA (i , 1) = ItgA (i , 1) + Taug ( NumG , 1) * x + CoefA ( NumG , 6) / 2 * x ^ 2

End If

If the interpolated values go lower than the spline s first point , calculate
the integral of that excedent ( linear ) :
If Xitp (1 , 1) < xG (1 , 1) Then ItgA (i , 1) = ItgA (i , 1) + ( Taug (1 , 1) + CoefA (1 ,
6) * ( Xitp (1 , 1) - xG (1 , 1) ) ) * ( xG (1 , 1) - Xitp (1 , 1) ) + CoefA (1 , 6) / 2 *
( xG (1 , 1) - Xitp (1 , 1) ) ^ 2

Calculate the spline integral up to the xG point immediatly lower than X :


For k = 1 To j - 1

115

ItgA (i , 1) = ItgA (i , 1) + ( xG ( k + 1 , 1) - xG (k , 1) ) ^ 4 * CoefA (k , 8) / 4 +


( xG ( k + 1 , 1) - xG (k , 1) ) ^ 3 * CoefA (k , 7) / 3 + ( xG ( k + 1 , 1) - xG (k ,
1) ) ^ 2 * CoefA (k , 6) / 2 + ( xG ( k + 1 , 1) - xG (k , 1) ) * Taug (k , 1)
Next k

Else
x = x - Xitp (1 , 1)
ItgA (i , 1) = ( Taug (j , 1) + CoefA (j , 6) * ( Xitp (1 , 1) - xG (1 , 1) ) ) * x + CoefA (j
, 6) / 2 * x ^ 2
End If
Next i

If Output = 3 Then
s pl in e_ i nt eg ra l = ItgA
Exit Function
End If

For i = 1 To NumItp
Yd_calc_itp (i , 1) = 2 / 3 . 1 4 1 5 9 2 6 5 3 5 8 9 7 9 * (2 * ItgA (i , 1) / ( Xitp (i , 1) *
Tau_calc_itp (i , 1) ) - 1)
Next i

If Output = 4 Then
s pl in e_ i nt eg ra l = Yd_calc_itp
Exit Function
End If

For i = 1 To NumD
For j = 1 To NumItp - 1
If xD (i , 1) >= Xitp (j , 1) And xD (i , 1) <= Xitp ( j + 1 , 1) Then
Yd_calc_exp (i , 1) = Yd_calc_itp (j , 1) + ( Yd_calc_itp ( j + 1 , 1) Yd_calc_itp (j , 1) ) / ( Xitp ( j + 1 , 1) - Xitp (j , 1) ) * ( xD (i , 1) - Xitp (j ,
1) )
Exit For
End If
Next j
Next i

If Output = 5 Then
s pl in e_ i nt eg ra l = Yd_calc_exp
Exit Function
End If

For i = 1 To NumG
Yg_calc_exp (i , 1) = Taug (i , 1) / ( G0 * xG (i , 1) )
Next i

If Output = 7 Then
s pl in e_ i nt eg ra l = Yg_calc_exp

116

Exit Function
End If

For i = 1 To NumItp
Yg_calc_itp (i , 1) = ( Tau_calc_itp (i , 1) / Xitp (i , 1) ) / G0
Next i

If Output = 6 Then
s pl in e_ i nt eg ra l = Yg_calc_itp
Exit Function
End If

End Function

117

Annex C

Spline-based model VBA source


code (Module 3)
Attribute VB_Name = " Module3 "
Option Explicit
Sub export_PLAXIS ()

Dim dirname As String


Dim lin As Integer , col As Integer , n_lin As Integer , n_col As Integer
Dim C As Variant
Dim export As Integer , Prompt As Integer

Code developed by Pedro Pinto as part of the Master s Thesis titled :


" Study of Constitutive Models for Soils Under Cyclic Loading - Introducing the Spline
- Based Model "
( IST , Lisbon , Portugal )

Routine to export the Spline s parameters into Plaxis as a UDSM by creating and
compiling a . dll file .

The Fortran source code used in this routine is heavily based on the work done by
Pedro Chitas
for the Ramberg - Osgood model in his work " Site - effect Assessment Using Acceleration
Time Series Application to Sao Sebastiao Volcanic Crater " (2008) .

export = MsgBox ( Prompt := " Do you want to compile a . dll file to use the model and
backbone curve with PLAXIS ? " , _
Buttons := vbYesNo , Title := " PLAXIS " )

If export = vbNo Then


Exit Sub
End If

118

filename = Application . Ge tO pe n Fi le na m e ( Title :=" Choose the path where the . dll file
will be created .")

folder_select :
MsgBox ( " Please select the folder where the . dll file will be created . " )

With Application . FileDialog ( m s o F i l e D i a l o g F o l d e r P i c k e r )


. A l l o w M u l t i S e l e c t = False
If . Show <> -1 Then
Prompt = MsgBox ( Prompt := " No folder selected . Do you want to exit the
routine ? " , _
Buttons := vbYesNo , Title := " Exit routine " )
If Prompt = vbYes Then Exit Sub Else GoTo folder_select
End If
dirname = . SelectedItems (1)
End With

n_lin = Sheets ( " Calc " ) . Range ( " $L$2 " ) . Value2 + 1
n_col = 5

ReDim C (1 To n_lin , 1 To n_col )

For lin = 1 To n_lin


For col = 1 To n_col
C ( lin , col ) = Sheets ( " Calc " ) . Range ( " $AQ$7 " ) . Offset ( lin - 1 , col - 1) . Value2
Next col
Next lin

Create the temporary folder where the . dll file will be compiled :
If Dir ( dirname & " \ te m p_ cr ea t e_ dl l " , vbDirectory ) = " " Then MkDir ( dirname & " \
t em p_ cr e at e_ dl l " )

Dim calculoD As String , grandezasD As String , s ecante_s pline As String ,


spline_model As String , usrlib As String

calculoD = dirname & " \ t em p _c re a te _d ll \ CalculoD . for "


grandezasD = dirname & " \ te mp _c r ea te _d l l \ grandezasD . for "
seca nte_spli ne = dirname & " \ te m p_ cr ea t e_ dl l \ s e c a n t e _ s p l i n e _ v a l . for "
spline_model = dirname & " \ te mp _c r ea te _d l l \ spline_model . for "
usrlib = dirname & " \ t em p_ c re at e_ d ll \ usrlib . for "

Const calculoD = dirname & "\ CalculoD . for "


Const grandezasD = dirname & "\ grandezasD . for "
Const sec ante_spl ine = dirname & "\ s e c a n t e _ s p l i n e _ v a l . for "
Const spline_model = dirname & "\ spline_model . for "
Const usrlib = dirname & "\ usrlib . for "

119

Dim calculoD_num As Integer


Dim grandez asD_num As Integer
Dim s e c a n t e _ s p l i n e _ n u m As Integer
Dim s p l i n e _ m o d e l _ n u m As Integer
Dim usrlib_num As Integer

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - calculoD - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

calculoD_num = FreeFile

Open calculoD For Output As # calculoD_num

Print # calculoD_num , "


Print # calculoD_num , "

subroutine CalculoD (K , G , g_oct , g_oct_0 , "


*

d_g_oct , defdist , D_ne , masing ) "

Print # calculoD_num , " "


Print # calculoD_num , "

! subroutine CalculoD (K , G , alfa , exp_r , g_ref , g_oct ,

g_oct_0 , "
Print # calculoD_num , "

! d_g_oct , defdist , D_ne )

( OLD - PEDRO

CHITAS ) "
Print # calculoD_num , " "
Print # calculoD_num , "

implicit none "

Print # calculoD_num , " "


Print # calculoD_num , "

Real (8) , dimension (6) , intent ( in ) :: defdist "

Print # calculoD_num , "

! Real (8) , intent ( in ) :: K , G , alfa , exp_r , g_ref , g_oct ,

g_oct_0 "
Print # calculoD_num , "

Real (8) , intent ( in ) :: K , G , g_oct , g_oct_0 "

Print # calculoD_num , "

Real (8) , intent ( in ) :: d_g_oct "

Print # calculoD_num , "

Real (8) , dimension (6 ,6) , intent ( out ) :: D_ne "

Print # calculoD_num , "

Integer (4) , intent ( in ) :: masing "

Print # calculoD_num , " "


Print # calculoD_num , "

Real (8) , dimension (6 ,6) :: Z_MatA , z_MatB "

Print # calculoD_num , "

Real (8) :: factor_A1 , factor_A2 , G_sec , G_sec_0 , G_tan , eta

"
Print # calculoD_num , "

integer (4) :: i , j "

Print # calculoD_num , " "


Print # calculoD_num , " "
Print # calculoD_num , " "
Print # calculoD_num , "

! Call secante_RO (G , g_ref , alfa , exp_r , g_oct_0 , G_sec_0 )

( OLD

- PEDRO CHITAS ) "


Print # calculoD_num , "

Call s ecante_s pline (G , g_oct_0 , G_sec_0 , masing ) "

Print # calculoD_num , " "


Print # calculoD_num , "

! Call secante_RO (G , g_ref , alfa , exp_r , g_oct , G_sec )

PEDRO CHITAS ) "


Print # calculoD_num , "

Call s ecante_s pline (G , g_oct , G_sec , masing ) "

Print # calculoD_num , " "


Print # calculoD_num , "

! Calculo da matriz A ( D_ne = A + B ) "

Print # calculoD_num , " "


Print # calculoD_num , "

Call MZeroR ( Z_MatA ,36) "

Print # calculoD_num , " "

120

( OLD -

Print # calculoD_num , " "


Print # calculoD_num , "

factor_A1 = 1.0* K +4.0/3.0* G_sec "

Print # calculoD_num , "

factor_A2 = 1.0* K -2.0/3.0* G_sec "

Print # calculoD_num , " "


Print # calculoD_num , " "
Print # calculoD_num , "

Do i =1 ,3 "

Print # calculoD_num , "

Do j =1 ,3 "

Print # calculoD_num , "

Z_MatA (i , j ) = factor_A2 "

Print # calculoD_num , "

End Do "

Print # calculoD_num , "

Z_MatA (i , i ) = factor_A1 "

Print # calculoD_num , "

Z_MatA ( i +3 , i +3) = G_sec "

Print # calculoD_num , "

End Do "

Print # calculoD_num , " "


Print # calculoD_num , "

! Calculo da matriz B "

Print # calculoD_num , " "


Print # calculoD_num , "

Call MZeroR ( Z_MatB ,36) "

Print # calculoD_num , " "


Print # calculoD_num , "

G_tan = G_sec + g_oct *(( G_sec - G_sec_0 ) /( d_g_oct ) ) "

Print # calculoD_num , "

if ( g_oct_0 . EQ .0.0) then "

Print # calculoD_num , "


Print # calculoD_num , "

eta =0.0 "


else "

Print # calculoD_num , "

eta = 4.0/3.0*( G_tan - G_sec ) /( g_oct * g_oct ) "

Print # calculoD_num , "

end if "

Print # calculoD_num , "

"

Print # calculoD_num , "

do i =1 ,6 "

Print # calculoD_num , "

do j =1 ,6 "

Print # calculoD_num , "


Print # calculoD_num , "
Print # calculoD_num , "

Z_MatB (i , j ) =2.0* eta * defdist ( i ) * defdist ( j ) "


end do "
end do "

Print # calculoD_num , " "


Print # calculoD_num , " "
Print # calculoD_num , " "
Print # calculoD_num , "

! Calculo da matriz D - Tangente !!!!!!!!!!! "

Print # calculoD_num , " "


Print # calculoD_num , "

Call MZeroR ( D_ne ,36) "

Print # calculoD_num , " "


Print # calculoD_num , "
Print # calculoD_num , "

Do i =1 ,6 "
do j =1 ,6 "

Print # calculoD_num , "


Print # calculoD_num , "
Print # calculoD_num , "

D_ne (i , j ) = Z_MatA (i , j ) + Z_MatB (i , j ) "


end do "
end do "

Print # calculoD_num , " "


Print # calculoD_num , "

return "

Print # calculoD_num , " "


Print # calculoD_num , "

end subroutine "

Print # calculoD_num , " "


Print # calculoD_num , "

! include s ecante_ RO_val . for "

Close # calculoD_num

121

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - grandezasD
--------------------------------------

gran dezasD_n um = FreeFile

Open grandezasD For Output As # gr andezas D_num

Print # grandezasD_num , "

subroutine grandezasD ( dEps , Eps , Eps_0 , defdist , g_oct ,

g_oct_0 , "
Print # grandezasD_num , "

d_g_oct ) "

Print # grandezasD_num , " "


Print # grandezasD_num , " "
Print # grandezasD_num , "

implicit none "

Print # grandezasD_num , " "


Print # grandezasD_num , "

Real (8) , Dimension (6) , intent ( in ) :: dEps , Eps , Eps_0 "

Print # grandezasD_num , "

Real (8) , Dimension (6) , intent ( out ) :: defdist "

Print # grandezasD_num , "

Real (8) , intent ( out ) :: g_oct , g_oct_0 , d_g_oct "

Print # grandezasD_num , " "


Print # grandezasD_num , "

Real (8) :: comp1 , comp2 , comp3 , comp4 , comp5 , comp6 ,

parc1 , parc2 "


Print # grandezasD_num , "

Real (8) :: teste , Eps_vol "

Print # grandezasD_num , " "


Print # grandezasD_num , "

Eps_vol = Eps (1) + Eps (2) + Eps (3) "

Print # grandezasD_num , " "


Print # grandezasD_num , "

Call MZeroR ( defdist ,6) "

Print # grandezasD_num , " "


Print # grandezasD_num , "

defdist (1) = Eps (1) - Eps_vol /3.0 "

Print # grandezasD_num , "

defdist (2) = Eps (2) - Eps_vol /3.0 "

Print # grandezasD_num , "

defdist (3) = Eps (3) - Eps_vol /3.0 "

Print # grandezasD_num , "

defdist (4) = Eps (4) "

Print # grandezasD_num , "

defdist (5) = Eps (5) "

Print # grandezasD_num , "

defdist (6) = Eps (6) "

Print # grandezasD_num , " "


Print # grandezasD_num , "

! Calculo da distorcao octaedrica do passo actual "

Print # grandezasD_num , " "


Print # grandezasD_num , "

comp1 = 1.0*( Eps (1) - Eps (2) ) **2.0 "

Print # grandezasD_num , "

comp2 = 1.0*( Eps (2) - Eps (3) ) **2.0 "

Print # grandezasD_num , "

comp3 = 1.0*( Eps (3) - Eps (1) ) **2.0 "

Print # grandezasD_num , "

comp4 = 6.0* Eps (4) **2.0 "

Print # grandezasD_num , "

comp5 = 6.0* Eps (5) **2.0 "

Print # grandezasD_num , "

comp6 = 6.0* Eps (6) **2.0 "

Print # grandezasD_num , "

parc1 = 1.0* comp1 +1.0* comp2 +1.0* comp3 "

Print # grandezasD_num , "

parc2 = 1.0* comp4 +1.0* comp5 +1.0* comp6 "

Print # grandezasD_num , "

teste = 1.0* parc1 +1.0* parc2 "

Print # grandezasD_num , "

teste = sqrt ( teste ) "

Print # grandezasD_num , "

g_oct = (2.0/3.0) * teste "

122

Print # grandezasD_num , " "


Print # grandezasD_num , " "
Print # grandezasD_num , "

! Calculo da distorcao octaedrica do passo anterior "

Print # grandezasD_num , " "


Print # grandezasD_num , "

comp1 = 1.0*( Eps_0 (1) - Eps_0 (2) ) **2.0 "

Print # grandezasD_num , "

comp2 = 1.0*( Eps_0 (2) - Eps_0 (3) ) **2.0 "

Print # grandezasD_num , "

comp3 = 1.0*( Eps_0 (3) - Eps_0 (1) ) **2.0 "

Print # grandezasD_num , "

comp4 = 6.0* Eps_0 (4) **2.0 "

Print # grandezasD_num , "

comp5 = 6.0* Eps_0 (5) **2.0 "

Print # grandezasD_num , "

comp6 = 6.0* Eps_0 (6) **2.0 "

Print # grandezasD_num , "

parc1 = 1.0* comp1 +1.0* comp2 +1.0* comp3 "

Print # grandezasD_num , "

parc2 = 1.0* comp4 +1.0* comp5 +1.0* comp6 "

Print # grandezasD_num , "

teste = 1.0* parc1 +1.0* parc2 "

Print # grandezasD_num , "

teste = sqrt ( teste ) "

Print # grandezasD_num , "

g_oct_0 = (2.0/3.0) * teste "

Print # grandezasD_num , " "


Print # grandezasD_num , "

! variacao de distorcao octaedrica "

Print # grandezasD_num , " "


Print # grandezasD_num , "

d_g_oct = 1.0* g_oct -1.0* g_oct_0 "

Print # grandezasD_num , " "


Print # grandezasD_num , "

return "

Print # grandezasD_num , " "


Print # grandezasD_num , "

end subroutine "

Print # grandezasD_num , " "


Print # grandezasD_num , "

! include usrlib . for "

Close # calculoD_num

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - sec ante_sp line


--------------------------------------

s e c a n t e _ s p l i n e _ n u m = FreeFile

Open secante_ spline For Output As # s e c a n t e _ s p l i n e _ n u m

Print # secante_spline_num , " !!!!!!!!! Subrotina para calculo de G secante no ambito


do modelo Spline "
Print # secante_spline_num , "

! subroutine secante_RO (G , g_ref , alfa , exp_r , g_oct ,

G_sec ) ( OLD - PEDRO CHITAS ) "


Print # secante_spline_num , "

subroutine seca nte_spli ne (G , g_oct , G_sec , masing ) "

Print # secante_spline_num , " "


Print # secante_spline_num , "

! double precision , intent ( in ) :: G , g_ref , alfa ,

exp_r , g_oct ( OLD - PEDRO CHITAS ) "


Print # secante_spline_num , "

double precision , intent ( in ) :: G , g_oct "

Print # secante_spline_num , "

double precision , intent ( out ) :: G_sec "

Print # secante_spline_num , " "


Print # secante_spline_num , "

Integer (4) , intent ( in ) :: masing "

123

Print # secante_spline_num , " "


Print # secante_spline_num , "

! Variaveis locais "

Print # secante_spline_num , " "


Print # secante_spline_num , "

Real (8) :: erro , aux1 , aux2 ,x , x_pos ,f , f_linha ,

g_dif , tau "


Print # secante_spline_num , "

Real , allocatable :: C (: ,:) "

Print # secante_spline_num , "

Integer :: n_linhas , n_colunas , linha , coluna , i "

Print # secante_spline_num , " "


Print # secante_spline_num , "

!!! aplicacao do metodo da secante para

determinacao da raiz do polinomio "


Print # secante_spline_num , " "
Print # secante_spline_num , "

! inicializacao do erro "

Print # secante_spline_num , " "


Print # secante_spline_num , "

x =0.999999 "

Print # secante_spline_num , "

x_menos1 =1 "

Print # secante_spline_num , " "


Print # secante_spline_num , "

! inicializacao do erro "

Print # secante_spline_num , "

erro =1 "

Print # secante_spline_num , " "


Print # secante_spline_num , "

!! ciclo de calculo ( OLD - PEDRO CHITAS ) "

Print # secante_spline_num , "

! do while ( erro > 1.0 e -6) "

Print # secante_spline_num , "

! aux1 = x_menos1 -1/(1+ alfa *( x_menos1 *( g_oct /

g_ref ) ) **( exp_r -1) ) "


Print # secante_spline_num , "

! aux2 =x -1/(1+ alfa *( x *( g_oct / g_ref ) ) **( exp_r

-1) ) "
Print # secante_spline_num , "

! x_pos =( aux2 * x_menos1 - aux1 * x ) /( aux2 - aux1 ) "

Print # secante_spline_num , "

! erro = Abs (x - x_pos ) "

Print # secante_spline_num , "

! x_menos1 = x "

Print # secante_spline_num , "

! x = x_pos "

Print # secante_spline_num , "

! end do "

Print # secante_spline_num , " "


Print # secante_spline_num , "

!! ciclo de calculo ( NEW - PEDRO PINTO ) "

Print # secante_spline_num , "

! open ( unit =2 , file = Coef . txt , status = old , action

= read ) "
Print # secante_spline_num , "

! read (2 ,*) n_linhas "

Print # secante_spline_num , "

! read (2 ,*) n_colunas "

Print # secante_spline_num , " "


Print # secante_spline_num , "
Print # secante_spline_num ,"

Print # secante_spline_num , "


Print # secante_spline_num ,"

Print # secante_spline_num , "

n_linhas = " & n_lin


n_linhas =52"

n_colunas = " & n_col


n_colunas =5"

allocate ( C ( n_linhas , n_colunas ) ) "

Print # secante_spline_num , " "

For lin = 1 To n_lin


For col = 1 To n_col

124

Print # secante_spline_num , "

C ( " & lin & " ," & col & " ) = " & C ( lin ,

col )
Next col
Next lin
Print # secante_spline_num ,"

C (1 ,1) =0.0 00000000 1"

Print # secante_spline_num , " "


Print # secante_spline_num , "

! do linha =1 , n_linhas "

Print # secante_spline_num , "

read (2 ,*) ( C ( linha , coluna ) , coluna =1 , n_colunas

)"
Print # secante_spline_num , "

! end do "

Print # secante_spline_num , " "


Print # secante_spline_num , "

i =1 "

Print # secante_spline_num , "

do linha =1 , n_linhas "

Print # secante_spline_num , "

if ( g_oct / masing < C ( linha ,1) ) exit "

Print # secante_spline_num , "

i = i +1 "

Print # secante_spline_num , "

end do "

Print # secante_spline_num , "

i =i -1 "

Print # secante_spline_num , " "


Print # secante_spline_num , "

g_dif = g_oct / masing - C (i ,1) "

Print # secante_spline_num , "

tau = masing *( C (i ,2) + C (i ,3) * g_dif + C (i ,4) * g_dif **2+ C

(i ,5) * g_dif **3) "


Print # secante_spline_num , " "
Print # secante_spline_num , "

Do While ( erro > 0.000001) "

Print # secante_spline_num , "

aux1 = x_menos1 - tau /( G * g_oct ) "

Print # secante_spline_num , "

aux2 =x - tau /( G * g_oct ) "

Print # secante_spline_num , "

x_pos =( aux2 * x_menos1 - aux1 * x ) /( aux2 - aux1 ) "

Print # secante_spline_num , "

erro = Abs (x - x_pos ) "

Print # secante_spline_num , "

x_menos1 = x "

Print # secante_spline_num , "


Print # secante_spline_num , "

x = x_pos "
end do "

Print # secante_spline_num , " "


Print # secante_spline_num , "

G_sec = x_pos * G "

Print # secante_spline_num , "

! G_sec =1.0* x_pos * G "

Print # secante_spline_num , " "


Print # secante_spline_num , "

Return "

Print # secante_spline_num , "

end subroutine "

Close # s e c a n t e _ s p l i n e _ n u m

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - spline_model
--------------------------------------

s p l i n e _ m o d e l _ nu m = FreeFile

Open spline_model For Output As # s p l in e _ m o d e l _ n u m

125

Print # spline_model_num , "

Subroutine User_Mod ( IDTask , iMod , IsUndr , "

Print # spline_model_num , "

iStep , iter , Iel , Int , "

Print # spline_model_num , "

X, Y, Z,"

Print # spline_model_num , "

Time0 , dTime , "

Print # spline_model_num , "

Props , Sig0 , Swp0 , StVar0 , "

Print # spline_model_num , "

dEps , D , BulkW , "

Print # spline_model_num , "

Sig , Swp , StVar , ipl , "

Print # spline_model_num , "

nStat , NonSym , iStrsDep , iTimeDep

iPrjDir , iPrjLen , iAbort ) "

, iTang , "
Print # spline_model_num , "
Print # spline_model_num , " "
Print # spline_model_num , "

implicit none "

Print # spline_model_num , " "


Print # spline_model_num , "

Real (8) , Dimension (6) :: Sig "

Print # spline_model_num , "

Real (8) , Dimension (6) :: dEps , Sig0 "

Print # spline_model_num , "

Real (8) , Dimension (6) :: dSig "

Print # spline_model_num , "

Real (8) , Dimension (6 ,6) :: D (6 ,6) , D_ne (6 ,6) "

Print # spline_model_num , "

Real (8) , Dimension (50) :: Props "

Print # spline_model_num , "

Real (8) , Dimension (232) :: StVar "

Print # spline_model_num , "

Real (8) , Dimension (232) :: StVar0 "

Print # spline_model_num , "

Real (8) , Dimension (6) :: Eps , Eps0 "

Print # spline_model_num , "

Real (8) , Dimension (6) :: defdist "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

integer (4) :: iMod , IDTask , IsUndr , iStep , iTer , iEl "

Print # spline_model_num , "

integer (4) :: Int "

Print # spline_model_num , "

integer (4) :: iAbort "

Print # spline_model_num , "

integer (4) :: ipl , nStat , NonSym , iStrsDep , iTimeDep "

Print # spline_model_num , "

integer (4) :: iTang , iPrjLen "

Print # spline_model_num , "

integer (4) :: nStatV , iPrjDir "

Print # spline_model_num , " "


Print # spline_model_num , "

Real (8) :: X , Y , Z , Time0 , dTime , Swp0 , dEpsV "

Print # spline_model_num , "

Real (8) :: BulkW , Swp , Fac , Nu_U "

Print # spline_model_num , "

Real (8) :: dSwp = 0 ,

G , Nu "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

integer (4) i , j , caso , ki "

Print # spline_model_num , " "


Print # spline_model_num , "

integer (4) :: masing "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

! Real (8) :: g_ref , g_oct , G_sec , G_sec_0 , g_oct_0

OLD - PEDRO CHITAS ) "


Print # spline_model_num , "

Real (8) :: g_oct , G_sec , G_sec_0 , g_oct_0 "

Print # spline_model_num , "

! Real (8) :: alfa , exp_r , K_sobre_G , K

CHITAS ) "

126

( OLD - PEDRO

Print # spline_model_num , "

Real (8) :: K_sobre_G , K "

Print # spline_model_num , "

Real (8) :: factor_A1 , factor_A2 "

Print # spline_model_num , "

Real (8) :: d_g_oct , sinal_d_g_oct , aux "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

nStatV = 232 "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

include impexp "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

Select Case ( iMod ) "

Print # spline_model_num , "

Case (1) "

Print # spline_model_num , "

Select case ( IDTask ) "

Print # spline_model_num , " "


Print # spline_model_num , "

Case (1) "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

Case (2) ! Obtencao do novo tensor das tensoes "

Print # spline_model_num , "

! e actualizacao das variaveis de estado "

Print # spline_model_num , " "


Print # spline_model_num , "

! Contemplar correctamente caso nao drenado "

Print # spline_model_num , " "


Print # spline_model_num , "

If ( IsUndr . Eq .1) Then "

Print # spline_model_num , "

dEpsV = dEps (1) + dEps (2) + dEps (3) "

Print # spline_model_num , "

dSwp

= BulkW * dEpsV "

Swp

= Swp0 + dSwp "

Print # spline_model_num , "


Print # spline_model_num , "
Print # spline_model_num , "
Print # spline_model_num , "

Else "
Swp = Swp0 "
End If "

Print # spline_model_num , " "


Print # spline_model_num , "

G = Props (1) ! G "

Print # spline_model_num , "

K = Props (2) ! K "

Print # spline_model_num , "

! g_ref = Props (3)

( OLD - PEDRO CHITAS ) "

Print # spline_model_num , "

! alfa = Props (4)

( OLD - PEDRO CHITAS ) "

Print # spline_model_num , "

! exp_r = Props (5)

( OLD - PEDRO CHITAS ) "

Print # spline_model_num , " "


Print # spline_model_num , "

ipl = 0 "

Print # spline_model_num , " "


Print # spline_model_num , "

! Situacao da carregamento nulo "

Print # spline_model_num , " "


Print # spline_model_num , "

do i =1 ,6 "

127

Print # spline_model_num , "

aux = aux + abs ( dEps ( i ) ) "

Print # spline_model_num , "

end do "

Print # spline_model_num , " "


Print # spline_model_num , "

if ( aux . EQ .0.0) then "

Print # spline_model_num , " "


Print # spline_model_num , "

call CopyRVec ( Sig0 , Sig ,6) "

Print # spline_model_num , "

caso = 1 "

Print # spline_model_num , " "


Print # spline_model_num , "

else "

Print # spline_model_num , " "


Print # spline_model_num , "

ipl = 1 "

Print # spline_model_num , "

caso = 1 "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " 100

Call MZeroR ( Eps ,36) "

Print # spline_model_num , "

Call MZeroR ( Eps0 ,36) "

Print # spline_model_num , "

Call MZeroR ( defdist ,6) "

Print # spline_model_num , "

g_oct = 0.0 "

Print # spline_model_num , "

g_oct_0 = 0.0 "

Print # spline_model_num , "

d_g_oct = 0.0 "

Print # spline_model_num , " "


Print # spline_model_num , "

if ( caso . GT .32) then "

Print # spline_model_num , " "


Print # spline_model_num , "

goto 101 "

Print # spline_model_num , " "


Print # spline_model_num , "

end if "

Print # spline_model_num , " "


Print # spline_model_num , "

do i =1 ,3 "

Print # spline_model_num , "

Eps ( i ) = 1.0* StVar0 ( i +6*( caso -1) ) +1.0* dEps ( i ) "

Print # spline_model_num , "

Eps (3+ i ) = 1.0* StVar0 (3+ i +6*( caso -1) ) +1.0* dEps (3+ i

) /2.0 "
Print # spline_model_num , "

end do "

Print # spline_model_num , " "


Print # spline_model_num , "

do i =1 ,6 "

Print # spline_model_num , "

StVar (6*( caso -1) + i ) = 1.0* Eps ( i ) "

Print # spline_model_num , "

Eps0 ( i ) = StVar0 (6*( caso -1) + i ) "

Print # spline_model_num , "

end do "

Print # spline_model_num , " "


Print # spline_model_num , "

Call grandezasD ( dEps , Eps , Eps0 , defdist , g_oct ,

g_oct_0 , "
Print # spline_model_num , "

d_g_oct ) "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

if ( g_oct . GE . StVar0 (200+ caso ) ) then "

Print # spline_model_num , " "


Print # spline_model_num , "

ki = 200+ caso "

Print # spline_model_num , " "


Print # spline_model_num , " "

128

Print # spline_model_num , "

if ( ki . LT .202) then ! Carregamento na curva virgem

"
Print # spline_model_num , " "
Print # spline_model_num , "

! Call CalculoD (K , G , alfa , exp_r , g_ref ,

g_oct , g_oct_0 , "


Print # spline_model_num , "

! d_g_oct , defdist , D_ne )

( OLD -

PEDRO CHITAS ) "


Print # spline_model_num , "

masing =1 "

Print # spline_model_num , "

Call CalculoD (K , G , g_oct , g_oct_0 , "

Print # spline_model_num , "

d_g_oct , defdist , D_ne , masing ) "

Print # spline_model_num , " "


Print # spline_model_num , "

else "

Print # spline_model_num , " "


Print # spline_model_num , "

! Call CalculoD (K , G , alfa , exp_r , 2.0* g_ref ,

g_oct , g_oct_0 , "


Print # spline_model_num , "

! d_g_oct , defdist , D_ne )

( OLD -

PEDRO CHITAS ) "


Print # spline_model_num , "

masing =2 "

Print # spline_model_num , "


Print # spline_model_num , "

Call CalculoD (K , G , g_oct , g_oct_0 , "


*

d_g_oct , defdist , D_ne , masing ) "

Print # spline_model_num , " "


Print # spline_model_num , "

end if "

Print # spline_model_num , " "


Print # spline_model_num , "

Call MatVec ( D_ne , 6 , dEps , 6 , dSig ) "

Print # spline_model_num , "

Call AddVec ( Sig0 , dSig , 1 d0 , 1 d0 , 6 , Sig ) "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

StVar (200+ caso ) = g_oct "

Print # spline_model_num , " "


Print # spline_model_num , "

do i = caso ,32 "

Print # spline_model_num , "


Print # spline_model_num , "

StVar (201+ i ) = 0.0 "


end do "

Print # spline_model_num , " "


Print # spline_model_num , "

i =200 "

Print # spline_model_num , " "


Print # spline_model_num , "

ki =6*( caso ) "

Print # spline_model_num , " "


Print # spline_model_num , "

do while ( i . Gt . ki ) "

Print # spline_model_num , "

StVar ( i ) = 0.0 "

Print # spline_model_num , "

i =i -1 "

Print # spline_model_num , "

end do "

Print # spline_model_num , " "


Print # spline_model_num , "

else "

Print # spline_model_num , " "


Print # spline_model_num , "

StVar (200+ caso ) = StVar0 (200+ caso ) "

Print # spline_model_num , "

caso = caso +1 "

Print # spline_model_num , " "


Print # spline_model_num , "

Goto 100 "

Print # spline_model_num , " "

129

Print # spline_model_num , "

end if "

Print # spline_model_num , " "


Print # spline_model_num , "

end if "

Print # spline_model_num , " "


Print # spline_model_num , " 101

continue "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

Case (3) "

Print # spline_model_num , " "


Print # spline_model_num , "

G = Props (1) ! G "

Print # spline_model_num , "

K = Props (2) ! K "

Print # spline_model_num , " "


Print # spline_model_num , "

call MZeroR (D ,36) "

Print # spline_model_num , "

factor_A1 = 1.0* K +4.0/3.0* G "

Print # spline_model_num , "

factor_A2 = 1.0* K -2.0/3.0* G "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "
Print # spline_model_num , "

Do i =1 ,3 "
Do j =1 ,3 "

Print # spline_model_num , "

D (i , j ) = factor_A2 "

Print # spline_model_num , "

End Do "

Print # spline_model_num , "

D (i , i ) = factor_A1 "

Print # spline_model_num , "

D ( i +3 , i +3) = G "

Print # spline_model_num , "

End Do "

Print # spline_model_num , "

BulkW = 0 "

Print # spline_model_num , "


Print # spline_model_num , "

If ( IsUndr . Eq .1) Then "


Nu = (3.0* K -2.0* G ) /(2.0*(3.0* K +1.0* G ) ) "

Print # spline_model_num , "

Nu_U = 0.495 d0 "

Print # spline_model_num , "

Fac =(1+ Nu_U ) /(1 -2* Nu_U ) - (1+ Nu ) /(1 -2* Nu ) "

Print # spline_model_num , "

Fac =2 D0 * G /3 D0

Print # spline_model_num , "

BulkW = Fac "

Print # spline_model_num , "

* Fac "

End If "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

!!!!!!!!!!!!! Declaracao do numero de variaveis de

estado ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! "
Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

Case (4) "

Print # spline_model_num , "

nStat

= nStatV "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

! !!!!!!!! !!!!! Atributos da matriz de rigidez D

!!!!!!!!!!!!!!!!!!!!!!! "
Print # spline_model_num , " "
Print # spline_model_num , "

Case (5) ! matrix type "

Print # spline_model_num , "

NonSym

Print # spline_model_num , "

iStrsDep = 0

= 0

130

! 1 for non - symmetric D - matrix "


! 1 for stress dependent D - matrix "

Print # spline_model_num , "

iTang

Print # spline_model_num , "

iTimeDep = 0

= 0

! 1 for tangent D - matrix "


! 1 for time dependent D - matrix "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

! !!!!!!!!!!!!! Matriz D elastica com parametros

iniciais ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! "
Print # spline_model_num , " "
Print # spline_model_num , "

Case (6) "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

G = Props (1) ! G "

Print # spline_model_num , "

K = Props (2) ! K "

Print # spline_model_num , "

call MZeroR (D ,36) "

Print # spline_model_num , "

factor_A1 = 1.0* K +4.0/3.0* G "

Print # spline_model_num , "

factor_A2 = 1.0* K -2.0/3.0* G "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "
Print # spline_model_num , "

Do i =1 ,3 "
Do j =1 ,3 "

Print # spline_model_num , "

D (i , j ) = factor_A2 "

Print # spline_model_num , "

End Do "

Print # spline_model_num , "

D (i , i ) = factor_A1 "

Print # spline_model_num , "

D ( i +3 , i +3) = G "

Print # spline_model_num , "

End Do "

Print # spline_model_num , "

BulkW = 0 "

Print # spline_model_num , " "


Print # spline_model_num , "

If ( IsUndr . Eq .1) Then "

Print # spline_model_num , "

Nu = (3.0* K -2.0* G ) /(2.0*(3.0* K +1.0* G ) ) "

Print # spline_model_num , "

Nu_U = 0.495 d0 "

Print # spline_model_num , "

Fac =(1+ Nu_U ) /(1 -2* Nu_U ) - (1+ Nu ) /(1 -2* Nu ) "

Print # spline_model_num , "

Fac =2 D0 * G /3 D0

Print # spline_model_num , "


Print # spline_model_num , "

* Fac "

BulkW = Fac "


End If "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "
Print # spline_model_num , "

case default "


Write (1 ,*) Erro no IDTask , IDTask "

Print # spline_model_num , "

Write (1 ,*) IDTask : , IDTask "

Print # spline_model_num , "

iAbort =1 "

Print # spline_model_num , " "


Print # spline_model_num , "

End Select "

Print # spline_model_num , " "


Print # spline_model_num , "

Case Default "

Print # spline_model_num , "

Write (1 ,*) invalid model number in UsrMod , iMod "

Print # spline_model_num , "

Write (1 ,*) IDTask : , IDTask "

Print # spline_model_num , "

Stop invalid model number in UsrMod "

Print # spline_model_num , "

iAbort =1 "

Print # spline_model_num , "

Return "

131

Print # spline_model_num , " "


Print # spline_model_num , "

End Select "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , "

Return "

Print # spline_model_num , " "


Print # spline_model_num , "

End "

Print # spline_model_num , " "


Print # spline_model_num , " "
Print # spline_model_num , " "
Print # spline_model_num , "

include usrlib . for "

Print # spline_model_num , "

include s e c a n t e _ s p l i n e _ v a l . for "

Print # spline_model_num , "

include grandezasD . for "

Print # spline_model_num , "

include CalculoD . for "

Close # s e c a n t e _ s p l i n e _ n u m

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - usrlib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

usrlib_num = FreeFile

Open usrlib For Output As # usrlib_num

Print # usrlib_num , "

subroutine MZeroR (R , k ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To make a real array R with dimension K to zero "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension R (*) "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

Do J =1 , K "
R ( j ) =0 "
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , " "
Print # usrlib_num , "

subroutine MZEROI (i , k ) "

Print # usrlib_num , " C "

132

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To make an integre array I with Dimension K to zero

"
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Dimension I (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

Do J =1 , K "

Print # usrlib_num , "

i ( j ) =0 "

Print # usrlib_num , "

End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , "

subroutine SETRVAL (R ,k , v ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To fill a real array R with Dimension K with value

V"
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension R (*) "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

Do J =1 , K "
R(j)=v"
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , "

subroutine SETIVAL (i ,k , iV ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To fill an integer array I with Dimension K with

value IV "
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "

133

Print # usrlib_num , " C "


Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension I (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

Do J =1 , K "

Print # usrlib_num , "


Print # usrlib_num , "

i ( j ) = iV "
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , "

subroutine COPYIVEC ( I1 , I2 , k ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To copy an integer array I1 with Dimension K to I2 "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension I1 (*) , I2 (*) "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

Do

J =1 , K "
I2 ( j ) = I1 ( j ) "

End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , "

subroutine CopyRVec ( R1 , R2 , k ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To copy a Double array R1 with Dimension K to R2 "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension R1 (*) , R2 (*) "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

Do J =1 , K "
R2 ( j ) = R1 ( j ) "
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

134

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , " "
Print # usrlib_num , "

Logical Function IS0ARR (A , N ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C

Function :

To check whether a real array contains only zero

values . "
Print # usrlib_num , " C

When an array contains only zero s is might not

need to be "
Print # usrlib_num , " C

written to the XXX file . "

Print # usrlib_num , " C

exit Function when first non - zero value occured or

when "
Print # usrlib_num , " C

all elements are checked and are zero . "

Print # usrlib_num , " C "


Print # usrlib_num , " C

Input :

Print # usrlib_num , " C

A : array to be checked "


N : number of elements in array that should be checked

"
Print # usrlib_num , " C "
Print # usrlib_num , " C

Output : . TRUE .

Print # usrlib_num , " C

when all elements are 0 "

. FALSE . when at least one element is not zero "

Print # usrlib_num , " C "


Print # usrlib_num , " C

Called by :

Subroutine TOBXX "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension A (*) "

Print # usrlib_num , "

Is0Arr =. False . "

Print # usrlib_num , "

Do I =1 , N "

Print # usrlib_num , "

if ( A ( I ) . Ne . 0 ) Return "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Is0Arr =. True . "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " "


Print # usrlib_num , "

Logical Function IS0IARR ( IARR , N ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C

Function :

To check whether a integer array contains only

zero values . "


Print # usrlib_num , " C

Similar to IS0ARR "

Print # usrlib_num , " C "


Print # usrlib_num , " C
Print # usrlib_num , " C

Input :

IARR : array to be checked "


N

: number of elements in array that should be

checked "

135

Print # usrlib_num , " C "


Print # usrlib_num , " C

Output : . TRUE .

Print # usrlib_num , " C

when all elements are 0 "

. FALSE . when at least one element is not zero "

Print # usrlib_num , " C "


Print # usrlib_num , " C

Called by :

Subroutine TOBXX "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension IARR (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

Is0IArr =. False . "

Print # usrlib_num , "

Do I =1 , N "

Print # usrlib_num , "

if ( IARR ( I ) . Ne . 0 ) Return "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Is0IArr =. True . "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine MulVec (v ,f , k ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Function : To multiply a real vector V with dimension K by F "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

IMPLICIT DOUBLE PRECISION (A -H ,O - Z ) "

Print # usrlib_num , "

DIMENSION V (*) "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

Do J =1 , K "
v(j)=f*v(j)"
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine Mulvec "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine MatVec ( xMat , IM , Vec ,n , VecR ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Calculate VecR = xMat * Vec "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

xMat

:( Square ) Matrix ( IM ,*) "

Print # usrlib_num , " C I

Vec

: Vector "

136

Print # usrlib_num , " C I

: Number of rows / colums "

Print # usrlib_num , " C O

VecR

: Resulting vector "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xMat ( IM ,*) , Vec (*) , VecR (*) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Do I =1 , N "

Print # usrlib_num , "

x =0 "

Print # usrlib_num , "

Do J =1 , N "

Print # usrlib_num , "

x = x + xMat (i , j ) * Vec ( j ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

VecR ( i ) = x "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine MatVec "

Print # usrlib_num , " "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine AddVec ( Vec1 , Vec2 , R1 , R2 ,n , VecR ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Calculate VecR () = R1 * Vec1 () + R2 * Vec2 () "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

Vec1 , "

Print # usrlib_num , " C I

Vec2

Print # usrlib_num , " C I

R1 , R2 : Multipliers "

Print # usrlib_num , " C I

: Number of rows "

Print # usrlib_num , " C O

VecR

: Resulting vector "

: Vectors "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension Vec1 (*) , Vec2 (*) , VecR (*) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Do I =1 , N "

Print # usrlib_num , "

x = R1 * Vec1 ( i ) + R2 * Vec2 ( i ) "

Print # usrlib_num , "

VecR ( i ) = x "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine AddVec "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Double Precision Function DInProd (A ,B , N ) "

137

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Returns the Inproduct of two vectors "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

A,B

: Two vectors "

Print # usrlib_num , " C I

: Used length of vectors "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension A (*) ,B (*) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " "
Print # usrlib_num , "

x =0 "

Print # usrlib_num , "

Do I =1 , N "

Print # usrlib_num , "


Print # usrlib_num , "

x=x+a(i)*B(i)"
End Do "

Print # usrlib_num , "

DInProd = x "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Function DInProd "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine MatMat ( xMat1 , Id1 , xMat2 , Id2 , nR1 , nC2 , nC1 , xMatR , IdR ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Calculate xMatR = xMat1 * xMat2 "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

xMat1 : Matrix ( Id1 ,*) "

Print # usrlib_num , " C I

xMat2 : Matrix ( Id2 ,*) "

Print # usrlib_num , " C I

nR1

: Number of rows in resulting matrix

nC2

: Number of columns in resulting matrix (= No cols in

nC1

: Number of columns in matrix xMat1 "

(= No rows in

xMat1 ) "
Print # usrlib_num , " C I
xMat2 ) "
Print # usrlib_num , " C I
Print # usrlib_num , " C
Print # usrlib_num , " C O

= Number

rows

in matrix xMat2 "

xMatR : Resulting matrix ( IdR ,*) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xMat1 ( Id1 ,*) , xMat2 ( Id2 ,*) , xMatR ( IdR ,*) "

Print # usrlib_num , " C


********************************************************************** "
Print # usrlib_num , " "
Print # usrlib_num , "
Print # usrlib_num , "

Do I =1 , nR1 "
Do J =1 , nC2 "

138

Print # usrlib_num , "

x =0 "

Print # usrlib_num , "

Do K =1 , nC1 "

Print # usrlib_num , "

x = x + xMat1 (i , k ) * xMat2 (k , j ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

xMatR (i , j ) = x "

Print # usrlib_num , "


Print # usrlib_num , "

End Do "
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine MatMat "

Print # usrlib_num , " "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine MatMatSq (n , xMat1 , xMat2 , xMatR ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Calculate xMatR = xMat1 * xMat2 for square matrices , size n "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

: Dimension of matrices "

Print # usrlib_num , " C I

xMat1 : Matrix (n ,*) "

Print # usrlib_num , " C I

xMat2 : Matrix (n ,*) "

Print # usrlib_num , " C O

xMatR : Resulting matrix (n ,*) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xMat1 (n ,*) , xMat2 (n ,*) , xMatR (n ,*) "

Print # usrlib_num , " C


********************************************************************** "
Print # usrlib_num , " "
Print # usrlib_num , "
Print # usrlib_num , "

Do I =1 , n "
Do J =1 , n "

Print # usrlib_num , "

x =0 "

Print # usrlib_num , "

Do K =1 , n "

Print # usrlib_num , "

x = x + xMat1 (i , k ) * xMat2 (k , j ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

xMatR (i , j ) = x "

Print # usrlib_num , "


Print # usrlib_num , "

End Do "
End Do "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine MatMatSq "

Print # usrlib_num , " "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine WriVal ( io ,C , v ) "

Print # usrlib_num , " C


*********************************************************************** "

139

Print # usrlib_num , " C "


Print # usrlib_num , " C Write ( Double ) value to file unit io ( when io >0) "
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "

Write ( io ,*) C , V "


1 Format ( A ,3 x ,1 x ,1 p , e12 .5) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine WriIVl ( io ,C , i ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C Write ( integer ) value to file unit io ( when io >0) "
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "

Write ( io ,*) C , I "


1 Format ( A ,3 x ,1 x , I6 ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine WriIVc ( io ,C , iV , n ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C Write ( integer ) vector to file unit io ( when io >0) "
Print # usrlib_num , " C "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , "

Dimension iV (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "

140

Print # usrlib_num , "

Write ( io ,*) C "

Print # usrlib_num , "

Write ( io ,1) ( iv ( i ) ,i =1 , n ) "

Print # usrlib_num , "

1 Format (( 2(3 x ,5 i4 ) ) ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine WriVec ( io ,C ,v , n ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C Write ( Double ) vector to file unit io ( when io >0) "
Print # usrlib_num , " C 6 values per line "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , "

Dimension V (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

if ( Len_Trim ( C ) . Le .6) Then "


Write ( io ,2) C ,( V ( i ) ,i =1 , n ) "
Else "

Print # usrlib_num , "

Write ( io ,*) C "

Print # usrlib_num , "

Write ( io ,1) ( V ( i ) ,i =1 , n ) "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

1 Format (( 2(1 x ,3(1 x ,1 p , e10 .3) ) ) ) "

Print # usrlib_num , "

2 Format ( A ,( T7 ,2(1 x ,3(1 x ,1 p , e10 .3) ) ) ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine WriVec5 ( io ,C ,v , n ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C Write ( Double ) vector to file unit io ( when io >0) "
Print # usrlib_num , " C 5 values per line "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , "

Dimension V (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "


Print # usrlib_num , "

Write ( io ,*) C "

Print # usrlib_num , "

Write ( io ,1) ( V ( i ) ,i =1 , n ) "

141

Print # usrlib_num , "

1 Format ( 5(1 x ,1 p , e12 .5) ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine WriMat ( io ,C ,v , nd , nr , nc ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C Write ( Double ) matrix to file unit io ( when io >0) "
Print # usrlib_num , " C 6 values per line "
Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Character C *(*) "

Print # usrlib_num , "

Dimension V ( nd ,*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( io . Le .0) Return "

Print # usrlib_num , " "


Print # usrlib_num , "

Write ( io ,*) C "

Print # usrlib_num , "

Do j =1 , nr "

Print # usrlib_num , "


Print # usrlib_num , "
Print # usrlib_num , "

Write ( io ,1) j ,( V (j , i ) ,i =1 , nc ) "


End Do "
1 Format ( i4 ,(

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

T7 ,2(1 x ,3(1 x ,1 p , e10 .3) ) ) ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " "
Print # usrlib_num , "

subroutine MatInvPiv ( AOrig ,B , n ) "

Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension Aorig (n ,*) ,B (n ,*) ,A (: ,:) "

Print # usrlib_num , "

Allocatable :: a "

Print # usrlib_num , "

Allocate ( A (n , n ) ) ! No error checking !! "

Print # usrlib_num , "

Call CopyRVec ( AOrig ,a , n * n ) "

Print # usrlib_num , "

Call MZeroR (B , n * n ) "

Print # usrlib_num , "

Do i =1 , n "

Print # usrlib_num , "

B (i , i ) =1 "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Do I =1 , n "

Print # usrlib_num , "

T = a (i , i ) "

Print # usrlib_num , "

iPiv = i "

Print # usrlib_num , "

Do j = i +1 , n "

Print # usrlib_num , "

if ( Abs ( A (j , i ) ) . Gt . Abs ( A ( iPiv , i ) )

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

if ( iPiv . Ne . i ) Then "

Print # usrlib_num , "

Do j =1 , n "

Print # usrlib_num , "

x = a (i , j ) "

Print # usrlib_num , "

a (i , j ) = a ( iPiv , j ) "

142

) iPiv = j "

Print # usrlib_num , "

a ( iPiv , j ) = x "

Print # usrlib_num , "

x = B (i , j ) "

Print # usrlib_num , "

B (i , j ) = B ( iPiv , j ) "

Print # usrlib_num , "

B ( iPiv , j ) = x "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

T = a (i , i ) "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

Do J =1 , n "

Print # usrlib_num , "

a (i , j ) = a (i , j ) / T "

Print # usrlib_num , "

B (i , j ) = B (i , j ) / T "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Do K =1 , n "

Print # usrlib_num , "

if ( k . Ne . i ) Then "

Print # usrlib_num , "

T = a (k , i ) "

Print # usrlib_num , "

Do J =1 , n "

Print # usrlib_num , "

a (k , j ) = a (k , j ) -T * a (i , j ) "

Print # usrlib_num , "

B (k , j ) = B (k , j ) -T * B (i , j ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

DeAllocate ( a ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End ! MatinvPiv "

Print # usrlib_num , " "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine PrnSig ( iOpt ,S , xN1 , xN2 , xN3 , S1 , S2 , S3 ,p , Q ) "

Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension S (*) , xN1 (*) , xN2 (*) , xN3 (*) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( iOpt . Eq .1) Then "

Print # usrlib_num , "

Call Eig_3 (0 ,S , xN1 , xN2 , xN3 , S1 , S2 , S3 ,P , Q ) ! with

Eigenvectors "
Print # usrlib_num , "

Else "

Print # usrlib_num , "

Call Eig_3a (0 ,S , S1 , S2 , S3 ,P , Q ) ! no Eigenvectors "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

subroutine Eig_3 ( iOpt , St , xN1 , xN2 , xN3 , S1 , S2 , S3 ,p , Q ) "

Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension St (6) ,A (3 ,3) ,V (3 ,3) ,"

Print # usrlib_num , "

xN1 (3) , xN2 (3) , xN3 (3) "

Print # usrlib_num , "

!"

Print # usrlib_num , "

! Get Eigenvalues / Eigenvectors for 3*3 matrix "

Print # usrlib_num , "

! Wim Bomhof 15/11/ 01 "

Print # usrlib_num , "

! PGB : adaption to Principal stress calculation "

143

Print # usrlib_num , "

!"

Print # usrlib_num , "

! Applied on principal stresses , directions "

Print # usrlib_num , "

! Stress vector St () : XX , YY , ZZ , XY , YZ , ZX "

Print # usrlib_num , "

!"

Print # usrlib_num , "

A (1 ,1) = St (1) ! xx "

Print # usrlib_num , "

A (1 ,2) = St (4) ! xy = yx "

Print # usrlib_num , "

A (1 ,3) = St (6) ! zx = xz "

Print # usrlib_num , " "


Print # usrlib_num , "

A (2 ,1) = St (4) ! xy = yx "

Print # usrlib_num , "

A (2 ,2) = St (2) ! yy "

Print # usrlib_num , "

A (2 ,3) = St (5) ! zy = yz "

Print # usrlib_num , " "


Print # usrlib_num , "

A (3 ,1) = St (6) ! zx = xz "

Print # usrlib_num , "

A (3 ,2) = St (5) ! zy = yz "

Print # usrlib_num , "

A (3 ,3) = St (3) ! zz "

Print # usrlib_num , " "


Print # usrlib_num , "

! Set V to unity matrix "

Print # usrlib_num , "

v (1 ,1) =1 "

Print # usrlib_num , "

v (2 ,1) =0 "

Print # usrlib_num , "

v (3 ,1) =0 "

Print # usrlib_num , " "


Print # usrlib_num , "

v (1 ,2) =0 "

Print # usrlib_num , "

v (2 ,2) =1 "

Print # usrlib_num , "

v (3 ,2) =0 "

Print # usrlib_num , " "


Print # usrlib_num , "

v (1 ,3) =0 "

Print # usrlib_num , "

v (2 ,3) =0 "

Print # usrlib_num , "

v (3 ,3) =1 "

Print # usrlib_num , " "


Print # usrlib_num , " "
Print # usrlib_num , "

abs_max_s =0 "

Print # usrlib_num , "

Do i =1 ,3 "

Print # usrlib_num , "

Do j =1 ,3 "

Print # usrlib_num , "

if ( abs ( a (i , j ) ) . Gt . abs_max_s ) abs_max_s = abs ( a (i , j ) ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Tol =1 E -20* abs_max_s "

Print # usrlib_num , "

it =0 "

Print # usrlib_num , "

itmax =50 "

Print # usrlib_num , "

Do While ( it . Lt . itMax . And . "

Print # usrlib_num , "

abs ( a (1 ,2) ) + abs ( a (2 ,3) ) + abs ( a (1 ,3) ) . Gt . Tol ) "

Print # usrlib_num , "

it = it +1 "

Print # usrlib_num , "

Do k =1 ,3 "

Print # usrlib_num , "

if ( k . Eq . 1) Then "

Print # usrlib_num , "

ip =1 "

Print # usrlib_num , "

iq =2 "

Print # usrlib_num , "

Else if ( k . Eq .2) Then "

Print # usrlib_num , "

ip =2 "

Print # usrlib_num , "

iq =3 "

144

Print # usrlib_num , "


Print # usrlib_num , "

Else "
ip =1 "

Print # usrlib_num , "

iq =3 "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( a ( ip , iq ) . Ne . 0.0) Then "

Print # usrlib_num , "

tau =( a ( iq , iq ) -a ( ip , ip ) ) /(2* a ( ip , iq ) ) "

Print # usrlib_num , "

if ( tau . Ge .0.0) Then "

Print # usrlib_num , "


Print # usrlib_num , "
Print # usrlib_num , "

sign_tau =1 "
Else "
sign_tau = -1 "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

T = sign_tau /( Abs ( tau ) + sqrt (1+ tau * tau ) ) "

Print # usrlib_num , "

C =1/ sqrt (1+ T * T ) "

Print # usrlib_num , "

S=T*C"

Print # usrlib_num , "

a1p = C * a (1 , ip ) -S * a (1 , iq ) "

Print # usrlib_num , "

a2p = C * a (2 , ip ) -S * a (2 , iq ) "

Print # usrlib_num , "

a3p = C * a (3 , ip ) -S * a (3 , iq ) "

Print # usrlib_num , "

a (1 , iq ) = S * a (1 , ip ) + C * a (1 , iq ) "

Print # usrlib_num , "

a (2 , iq ) = S * a (2 , ip ) + C * a (2 , iq ) "

Print # usrlib_num , "

a (3 , iq ) = S * a (3 , ip ) + C * a (3 , iq ) "

Print # usrlib_num , "

a (1 , ip ) = a1p "

Print # usrlib_num , "

a (2 , ip ) = a2p "

Print # usrlib_num , "

a (3 , ip ) = a3p "

Print # usrlib_num , " "


Print # usrlib_num , "

v1p = C * v (1 , ip ) -S * v (1 , iq ) "

Print # usrlib_num , "

v2p = C * v (2 , ip ) -S * v (2 , iq ) "

Print # usrlib_num , "

v3p = C * v (3 , ip ) -S * v (3 , iq ) "

Print # usrlib_num , "

v (1 , iq ) = S * v (1 , ip ) + C * v (1 , iq ) "

Print # usrlib_num , "

v (2 , iq ) = S * v (2 , ip ) + C * v (2 , iq ) "

Print # usrlib_num , "

v (3 , iq ) = S * v (3 , ip ) + C * v (3 , iq ) "

Print # usrlib_num , "

v (1 , ip ) = v1p "

Print # usrlib_num , "

v (2 , ip ) = v2p "

Print # usrlib_num , "

v (3 , ip ) = v3p "

Print # usrlib_num , " "


Print # usrlib_num , "

ap1 = C * a ( ip ,1) -S * a ( iq ,1) "

Print # usrlib_num , "

ap2 = C * a ( ip ,2) -S * a ( iq ,2) "

Print # usrlib_num , "

ap3 = C * a ( ip ,3) -S * a ( iq ,3) "

Print # usrlib_num , "

a ( iq ,1) = S * a ( ip ,1) + C * a ( iq ,1) "

Print # usrlib_num , "

a ( iq ,2) = S * a ( ip ,2) + C * a ( iq ,2) "

Print # usrlib_num , "

a ( iq ,3) = S * a ( ip ,3) + C * a ( iq ,3) "

Print # usrlib_num , "

a ( ip ,1) = ap1 "

Print # usrlib_num , "

a ( ip ,2) = ap2 "

Print # usrlib_num , "


Print # usrlib_num , "

a ( ip ,3) = ap3 "


End If ! a ( ip , iq ) < >0 "

Print # usrlib_num , "

End Do ! k "

Print # usrlib_num , "

End Do ! While "

Print # usrlib_num , "

! principal values on diagonal of a "

Print # usrlib_num , "

S1 = a (1 ,1) "

Print # usrlib_num , "

S2 = a (2 ,2) "

145

Print # usrlib_num , "

S3 = a (3 ,3) "

Print # usrlib_num , "

! Derived invariants "

Print # usrlib_num , "

p =( S1 + S2 + S3 ) /3 "

Print # usrlib_num , "

Q = Sqrt ((( S1 - S2 ) **2+( S2 - S3 ) **2+( S3 - S1 ) **2 ) /2 ) "

Print # usrlib_num , " "


Print # usrlib_num , "

! Sort eigenvalues S1 <= S2 <= S3 "

Print # usrlib_num , "

is1 =1 "

Print # usrlib_num , "

is2 =2 "

Print # usrlib_num , "

is3 =3 "

Print # usrlib_num , "

if ( S1 . Gt . S2 ) Then "

Print # usrlib_num , "

T = S2 "

Print # usrlib_num , "

S2 = S1 "

Print # usrlib_num , "

S1 = T "

Print # usrlib_num , "

it = is2 "

Print # usrlib_num , "

is2 = is1 "

Print # usrlib_num , "

is1 = it "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( S2 . Gt . S3 ) Then "

Print # usrlib_num , "

T = S3 "

Print # usrlib_num , "

S3 = S2 "

Print # usrlib_num , "

S2 = T "

Print # usrlib_num , "

it = is3 "

Print # usrlib_num , "

is3 = is2 "

Print # usrlib_num , "

is2 = it "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( S1 . Gt . S2 ) Then "

Print # usrlib_num , "

T = S2 "

Print # usrlib_num , "

S2 = S1 "

Print # usrlib_num , "

S1 = T "

Print # usrlib_num , "

it = is2 "

Print # usrlib_num , "

is2 = is1 "

Print # usrlib_num , "

is1 = it "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

Do i =1 ,3 "

Print # usrlib_num , "

xN1 ( i ) = v (i , is1 ) ! first

Print # usrlib_num , "

xN2 ( i ) = v (i , is2 ) ! second column "

Print # usrlib_num , "

xN3 ( i ) = v (i , is3 ) ! third

Print # usrlib_num , "

column "

column "

End Do "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End ! Eig_3 "

Print # usrlib_num , " "


Print # usrlib_num , "

Subroutine Eig_3a ( iOpt , St , S1 , S2 , S3 ,P , Q ) ! xN1 , xN2 , xN3 , "

Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension St (6) ,A (3 ,3)

Print # usrlib_num , "

!"

Print # usrlib_num , "

! Get Eigenvalues ( no Eigenvectors ) for 3*3 matrix "

Print # usrlib_num , "

! Wim Bomhof 15/11/ 01 "

Print # usrlib_num , "

!"

Print # usrlib_num , "

! Applied on principal stresses , directions "

146

V (3 ,3) , xN1 (3) , xN2 (3) , xN3 (3) "

Print # usrlib_num , "

! Stress vector XX , YY , ZZ , XY , YZ , ZX "

Print # usrlib_num , "

!"

Print # usrlib_num , "

A (1 ,1) = St (1) ! xx "

Print # usrlib_num , "

A (1 ,2) = St (4) ! xy = yx "

Print # usrlib_num , "

A (1 ,3) = St (6) ! zx = xz "

Print # usrlib_num , " "


Print # usrlib_num , "

A (2 ,1) = St (4) ! xy = yx "

Print # usrlib_num , "

A (2 ,2) = St (2) ! yy "

Print # usrlib_num , "

A (2 ,3) = St (5) ! zy = yz "

Print # usrlib_num , " "


Print # usrlib_num , "

A (3 ,1) = St (6) ! zx = xz "

Print # usrlib_num , "

A (3 ,2) = St (5) ! zy = yz "

Print # usrlib_num , "

A (3 ,3) = St (3) ! zz "

Print # usrlib_num , " "


Print # usrlib_num , "

abs_max_s =0 "

Print # usrlib_num , "

Do i =1 ,3 "

Print # usrlib_num , "

Do j =1 ,3 "

Print # usrlib_num , "

if ( abs ( a (i , j ) ) . Gt . abs_max_s ) abs_max_s = abs ( a (i , j ) ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

Tol =1 E -20* abs_max_s "

Print # usrlib_num , "

if ( iOpt . Eq .1) Tol =1 d -50* abs_max_s "

Print # usrlib_num , "

it =0 "

Print # usrlib_num , "

itmax =50 "

Print # usrlib_num , "


Print # usrlib_num , "

Do While ( it . lt . itmax . And . "


*

abs ( a (1 ,2) ) + abs ( a (2 ,3) ) + abs ( a (1 ,3) ) . Gt . Tol ) "

Print # usrlib_num , " "


Print # usrlib_num , "

it = it +1 "

Print # usrlib_num , "

Do k =1 ,3 "

Print # usrlib_num , "


Print # usrlib_num , "
Print # usrlib_num , "
Print # usrlib_num , "

if ( k . Eq . 1) Then "
ip =1 "
iq =2 "
Else if ( k . Eq .2) Then "

Print # usrlib_num , "

ip =2 "

Print # usrlib_num , "

iq =3 "

Print # usrlib_num , "

Else "

Print # usrlib_num , "

ip =1 "

Print # usrlib_num , "

iq =3 "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( a ( ip , iq ) . Ne . 0.0) Then

! ongelijk nul ? "

Print # usrlib_num , "

tau =( a ( iq , iq ) -a ( ip , ip ) ) /(2* a ( ip , iq ) ) "

Print # usrlib_num , "

if ( tau . Ge .0.0) Then "

Print # usrlib_num , "


Print # usrlib_num , "
Print # usrlib_num , "

sign_tau =1 "
Else "
sign_tau = -1 "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

T = sign_tau /( Abs ( tau ) + sqrt (1+ tau * tau ) ) "

Print # usrlib_num , "

C =1/ sqrt (1+ T * T ) "

Print # usrlib_num , "

S=T*C"

147

Print # usrlib_num , "

a1p = C * a (1 , ip ) -S * a (1 , iq ) "

Print # usrlib_num , "

a2p = C * a (2 , ip ) -S * a (2 , iq ) "

Print # usrlib_num , "

a3p = C * a (3 , ip ) -S * a (3 , iq ) "

Print # usrlib_num , "

a (1 , iq ) = S * a (1 , ip ) + C * a (1 , iq ) "

Print # usrlib_num , "

a (2 , iq ) = S * a (2 , ip ) + C * a (2 , iq ) "

Print # usrlib_num , "

a (3 , iq ) = S * a (3 , ip ) + C * a (3 , iq ) "

Print # usrlib_num , "

a (1 , ip ) = a1p "

Print # usrlib_num , "

a (2 , ip ) = a2p "

Print # usrlib_num , "

a (3 , ip ) = a3p "

Print # usrlib_num , " "


Print # usrlib_num , "

ap1 = C * a ( ip ,1) -S * a ( iq ,1) "

Print # usrlib_num , "

ap2 = C * a ( ip ,2) -S * a ( iq ,2) "

Print # usrlib_num , "

ap3 = C * a ( ip ,3) -S * a ( iq ,3) "

Print # usrlib_num , "

a ( iq ,1) = S * a ( ip ,1) + C * a ( iq ,1) "

Print # usrlib_num , "

a ( iq ,2) = S * a ( ip ,2) + C * a ( iq ,2) "

Print # usrlib_num , "

a ( iq ,3) = S * a ( ip ,3) + C * a ( iq ,3) "

Print # usrlib_num , "

a ( ip ,1) = ap1 "

Print # usrlib_num , "

a ( ip ,2) = ap2 "

Print # usrlib_num , "


Print # usrlib_num , "

a ( ip ,3) = ap3 "


End If ! a ( ip , iq ) < >0 "

Print # usrlib_num , "

End Do ! k "

Print # usrlib_num , "

End Do ! While "

Print # usrlib_num , "

! principal values on diagonal of a "

Print # usrlib_num , "

S1 = a (1 ,1) "

Print # usrlib_num , "

S2 = a (2 ,2) "

Print # usrlib_num , "

S3 = a (3 ,3) "

Print # usrlib_num , "

! Derived invariants "

Print # usrlib_num , "

p =( S1 + S2 + S3 ) /3 "

Print # usrlib_num , "

Q = Sqrt ((( S1 - S2 ) **2+( S2 - S3 ) **2+( S3 - S1 ) **2 ) /2 ) "

Print # usrlib_num , " "


Print # usrlib_num , "

if ( S1 . Gt . S2 ) Then "

Print # usrlib_num , "

T = S2 "

Print # usrlib_num , "

S2 = S1 "

Print # usrlib_num , "

S1 = T "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( S2 . Gt . S3 ) Then "

Print # usrlib_num , "

T = S3 "

Print # usrlib_num , "

S3 = S2 "

Print # usrlib_num , "

S2 = T "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

if ( S1 . Gt . S2 ) Then "

Print # usrlib_num , "

T = S2 "

Print # usrlib_num , "

S2 = S1 "

Print # usrlib_num , "

S1 = T "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End ! Eig_3a "

Print # usrlib_num , " "


Print # usrlib_num , " C "

148

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Logical Function LEqual (A ,B , Eps ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Returns . TRUE .

when two real values are ( almost ) equal , "

Print # usrlib_num , " C . False . otherwise "


Print # usrlib_num , " C "
Print # usrlib_num , " C I

A,B

: Two real values to be compared "

Print # usrlib_num , " C I

Eps

: Toleration ( Magnitude ~= 1E -5) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

LEqual =. True . "

Print # usrlib_num , "

if ( A . Eq . B ) Return "

Print # usrlib_num , "

if ( DAbs (A - B ) . LT . 0.5 D0 * Eps *( DAbs ( A ) + DAbs ( B ) + Eps ) ) Return "

Print # usrlib_num , "

LEqual =. False . "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! function LEqual "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine CrossProd ( xN1 , xN2 , xN3 ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Returns cross product of xN1 and xN2 "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

xN1 , xN2 : Two basic vectors "

Print # usrlib_num , " C O

xN3

: Resulting vector "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xN1 (*) , xN2 (*) , xN3 (*) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " "
Print # usrlib_num , "

xN3 (1) = xN1 (2) * xN2 (3) - xN1 (3) * xN2 (2) "

Print # usrlib_num , "

xN3 (2) = xN1 (3) * xN2 (1) - xN1 (1) * xN2 (3) "

Print # usrlib_num , "

xN3 (3) = xN1 (1) * xN2 (2) - xN1 (2) * xN2 (1) "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine CrossProd "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "

149

Print # usrlib_num , "

Double Precision Function ArcSin (X , ie ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Returns the Arc Sine of X "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

X : Input value "

Print # usrlib_num , " C "


Print # usrlib_num , " C

Note : In stead of using default routine DASIN we use this

one "
Print # usrlib_num , " C

because X can be slightly beyond 1 and this will give "

Print # usrlib_num , " C

a RTE using DASIN ( X ) "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , "

Ie =0 "

Print # usrlib_num , "

S =(1 - x * x ) "

Print # usrlib_num , " !

if ( S . Lt . -1E -10) Ie =1 "

Print # usrlib_num , " !

if ( S . Lt . -1E -10) Write (* ,1) X , S "

Print # usrlib_num , " !


Print # usrlib_num , "

if ( S . Lt . -1E -10) Write (2 ,1) X , S "


1 Format ( ArcSin ( ,1x ,1 p , e13 .5 e3 , ) ,S = ,1x ,1 p , e13 .5 e3 ) "

Print # usrlib_num , "

if ( S . LT .0) S =0 "

Print # usrlib_num , "

S = DSQRT ( S ) "

Print # usrlib_num , "

ArcSin = DATan2 (x , S ) "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! function ArcSin "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

subroutine CarSig ( S1 , S2 , S3 , xN1 , xN2 , xN3 , SNew ) "

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C

Returns the Cartesian stresses using the principal stresses

S1 .. S3 "
Print # usrlib_num , " C

and the principal directions "

Print # usrlib_num , " C "


Print # usrlib_num , " C I

S1 .. S3

Print # usrlib_num , " C I

xN1 .. xN3 : Principal directions ( xNi for Si ) "

: Principal stresses "

Print # usrlib_num , " C "


Print # usrlib_num , " C
*********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xN1 (*) , xN2 (*) , xN3 (*) , SNew (*) "

Print # usrlib_num , "

Dimension SM (3 ,3) ,T (3 ,3) , TT (3 ,3) , STT (3 ,3) "

150

Print # usrlib_num , " C


*********************************************************************** "
Print # usrlib_num , " C "
Print # usrlib_num , " C **** Fill t ransfor mation ( rotation ) matrix "
Print # usrlib_num , " C "
Print # usrlib_num , "

Do I =1 ,3 "

Print # usrlib_num , "

T (i ,1) = xN1 ( i ) "

Print # usrlib_num , "

T (i ,2) = xN2 ( i ) "

Print # usrlib_num , "

T (i ,3) = xN3 ( i ) "

Print # usrlib_num , "

TT (1 , i ) = T (i ,1) "

Print # usrlib_num , "

TT (2 , i ) = T (i ,2) "

Print # usrlib_num , "


Print # usrlib_num , "
Print # usrlib_num , " !

TT (3 , i ) = T (i ,3) "
End Do "
Call MatTranspose (T ,3 , TT ,3 ,3 ,3) "

Print # usrlib_num , " "


Print # usrlib_num , "

Call MZeroR ( SM ,9) "

Print # usrlib_num , "

SM (1 ,1) = S1 "

Print # usrlib_num , "

SM (2 ,2) = S2 "

Print # usrlib_num , "

SM (3 ,3) = S3 "

Print # usrlib_num , " C "


Print # usrlib_num , " C **** SMnew = T * SM * TT "
Print # usrlib_num , " C "
Print # usrlib_num , "

Call MatMat ( SM ,3 , TT ,3 ,3 ,3 ,3 , STT ,3) "

Print # usrlib_num , "

Call MatMat (T ,3 , STT ,3 ,3 ,3 ,3 , SM ,3) "

Print # usrlib_num , " !

Call MatMatSq (3 , SM , TT , STT )

! STT = SM * TT "

Print # usrlib_num , " !

Call MatMatSq (3 , T , STT , SM

! SM = T * STT "

Print # usrlib_num , " C "


Print # usrlib_num , " C **** Extract cartesian stress vector from stress matrix "
Print # usrlib_num , " C "
Print # usrlib_num , "
Print # usrlib_num , "

Do I =1 ,3 "
SNew ( i ) = SM (i , i ) "

Print # usrlib_num , "

End Do "

Print # usrlib_num , "

SNew (4) = SM (2 ,1) "

Print # usrlib_num , "

SNew (5) = SM (3 ,2) "

Print # usrlib_num , "

SNew (6) = SM (3 ,1) "

Print # usrlib_num , " "


Print # usrlib_num , "

Return "

Print # usrlib_num , "

End

! Subroutine CarSig "

Print # usrlib_num , " C


********************************************************************** "
Print # usrlib_num , "

subroutine setveclen ( xn ,n , xl ) "

Print # usrlib_num , " C


********************************************************************** "
Print # usrlib_num , "

Implicit Double Precision (A -H ,O - Z ) "

Print # usrlib_num , "

Dimension xN (*) "

Print # usrlib_num , "

x =0 "

Print # usrlib_num , "

do i =1 , n "

Print # usrlib_num , "


Print # usrlib_num , "

x = x + xn ( i ) **2 "
end do "

151

Print # usrlib_num , "

if ( x . Ne .0) Then "

Print # usrlib_num , "

f = xl / sqrt ( x ) "

Print # usrlib_num , "

do i =1 ,3 "

Print # usrlib_num , "


Print # usrlib_num , "

xn ( i ) = xn ( i ) * f "
end do "

Print # usrlib_num , "

End If "

Print # usrlib_num , "

Return "

Print # usrlib_num , "

end ! setveclen "

Print # usrlib_num , " "


Print # usrlib_num , " C
********************************************************************** "
Print # usrlib_num , " C End Of file "
Print # usrlib_num , " C
********************************************************************** "

Close # usrlib_num

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Batch file
--------------------------------------

Dim batch_num As Integer , run_batch As Integer

Dim batch As String

batch = dirname & " \ te mp _c r ea te _d l l \ dfcomp . bat "

Const batch = dirname & "\ dfcomp . bat "

batch_num = FreeFile

Open batch For Output As # batch_num

Print # batch_num , " pushd %~ dp0 "


Print # batch_num , " "
Print # batch_num , " echo ! DEC$ ATTRIBUTES DLLExport :: User_Mod > impexp "
Print # batch_num , " "
Print # batch_num , " df / c usrlib . for "
Print # batch_num , " lib / out : dfusrlib . lib usrlib . obj "
Print # batch_num , " "
Print # batch_num , " df / winapp

spline_model . FOR dfusrlib . lib

/ dll "

Print # batch_num , " pause "

Close # batch_num

run_batch = Shell ( dirname & " \ te mp _c r ea te _d l l \ dfcomp . bat " , 1)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Finish - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

152

While Dir ( dirname & " \ te mp _ cr ea te _ dl l \ spline_model . dll " ) = " "
Application . Wait Now + TimeValue ( " 00:00:01 " )
Wend

FileCopy dirname & " \ te mp _c r ea te _d l l \ spline_model . dll " , dirname & " \ spline_model . dll "

Remove the temporary folder :


Kill dirname & " \ t em p_ c re at e_ d ll \*.* "

delete all files in the folder

RmDir dirname & " \ te m p_ cr ea t e_ dl l \"

delete folder

Prompt = MsgBox ( Prompt := " spline_model . dll file successfully compiled . Copy the file to
PLAXIS root directory and use as a User Defined Soil Model . " , _
Buttons := vbOKOnly , Title := " PLAXIS " )

End Sub

153

You might also like