Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Visualisation of Unstructured and Uncorrelated
Three-Dimensional Data.
Final Year Environmental Engineering Thesis
Fergus Bennett
24th November 2006
Supervisor: Dr David Reynolds
The University of Western Australia
School of Environmental Systems Engineering
2
Abstract
Unstructured data may serve its purpose for information dissemination as an output
from a program, but it is not structured in a clean and consistent fashion for use as a
data source. To make use of unstructured three-dimensional data some form of
connectivity must be identified to correlate the data. With the use of irregular
triangular interpolation specifically suited to unstructured data points in a three-
dimensional plane, the unstructured data from a fractured rock network simulator can
be visualised as a three-dimensional isosurface representative of the domain for which
the data was initially modelled.
Fractured rock networks are of particular interest to hydro geologists because of the
complex ways in which fluid flows within the networks and the consequent transport
of solutes from a possible contamination source. Empirical analyses of fractured
networks are typically unreliable because of the difficulty in sampling individual
fractures on large scales. However, fractures often have predictable statistical
properties such as size and positioning, so data derived from cores, tracers and
pumping tests can be analysed statistically to simulate fracture systems and the fluid
flow within them.
MAFIC (Matrix and Fracture Interaction Code) is a three-dimensional fractured
media flow and solute transport simulator, which is a module of the FRACMAN suite
of software developed by Golder Associates Incorporated. MAFIC uses discrete
fracture network software technology and employs a triangular finite element method
to solve for flow and transport within fracture networks and outputs hydrological data
for each node in the three-dimensional domain. The difficulty in visualising the data
still remains, with many programs failing to interpret the unstructured output data and
requiring restructuring of the data to interpolate it and create a visualisation. The
recently released open source version of IBM’s Data Explorer (OpenDX) contains
several interpolation and visualisation modules specifically developed for
unstructured data.
The scope of this project is to examine the input and output data, used by the MAFIC
fractured rock simulator to model a real fractured rock network, and prepare the data
3
in a form that OpenDX can interpret, in order to create a three-dimensional
visualisation of the fractured rock network consisting of the isosurfaces of the
hydraulic head gradient within each fracture. Data preparation will consist of utilising
the program MATLAB to correlate the data and then using OpenDX to interpolate the
data and map the two-dimensional isosurfaces of the three-dimensional fracture
network. The visualisation of a fractured rock network can then be visually analysed
revealing additional information not discernable from looking at a set of data alone.
Acknowledgements
I would like to thank the following people for their assistance:
Dr. David Reynolds for his guidance and knowledge of the modelling of fractured
rock networks.
Nic Matich for technical support with MATLAB programming for data preparation
and import into OpenDX.
Chris Pelkie from the OpenDX online user forum for support with visualisation loops
in OpenDX.
Shaan Pawley’s previous work in her 2002 final year environmental engineering
thesis ~ Influence of Fracture Geometry on Pumping well Capture.
4
Table of Contents 1 Introduction 6
2 Literature Review 8
2.1 Fractured Rock 8
2.2 Fluid Transport in Fractures 10
2.3 Contaminant Transport in Fractures 12
2.4 Discrete Fracture Approach 13
2.5 Visualisation of Fractures 15
3 Approach 18
3.1 Data Preparation 18
3.2 Data Input 20
3.3 Interpolation of Irregular Data 21
3.4 Isosurface Iteration 23
4 Results and Discussion 25
4.1 Initial Observations 25
4.2 Network Connections 27
4.3 Improvements 29
5 Conclusions 30
Glossary 31
References 32
5
Table of Figures
2.1.1 Fracture modes 8
3.3.1 Scattered data points in a fracture plane 21
3.3.2 Delaunay triangulation of scattered data 22
3.3.3 Isosurface of changing hydraulic head 22
4.1.1: Top view of fracture network. 25
4.1.2: Bottom view of fracture network. 26
4.2.1: High head side of fracture network. 27
4.2.2: Low head side of fracture network. 27
4.2.3: Identifying flow paths 28
4.2.4: Low flow areas. 28
Table of Appendices
Appendix A: MATLAB program 34
Appendix B: OpenDX General File 37
Appendix C: OpenDX Loop Macro 38
Appendix D: OpenDX Main Visualisation Program 39
Appendix E – Sample Node Data 40
Appendix F – Sample Element Data 41
Appendix G – Sample Prepared Data 42
6
1.0 Introduction Fractured Rock networks are important in engineering, geotechnical, and
hydrogeological practice. They can act as a hydraulic conductor, providing pathways
for fluid flow or barriers that can prevent flow across them. Many petroleum, gas,
geothermal, and water supply reservoirs can be found in fractured rock. Fractures can
control the transport of chemical contaminants into and through the subsurface. The
application of fracture characterization and fluid flow analysis in engineering,
geotechnical, and hydrogeological practice involves three key points. Fractures that
are significant hydraulic conductors or barriers need to be identified, located, and
characterised, the flow and transport occurring in fracture systems needs to be
understood, and the changes in fracture rock networks need to be predicted and
controlled.
Due to fractured rock networks being a phenomenon that occurs inside large volumes
of rock and often below the ground it is extremely difficult to measure and observe
the processes occurring within them. Data collected in the field describing the shape,
size, orientation and hydrological properties of fractures can be used to create a
model. Finite element models that simulate a fractured rock network are made up of a
web of data nodes representative of the network. Then using defined hydrological
relationships and field data, the hydrological parameters at each node can be
calculated. This process is computationally expensive and large volumes of data are
created. The data is also unstructured in that the spacing between each data node is
not uniform because the simulator reduces the computation expense by optimising the
use of only important nodes.
Most programs that visualise data require it to be in a structured format otherwise they
must restructure the data by averaging it over a uniform grid attributing values to each
grid. However this process does not preserve the original data values and can distort
the accuracy of the image. It is proposed in this study that the visualisation of
unstructured data can be achieved with the program OpenDX. An original method
will need to be developed to overcome the problems encountered with other
visualisation programs. In addition to this, the data available is uncorrelated in that it
does not define the connectivity between the three dimensional data points, so
7
visualising this data in its current state only produces a mess of data. It is proposed in
this study that determining a way to correlate the data provided by the simulator will
make visualisation possible.
In this study the particular focus for the visualisation is to be able to identify each
fracture within the network. An additional variable attributed to the fracture planes is
the hydraulic head, which is represented as an isosurface of changing colours
according to the hydraulic head at that point in the fracture. The visualised
combination of the fractured rock network and the changing head within it, is a
powerful tool in identifying the flow pathways of fluid and contaminants through the
network of fractured rock.
8
2.0 Literature Review
2.1 Fractured Rock
A fracture can be defined as any non-sedimentary mechanical discontinuity in a solid
rock formation, thought to represent a surface or zone of mechanical failure. All rocks
in the earth's crust are fractured to some extent. Fractures are formed in response to
stress, which arises due to the weight of the earth's crust, high fluid pressures, tectonic
forcing, or thermal loading. As a result of this fractures occur at a variety of scales,
from microscopic to continental. It is thought that chemical processes and corrosion
may also play an important role in the failure process. However, the predominant
cause of the creation and behaviour of fractures is controlled by the relative opposing
motion of rock on either side of the fracture plane. (Natural Fractures 2006 online)
Fractures can be specified according to Fracture Mode, which is a form of
nomenclature that is purely descriptive since a combination of factors may have led to
its formation. Mode I Fractures are created when the fracture wall is displaced normal
to the plane of the fracture. In the case of a joint the fracture walls are separated
leaving a void as opposed to a compaction band where the fracture walls are
compressed together crushing the rock structure. In both these cases a conduit for
fluid flow is formed bounded by the surrounding fracture wall that is relatively
impermeable. Mode II and Mode III fractures are formed from the fracture wall being
displaced in a direction parallel to the plane of fracture. These fracture types are
commonly referred to as faults and are caused by horizontal slipping and tearing of
rock layers (Natural Fractures 2006 online). Fracture Modes are shown in figure 2.1.1
Figure 2.1.1: Fracture Modes (Natural Fractures 2006 online)
9
Different types of fractures can form in different orientations relative to the earth
stresses that prevailed during the time of fracturing. Correctly identifying fracture
types is essential for predicting the orientations of fracture networks and enabling the
building of fluid flow and solute transport models because different types of fractures
have different fluid flow properties. Particular types of fractures only form in specific
rock types or in specific geologic environments so by understanding the geological
properties of an area by examining core samples and nearby outcrops, the nature of
the fractured rock network can be better understood. Some types of fractures have
particular shape and size distributions in different types of rock and obey particular
spacing laws, which can be used in the building of models
Tracer tests and hydraulic tests are used to investigate the interconnectivity of fracture
networks, and also provide an insight into the solute transport and chemical reactions
occurring within in the fracture network. A conceptual model describing the
behaviour of the system is chosen in order to numerically estimate properties. The
natural gradient tracer test uses the natural fluid flow of the system to transport an
injected amount of passive tracer, which can be monitored by a grid of wells situated
down the hydraulic gradient from the source. For convergent/divergent tracer tests an
artificial flow field is created through the extraction or injection of water into a well.
During the convergent tracer test a tracer is injected into a nearby well and then water
is extracted from the monitoring well to determine flow properties. During the
divergent tracer test the tracer is introduced into the well being injected with water
and the surrounding wells are monitored for the arrival of the tracer. A two well tracer
test involves the pumping of water out of one well to be injected into another nearby
well. Once steady state is achieved the tracer is introduced into the injection well and
the extraction well is monitored for the arrival of the tracer.
Fracture characterisation by gathering information from sources such as core samples
and tracer tests enable the construction of a conceptual model. Accurately
characterised fractures result in a more useful model and a better understanding of
fluid and solute transport within them. The accurate prediction of dominant flow
pathways and contaminant transport is important for planning things such as
remediation of the contaminated area or the construction of pumping and observation
wells. Accurate predictions will therefore save time and money.
10
2.2 Fluid Transport in Fractures
It has been determined experimentally that fluid transport in porous media obeys
Darcy’s Law for low fluid velocities as described in equation 2.2
Q = k.A . (Pb – Pa) µ L
The total fluid flow, Q in units of volume per time, is equal to the product of the
permeability of the porous medium, k, the cross sectional area of flow, A, and the
pressure drop, Pb – Pa, from the origin to the destination, all divided by the viscosity,
µ and the length the pressure drop is taking place over, L. A negative sign is required
because fluid flows from high pressure to low pressure, therefore if a change in
pressure is negative then the flow will be positive.
However our understanding of fluid transport in fractured porous media is less well
understood and more difficult to verify experimentally. The actual fluid flow in a
fracture is dependant on the individual properties of a fracture which are difficult to
determine. Consequently, fractures are commonly described by the parallel plate
model, where the fracture is conceptualised as two smooth parallel plates of infinite
extent and not in contact, thereby creating a fracture plane between the plates. (Snow
1969; Brown 1989). The steady state solution of the Navier-Stokes equations for one
dimensional laminar flow between two parallel plates gives the Cubic Law as shown
in equation 2.3.
Q = b3 . (Pb – Pa) 12µ L
The total flow, Q, in units of volume per time is equal to the product of the cubed
distance between the plates, b, and the pressure drop, Pb – Pa, from the origin to the
destination, all divided by the 12 times the viscosity, µ and the length the pressure
drop is taking place over, L
The parallel plate model however, is over simplified since fractures are not perfectly
smooth plates separated by a constant aperture and the fracture wall actually has an
11
imperfect surface (Brown 1989). Additionally, portions of the fracture wall may be in
close contact and not represented accurately by a continuous unimpeded aperture.
Investigations have shown that the parallel plate model assuming uniform aperture is
only valid for low pressure gradients in the case of a uniformly open fracture (Tsang
1984). The Cubic Law can be modified to incorporate surface roughness by including
a friction factor (Witherspoon et al, 1980) as shown in equation 2.4.
Q = 1 b3 . (Pb – Pa) f 12µ L
Equation 2.4 is only valid for conditions of low tortuosity where the fluid pathways
remain parallel with the hydraulic gradient. It has been shown through theoretical
investigation that a large fraction of small apertures combined with high fracture
roughness resulting in high flow path tortuosity, that the flow is reduced by several
orders of magnitude from what is estimated by the parallel plate method (Tsang
1984). The flow in this case was found to be well described by the Reynolds Equation
which is a particular form of the Navier-Stokes Equation for steady state flow in an
incompressible fluid between two stationary planes (Brown 1987) shown in equation
2.5.
� . ( d3(x, y) . Δp(x ,y) ) = 0 12µ
Where d(x, y) is the local thickness of the fluid layer and p(x, y) is the local hydraulic
pressure. Use of the Reynolds equation is more complicated than the Cubic Law
approach, however it offers a better representation of fluid flow. Accurate knowledge
of the fracture properties such as aperture distribution and tortuosity are required in
order to select the appropriate method suited for the modelling requirements.
12
2.3 Contaminant Transport in Fractures
The transport of contaminant within fractured rock environments works under a
similar process to what occurs in porous media. The processes of advection,
adsorption, diffusion, dispersion and chemical reactions all play a part in transport and
retardation of solutes. In fractured rock networks the fractures act as the pathways for
contaminant transport with the dominant processes being advection and dispersion.
The rock media containing relatively immobile water, can store contaminant mainly
through the process of diffusion. Understanding and measuring these processes is
useful in determining the migration of contaminant plumes within a fracture network.
(Fetter 1994)
Advection is the bulk movement of a fluid from one location to another. Contaminant
present in a fluid is passively carried by the advection movement of the fluid causing
a mass transport of contaminant. In fractured rock networks different hydraulic
gradients may be present in different parts of the network, which makes it difficult to
predict the rates of advection. Consequently contaminants located in some parts of the
network may be isolated to small pockets of high concentration while other are
diluted as they are transported along stronger flow pathways. (Fetter 1994)
Dispersion is the process of spreading or dilution of a contaminant while advection is
occurring in fractures, as a result of the friction caused by the surface of the fracture
walls, which are by nature close together, combined with the tortuous path caused by
varying aperture size and blocked areas of the fracture. A plume of contaminant will
be spread normal to the direction of the flow as well as along the direction of the flow
as a result of some flow paths being longer than others. (Fetter 1994)
A large concentration gradient between a fracture and rock media can result in
contaminant diffusing into the rock media. Diffusion is further enhanced through
adsorption of contaminant to the fracture wall increasing the rate of diffusion. This
represents an attenuation mechanism that reduces contaminant mass in the primary
flow channels because the rock media effectively lowers the concentration of
contaminant in the fracture. However trapped contaminant may continue to pollute
the fracture network for longer after the initial plume has transported through it.
(Freeze and Cherry 1979).
13
2.4 Discrete Fracture Approach
The discrete fracture approach is a conceptual model of fluid flow through fractured
rock networks and was used to simulate the data that was visualised in this study. In
this approach each individual fracture is modelled separately. The location, size,
orientation, aperture distribution and termination percentage are required to model the
fracture or an alternative method is to measure the statistics governing the distribution
of each feature can be measured and a representative realisation with the same
properties can be created. The selection of method depends largely on the knowledge
of the fracture geometry and properties, the quality of the input data and availability
of computational power. For example in the case where little is known about the
actual fracture network geometry but quality input data has been obtained then a
representative realisation must be used.
An investigation into the importance of knowing fracture network geometry when
predicting mass transport with the discrete feature approach was conducted by
Anderrson and Thunvik (1986). They concluded that knowing fracture geometry
reduced the uncertainty in comparison to cases where fracture geometry information
was not available. Partial knowledge of the main fracture geometry also reduced
uncertainty when manipulating alternative realisations, however knowledge of the
bulk permeability of the fracture network was found to be more useful than collection
of additional geometric data.
A boundary element procedure was developed by Elsworth (1986) to reduce the
required computational effort to define a fracture network. The procedure simulated
transient flow through a statistically assembled structure of fractures represented as
Poisson discs of constant aperture, however it was only capable of handling fractures
with constant or average aperture properties. Anderrson and Dverstorp (1987)
developed a similar model to investigate flow through a network of discrete fractures
in a three dimensional domain. The advantages of this model was a more realistic
fracture generation system and the ability of the model to identify and disregard
fractures not required in solving the flow regime, in order to optimise the
computational requirement.
14
A model for a discrete fracture system, which took into account channelling effects
for the investigation of fracture flow in a granite uranium mine, was developed by
Cacas et al (1990). The model assumed that flow in the fractures was not uniformly
distributed over the entire fracture plain but was limited to set channels. The nodes of
the fracture network are consequently located in the centre of the fracture planes as
opposed to the intersections between fractures. Flow between fractures is then
modelled according to flow bonds between the nodes of connected fractures, which
meet at the fracture intersection. Each bond is equivalent to the set of flow channels
connecting to intersecting fractures. This over simplifies the fracture system and
calibration with hydraulic conductivity from field tests is required.
The discrete fracture software known as MAFIC used to simulate the data, which was
visualised in this study, was developed by Golder Associates Incorporated. MAFIC
simulates transient flow and transport through a three dimensional network of
triangular finite elements. Flow models incorporating networks of discrete fractures
provide more realistic simulations of steady state flow and solute transport in
fractured rock (Miller et al). MAFIC takes position and hydrological data at each node
and defines a connectivity between each node in the form of triangular elements. The
flow relationship between elements is defined and once some hydrological conditions
obtained from field data are inputted, then flow between each connected element in
the fracture network can be calculated.
The output from the MAFIC simulator contains the solved hydrological parameters at
each node. However, the output data is not correlated to the input data, making it
difficult to discern the link between the location of a node and its hydrological
parameters. This combined with the irregular spacing of the data nodes and the sheer
quantity of nodes makes interpretation of the data list as an information source
extremely difficult. Some form of remnant connectivity in the data form the finite
element process must be identified that links the unstructured data, so that it can be
visualised as a fracture network and not simply as a mess of scattered data points.
15
2.5 Visualisation of fractures
Visualisation is the set of techniques used to turn a set of data into visual insight. The
aim of this is to give the data a meaningful representation by exploiting the powerful
discerning capabilities of the human eye, or to think of it a different way, to transform
something created and defined mathematically to something that is visually
comprehendible. Data can be displayed as a two or three dimensional image using
techniques such as colourisation of the surface to create an isosurface, animation and
spatial annotation to add information to the image and create an instant understanding
from multi-variable data.
Visualisation of fractures has two important outcomes. Firstly, a fracture network by
nature is a phenomenon that occurs within a volume of solid rock and most particular
fracture networks of interests are situated hidden beneath soil in the subsurface.
Obviously they cannot be physically viewed except by excavation of some suitable
sites, which will only reveal a slice through the network and often disrupts the
structure of the fractures. Characterisation of the fracture network allows conceptual
models to be created that represent what cannot be seen.
Secondly, a visualisation can display information that cannot be directly seen by
physically looking at a fracture. Additional information such an isosurface of
changing hydraulic head or a vector field of flow direction and intensity can reveal
properties of the fracture network that are not obviously apparent in data form but can
be quickly identified and interpreted visually.
Finite element models are inherently computationally expensive with large volumes
of data output being created. MAFIC is arguably the best fluid flow and solute
transport simulator currently available to the hydrogeology industry. However its
visualisation tools are limited so an alternative visualisation program had to be
considered. The MAFIC flow simulator prioritises and isolates nodes of significance,
reducing the computational expense. A consequence of this is that the unstructured
data is difficult to visualise because most programs must restructure the data by
interpolating to a uniform grid before an isosurface can be mapped. This study
investigated the use of the open source version of IBM’s Data Explorer referred to as
16
OpenDX. OpenDX is fully programmable to allow the transformation and
manipulation of data specifically for the purpose of visualisation.
Although MATLAB has the computational power to deal with large data sets it is
lacking good visualisation tools. In order to achieve a higher level of image quality
and allow more interaction with the visualisation a specialist visualising program was
required. OpenDX is not well suited to large scale data manipulation so MATLAB
was still utilised for data preparation because its logical matrix operation tools are
ideal for correlating large data blocks.
OpenDX differs from many other types of programming software in that it uses a
graphical user interface as opposed to explicitly written code. Prewritten function
codes in the form of modules can be selected from a list and programs can be
constructed by linking these modules. If a module does not exist that performs the
desired function then combining simple building block modules together to form a
macro can satisfy most requirements. Most modules contain some amount of limited
programmability to specify it exact function. This simplification of programming is
useful when all the modules required are already present, however when a macro
needs to be created, unless the user has an extensive knowledge of the function and
application of every module it can be a difficult task selecting the building block
modules that best suit the situation.
OpenDX is well documented with definitions for each module and tutorials that walk
the user through simple examples. A list of sample programs that demonstrate various
features of OpenDX is also available and it is advisable that novices run each sample
program and inspect not only the image but the program string, import file and data
set that leads to the image creation. More complicated problems require a true
programmers mentality with the only difference being the user must use combinations
of prebuilt modules as opposed to writing actual code. For complicated problems it is
advisable to peruse the OpenDX online support forum for discussion on similar
problems or post a question and wait for a response.
17
“Open Visualization Data Explorer is a visualization framework that gives users the
ability to apply advanced visualization and analysis techniques to their data. These
techniques can be applied to help users gain new insights into data from applications
in a wide variety of fields including science, engineering, medicine and business. Data
Explorer provides a full set of tools for manipulating, transforming, processing,
realizing, rendering and animating data and allow for visualization and analysis
methods based on points, lines, areas, volumes, images or geometric primitives in any
combination. Data Explorer is discipline-independent and easily adapts to new
applications and data. The integrated object-oriented graphical user interface is
intuitive to learn and easy to use.” (http://www.research.ibm.com/dx/)
18
3.0 Approach
3.1 Data Preparation
Data preparation was required so that uncorrelated data could be converted to a form,
which could be easily inputted and interpreted by into the visualisation program
OpenDX. To create a visualisation of the changing hydraulic head in a fracture plane
the positional data and hydraulic head value was required. In addition to this the
fracture number identifying which fracture data belonged to would also be required
for large data lists containing many fractures within the three dimensional domain of
interest.
The data requiring visualisation in this study was a .MFT output file from MAFIC.
The file contained two sets of data; firstly a list of nodes with their corresponding
positional data and the hydrological parameters that MAFIC had solved for in the
simulation of which hydraulic head was the focus for this study, and secondly a list of
the elements used to represent the fractures in the simulator with their corresponding
three nodes located at the point of each finite element triangle and the fracture number
that the element was situated in. To simplify the data preparation process the .MFT
file was split into two separate text files called nodes.txt and elements.txt, which
corresponded to the first data block of nodal data and the second data block of
element data respectively. The data was also stripped of all header information
leaving clean blocks of data that could easily be loaded into MATLAB or Microsoft
EXCEL.
Initially it was useful to view the data files in Microsoft EXCEL, which enabled a
better understanding of the data. With the use of EXCEL’s column transformation
toolbox, several important traits of the data were identified that would be required to
correlate the data for input into OpenDX. In order to create a data list containing
positional data matched with the hydraulic head value and fracture that it belonged to,
a MATLAB program would need to be written to perform matrix operations to
correlate the two data sets. This was important since MAFIC data files may contain
hundreds of thousands of nodes spread over hundreds of fractures, so manually
correlating the data would be extremely time consuming and unnecessary.
19
Rearranging the columns of the data in the element file so that each node mentioned
on an element corner was assigned a fracture number in which the element was
located, revealed that a node could exist in multiple fracture groups. In fact, the nodes
that repeated in multiple fractures were those situated along the intersection of two
fracture planes. With the knowledge that each group of nodes representing a fracture
plane created by the simulator was in a perfect two dimensional plane, and that nodes
that were situated on fracture plane intersections were required by both fracture
planes, it was decided that the data file that would be inputted into OpenDX would
need to be grouped according to fracture number with the inclusion of the repeated
nodes, which would only be discernable by different fracture number. This was
important because some fracture planes may contain a small number of nodes, or a
vital node with no close neighbours, and the omission of this data would dramatically
effect the visualisation of the fracture plane as an isosurface because the interpolation
between the data points would shift emphasis to other nodes. Additionally, because
these nodes occur on fracture intersections, the visualisation of the fracture network
would be less accurate because the isosurfaces of the intersecting fracture planes
would not match.
By understanding the required format the data would need to be in for input into
OpenDX and understanding the format of the output data from the simulator, the
MATLAB code could then be written to take the files nodes.txt and elements.txt and
create a single file of five columns; the first three columns containing the three-
dimensional positional data, the fourth column containing the hydraulic head used to
create the isosurface and the fifth column identifying the fracture the data belonged to.
The visualisation of the data could then be automated by programming a loop into
OpenDX to iterate the plot of each isosurface by fracture number.
The steps taken in the MATLAB program are as follows;
1. Load the elements.txt file and create a two column matrix containing the list of
nodes and what fracture they are present in, with excess repeated data
excluded.
20
2. Load the nodes.txt file and assign the positional and head data to the
corresponding nodes in the list by matching the node numbers, resulting in a
six column matrix.
3. The matrix was then further simplified by excluding the column containing the
node number since it had served its purpose in correlating the two data sets.
4. The fracture groups although explicitly numbered were not numbered
consecutively from one to last, so this was done to simplify the iteration
process in the visualisation loop.
5. The correlated reformatted data was then outputted to a text file called
results_stripped.txt ready for OpenDX to import.
The code for MATLAB program used to correlate the data is shown in Appendix A.
3.2 Data Input
The General Array Importer in OpenDX uses a header file to describe the structure
and location of data to be imported. This file consists of keyword statements that
identify important characteristics about the data. Characteristics important to defining
the data for import include grid structure, format, and data type, and also contain the
path name of the file containing the data.
A header file can be created with the Data Prompter feature of OpenDX, which
prompts for the necessary information and creates header file. This method is
recommended in the OpenDX tutorial, however the process is not always straight
forward. An alternative approach was to open an existing header file with a text editor
and write in the keywords to describe the data. This method was preferred because
each keyword in the header file was directly set to the required parameters without an
over reliance on the automation of the Data Prompter which was not “user friendly”
as a result of OpenDX not being native to the Windows platform.
The header file is shown in Appendix B
21
3.3 Interpolation of Irregular Data
The unstructured spacing of the data points within each fracture plane was inherited
from the finite element mesh used by the MAFIC simulator. Each element size and
orientation within the two dimensional plane was unique. Two options were available
to interpolate the data points within a fracture plane to create an isosurface. One
option was to restructure the data so that the scattered data points are interpolated onto
every position on a grid resulting in a structured grid of interpolated data points.
However, an inbuilt program module of OpenDX specifically designed for
interpolation directly between irregular data points was favoured over restructuring
the data.
The “Connect” module uses Delaunay triangulation involving Voronoi tessellation of
a plane to create triangle connections for a field of scattered positions, without
manipulating the existing data points. This process involves computational geometry,
whereby a set of points in a plane is triangulated such that no point is inside the
circumcircle of any triangle. Delaunay triangulations maximise the minimum angle of
all the angles of the triangles in the triangulation in order to avoid "sliver" triangles.
However, in awkwardly scattered data “sliver” triangles may still be unavoidable.
Figure 3.3.1 shows typical scattered spacing of the data points in a fracture plane
output by the MAFIC simulator.
Figure 3.3.1: Scattered data points in a fracture plane.
22
Figure 3.2.2 shows the Delaunay triangulation utilised by the “Connect” module of
OpenDX to interpolate data points with irregular spacing to create a surface plane.
Figure 3.3.2: Delaunay triangulation of scattered data points.
Figure 3.2.3 shows an isosurface of changing hydraulic head that can be mapped
using the “AutoColor” module as a result of the interpolation.
Figure 3.3.3: Isosurface of changing hydraulic head
The OpenDX program used to create an isosurface of hydraulic head for a single
fracture is very simple. The basic programming string of modules is;
Import Connect AutoColor Image
Multiple fracture planes can be plotted to the same image using the “Collect” module
placed between “Autocolor” and “Image”. Then if separate text files of data for each
fracture group are created and imported in their own string, they can be inputted into
“Collect”, which can take up twenty separate inputs. This however, is not practical for
many fracture planes, necessitating the implementation of loop module.
23
3.4 Isosurface Iteration
In order to iterate the plotting of isosurfaces of fracture planes a loop program had to
be written in OpenDX. The loop had to identify groups of data points specified by
fracture number. Then for each fracture group the data points were interpolated and an
isosurface resulting in a network of isosurfaces for every fracture plane in the data set
being plotted to one image.
A loop program can be created in OpenDX by combining several in built modules and
saving them as a macro. A macro is a higher level processing function that is
constructed from simpler ones. The macro can then be loaded into the OpenDX
toolbox and used as a separate module. In general a macro needs to be constructed so
that so that it receives a data input, performs some action on the data and then outputs
the data in its altered form.
The macro constructed for the iterative visualisation of fracture isosurfaces was
named FracMacro3 and is shown in Appendix C. When constructing a macro the file
can be saved as a normal .NET file however in order to use this file as a macro it must
be given a macro name. Then when a program needs to use that macro it must be
loaded by selecting the .NET file in the workspace, however it will appear in the
module list with the macro named it was assigned. The macro contains five key
elements;
1. The input takes the data, which has previously been imported in the main
program and designates the fracture number as the parameter to be iterated
using the “Mark” and “Unmark” modules.
2. The “ForEachN” module is a simple iteration program that takes as inputs an
initial value, final value and the step increase for each iteration. The initial
value is set to one for fracture group one, and the final value is set to the total
number of fracture groups, with a step size as one to cycle through each group.
3. “Mark” is then required to be set to the head data so that each fracture group
can be interpolated and mapped as an isosurface in a string similar to what is
24
used for visualising a single fracture plane except that the output is passed to
the “Append” module.
4. The “Append” module passes each isosurface to be stored in the
“CollectMultiGrid” module, which collects each isosurface using the
“GetLocal” and “SetLocal” looping procedure, and stores it until every
fracture group has been interpolated.
5. The final collected set of isosurfaces is then output ready to be visualised in
the main program. Before output, the “Autocolor” module must be calibrated
to the global minimum and maximum head values to ensure the isosurfaces are
coloured on a uniform scale.
For the main the main program to work the created macro must be available in the
same workspace. The main program consists of an “Import” module, which calls to
the general file to import the data. Once again the correct file location of the general
needs to be entered. The data then passes through several identification modules to
ensure the macro recognises which data to perform its operations on. The output of
the macro then connects directly into an “Image” module, which graphs the fracture
network isosurfaces.
Within the image window options tab the view control interactor can be selected
which allows manipulation of the three dimensional image such as rotation and zoom.
Axes can also be added to display the dimensions of the image, and the background
colour can be modified to suit. To adjust the shading and colours of the isosurface the
“Autocolor” module in the macro must be calibrated and saved once the desired
image appearance has been reached.
25
4.0 Results and Discussion 4.1 Initial Observations
The data set used in the creation of these particular visualisations was modelled from
a fractured rock approximately fifty meters square and ten meters deep. The head
values ranged from a minimum of –1.27 meters to a maximum of 9.76 meters. Flow
occurs from high head to low head. In these visualisations the red shading in the
fracture isosurfaces represent the highest head values, while the dark blue shading
represents the lowest head values. It is apparent that there is a definite hydraulic
gradient present with a head difference of approximately 11 meters from one side to
the other. However the gradient is not homogeneous across the network, revealing
that each individual fracture may have a slightly different gradient implying their
different hydrological characteristics. An area of note that is most visible in figure
4.1.1, which shows the top view of the fracture network, but is also visible in figure
4.2.1, which shows the underside of the fracture network, is the anomaly located in
the low head area of the isosurface. A circular region of particularly low head is
apparent. The location and shape of this low head area could be explained as a
pumping well that has penetrated the fracture rock network.
Figure 4.1.1: Top view of fracture network.
26
Figure 4.1.2: Bottom view of fracture network.
Pumping water from a well in this location would immediately reduce the head in the
immediate area and over a prolonged period the hydraulic gradient imposed by
removing the water would draw water through fractures from further away. In this
situation observation wells may be been place in a grid penetrating the fracture
network. A tracer would be introduced to an observation well and the other
observation wells and pumping well would be monitored for the arrival of the tracer.
This process would be repeated for each observation well in order characterise and
simulate the network and calculate its hydrological properties. These visualisations
show in one picture what is otherwise represented purely in data form.
27
4.2 Network Connections Figures 4.2.1 and 4.2.2 show a perspective view of the high and low head sides of the
fracture network respectively. Both figures show the connected nature of the network.
A contaminant introduced to any of the connected fractures at the red high head end
of the network will travel along flow paths defined by the fracture size, orientation
and points of intersection, driven by the hydraulic gradient.
Figure 4.2.1: High head side of fracture network.
Figure 4.2.2: Low head side of fracture network.
28
The effect of advection and dispersion may mean that a localised points of
contamination may be transported to any number of sites in the blue low head
network area depending on the preferential flow paths available. Figure 4.2.3
highlights an area densely packed with fracture intersections. The introduction of a
contaminant to this area would result in transport along numerous fractures and
spreading across a larger area.
Figure 4.2.3: Identifying flow paths
Areas within the network exist that are not conducive to contaminant transport. If a
contaminant must move against the hydraulic gradient in order to gain access to an
intersection that will allow a flow path to lower head areas in the network then it will
likely be contained in that area. The protruding green tip of the triangular fracture in
figure 4.2.4 is such an area.
Figure 4.2.4: Low flow areas.
29
4.3 Improvements
Due to the sometimes sparse and irregular spacing of data nodes within a fracture
plane and the low number of data numbers along intersections, a seamless three
dimensional isosurface is not always possible. This is because the data nodes near
intersections but not necessarily exactly on the intersections are not connected in
terms of the visualisation. I may be possible to use the “Autogrid” module in OpenDX
that would interpolate data nodes within a set radius. However, once again the
irregular spacing of data nodes would create a distorted image along fractures as a
result the interpolation averaging. If the data nodes were restructured with the
“Regrid” module prior to this interpolation then smoothing isosurface intersections
would be obtained however the value original data nodes would not be preserved.
Due to the large number of fractures each with similar isosurface colouring it is hard
to define the silhouette of each fracture. Additionally, some fractures are hidden
within the isosurface layers of other fractures. The solution to this would be to include
in the OpenDX visualisation program an interactive selector that allows the user to
specify which fractures to view and which to exclude. This would allow the user to
peel away obstructing layers to reveal otherwise hidden information. It was difficult
to determine how to implement the “Selector” module to allow this function so the
idea was abandoned although it should be possible.
This same visualisation process could be used to illustrate other parameters of
interest. MAFIC is capable of simulating solute transport within fractured networks.
Contaminant isosurfaces could be created along the same fracture networks revealing
the probable flow pathways and low flow areas. Time series data of contaminant
concentrations or hydraulic head values not at steady could be used to create an
animation. Because of the visualising power of OpenDX the creation of a complicated
fracture network visualisation can be achieved in a matter of seconds making
animations of large data sets possible. All that is needed is the time series data
because all the tools are already available in OpenDX.
30
5.0 Conclusions
The evaluation of the OpenDX software as a visualisation tool produced successful
results. Prior to visualisation a MATLAB program had to be created to correlate the
data and establish connectivity by assigning which fracture plane each data node
belonged to. This program was designed to take variable data files so the results are
reproducible for simulations by MAFIC of other fractured rock networks. The
correlated data file was specifically formatted to be easily exported to OpenDX.
OpenDX had a ready built interpolation module that did not require restructuring the
scattered points. However, there was no ready built module to iterate the interpolation
of multiple data planes in the same image, so combining existing building block
modules created a loop macro. This macro can be calibrated to map fracture networks
with any number of fracture planes so it can be applied to other fractured rock
network simulations.
The engineering significance of this study was to provide a visualisation for an
important hydrogeological area of research. An original method was used to solve the
problem of visualising unstructured, uncorrelated three dimensional data. Prior to this
study the simulated data could not be accurately visualised. Large data sets of useful
but unrecognisable information can now be visually analysed. The images can be used
as an aid in understanding the fluid flow and contaminant transport within fractured
rock networks.
A continuation of this study would firstly include a refining of the OpenDX program
to allow the user to select which fractures to view and hide the rest. This would make
analyses of the fractured network simpler because of the large number of fractures
and the camouflaging of isosurfaces of similar colouring and the hiding of fractures in
the centre of the network. Secondly would be an application of this visualisation
process to time series data to create an animation of situations such as a migrating
contamination front through a fractured rock network
31
Glossary Advection: The attraction and adhesion of a layer of ions from an aqueous solution to
the solid mineral surfaces with which it is in contact.
Advection: Bulk movement of fluids from one location to another.
Aperture: Spacing between fracture walls.
Discrete Fracture Network: A population of individual fractures considered acting
together as a hydrological and/or mechanical system.
Dispersion: Refers to the process of spreading and diluting during transport.
Fracture: Any discrete discontinuity, natural or induced, which provides a conduit
for movement of fluid.
Isosurface: A type of display that shows a 3D surface for a given value.
Macro: A mini-program, which will execute a series of commands in series.
Module: A separate and distinct unit of software that may be used as a component in
a system.
Tortuosity: Refers to a twisted or crooked flow path.
Visualisation: Graphical presentation of information.
32
References
Andersson J. & Dverstorp, B. 1987, ‘Conditional simulations of fluid flow in three
dimensional networks of discrete fractures’,
Water Resources Research, vol. 23, no. 10, pp. 1876-1886
Andersson J. & Thunvik, R. 1986, ‘Predicting mass transport in discrete fracture
networks with the aid of geometrical field data’,
Water Resources Research, vol. 22, no. 13, pp. 1941-1950
Brown, S. R. 1987, ‘Fluid flow throgh rock joints: the effect of surface roughness’,
Journal of Geophysical Research, vol. 92, no. B2, pp. 1337-1347
Brown, S. R. 1989, ‘Transport poperties of fractures’,
Journal of Geophysical Research, vol. 94, no. B7, pp. 9429-9438
IBM Research 2006 [online resource]
http://www.research.ibm.com/dx/
Elsworth, D. 1987, ‘A boundary element-finite element procedure for porous and
fractured media flow’,
Water Resources Research, vol. 22, no. 4, pp. 551-560
Fetter, C. W. 1994, Applied Hydrogeology, 3rd edition,
Prentice Hall, Inc., New Jersey
Freeze, R. A. & Cherry, J. A. 1979, Groundwater,
Prentice Hall, Inc., New Jersey
MATLAB 2006, The Language of Technical Computing
MATLAB Documentation
33
Miller, I., Lee, G., & Dershowitz, W. 1999, MAFIC, Matrix Fracture Interaction Code
With Heat and Solute Transport, User Documentation,
Version 1.6, Golder Associates Incorporated, Redmund, Washington
Natural Fractures 2006 [online resource]
http://www.naturalfractures.com
OpendDX Documentation [online resource]
http://www.opendx.org/
Pawley, S. 2002, ‘Influence of Fracture Geometry on Pumping Well Capture’,
Final Year Environmental Engineering Thesis, University of Western Australia
Snow, D. T. 1969, ‘Anisotropic permeability of fractured media’,
Water Resources Research, vol. 5, no. 6, pp. 1273-1289
Tsang, Y. W. 1984, ‘The effect of tortuosity on fluid flow in a single fracture’,
Water Resources Research, vol. 20, no. 9, pp 1209-1215
Witherspoon, P. A., Wang, J. S. Y., Iwai, K. & Gale, J. E. 1980, ‘Validity of Cubic
Law for fluid flow in a deformable rock fracture’,
Water resources Research, vol. 16, no. 6, pp. 1016-1024
34
Appendices Appendix A: MATLAB code
% function result = processdata(str,str1)
%
% r = processdata('input.txt','output.txt')
%
% To use this function make sure that the matlab workspace is set to the
% directory that the files are found in (including the m file)
% Once that is done the following has to be input
%
% str = input file name (in quotations ie: 'elements.txt')
% str1 = output file name (in quotations ie: 'nodes.txt')
%
% An output file will be created in the same directory called results_stripped.txt
function result = processdata(str,str1);
data = load(str);
[m,n] = size(data);
% result is the nodes listed
result = zeros(m*3,2);
counter = 1;
counter2 = 1;
% m is the number of elements
for i = 1:m
% temp is the 3 nodes and fracture group number
temp = data(i,2:5);
for j = 1:3
% for the itteration get the size of the result file
[m1,n1] = size(result);
contains = false;
% loop through each node that has already been processed
for k = 1:m1
% if the node is there check if it has the same fracture number
if (result(k,1) == temp(j))
% does it have the same fracture number?
if (result(k,2) == temp(4))
% yes it does so it is already there
contains = true;
35
else
% if not continue
end
end
end
% if it is not there then add it to the result file
if (contains == false)
result(counter,1) = temp(j);
result(counter,2) = temp(4);
counter = counter +1;
else
% reset the boolean counter
contains = false;
end
end
end
% sort the nodes
temp = sortrows(result,1);
% create a temporary matrix
temp1 = temp;
% find the size of the sorted results matrix
[m,n] = size(temp);
end
for i = 1:m
if (temp(i,1) == 0)
temp1 = temp(i+1:m,:);
else
end
end
result = temp1;
data = load(str1);
[m,n] = size(result);
% create the inital data list results.txt
for i = 1:m
result(i,3) = data(result(i),4);
result(i,4) = data(result(i),5);
result(i,5) = data(result(i),6);
result(i,6) = data(result(i),7);
end
save 'results.txt' result -ascii -tabs;
36
% now renumber the fracture groups for results_stripped.txt
[m,n] = size(result);
fracturenumber = 0;
previousnumber = 0;
currentnumber = 1;
result = sortrows(result,2);
for i = 1:m
currentnumber = result(i,2);
if (currentnumber == previousnumber)
result(i,2)= fracturenumber;
else
previousnumber = currentnumber;
fracturenumber = fracturenumber + 1;
result(i,2)= fracturenumber;
end
end
% create the new data list results_stripped.txt
[m,n] = size(result);
temp = zeros(m,5);
temp(:,1) = result(:,3);
temp(:,2) = result(:,4);
temp(:,3) = result(:,5);
temp(:,4) = result(:,6);
temp(:,5) = result(:,2);
result = temp;
save 'results_stripped.txt' result -ascii -tabs;
37
Appendix B: OpenDX General File
File name: fracimport (OpenDX General Import Header)
file = c:\work_directory\results_stripped.txt
points = 2999format = ascii
interleaving = field
majority = column
field = locations, head, frac
structure = 3-vector, scalar, scalar
type = float, float, float
end
NOTE: the correct work directory needs to be specified and results_stripped.txt must
also be present in the same directory.
38
Appendix C: OpenDX Loop Macro
Filename: FracMacro3.net
39
Appendix D: OpenDX Main Visualisation Program
Filename: FRACVIS.net
40
Appendix E: Sample Node Data
NODE X Y Z Type H Q Grp
1 -2.80838728E+00 -2.65698013E+01 4.23138589E-01 0 1.00000E+01 1.56000E-08 0
2 -1.70186081E+01 -1.62911224E+01 6.55427694E-01 0 1.00000E+01 1.56000E-08 0
3 1.30717218E+00 -2.05590515E+01 -4.81269979E+00 0 1.00000E+01 1.56000E-08 0
4 -2.55627785E+01 3.81770563E+00 -1.95186067E+00 0 1.00000E+01 1.56000E-08 0
5 3.71534848E+00 -4.16427279E+00 -2.02689028E+00 0 1.00000E+01 1.56000E-08 0
6 -9.96503067E+00 -7.79342937E+00 -1.88954341E+00 0 1.00000E+01 1.56000E-08 0
7 -2.92794113E+01 1.28530684E+01 4.68929291E+00 0 1.00000E+01 1.56000E-08 0
8 -2.19489365E+01 -1.12140293E+01 3.94594979E+00 0 1.00000E+01 1.56000E-08 0
9 2.03384514E+01 1.13879318E+01 -3.55641663E-01 0 1.00000E+01 1.56000E-08 0
10 1.74209576E+01 2.49694538E+01 4.05256367E+00 0 1.00000E+01 1.56000E-08 0
11 1.85571766E+01 2.08556881E+01 -4.92415857E+00 0 1.00000E+01 1.56000E-08 0
12 1.89403915E+00 1.41446104E+01 -4.95640182E+00 0 1.00000E+01 1.56000E-08 0
13 -9.18111992E+00 1.06320903E-03 -4.98280907E+00 1 4.25840E+00 0.00000E+00 23
14 -1.17007198E+01 -1.77852001E+01 -4.99630260E+00 1 4.05170E+00 0.00000E+00 23
15 -1.42533178E+01 -3.25190086E+01 -2.25654864E+00 0 1.00000E+01 1.56000E-08 0
16 6.18040705E+00 -1.25203857E+01 -4.64635038E+00 0 1.00000E+01 1.56000E-08 0
17 -5.69331074E+00 4.61294413E+00 1.56532407E+00 0 1.00000E+01 1.56000E-08 0
18 -2.50754662E+01 1.40760708E+01 4.37644672E+00 0 1.00000E+01 1.56000E-08 0
19 -1.55534906E+01 -1.31767588E+01 -4.47266728E-01 0 1.00000E+01 1.56000E-08 0
20 1.58633244E+00 -1.74035397E+01 -2.33364582E+00 0 1.00000E+01 1.56000E-08 0
21 1.31380205E+01 2.34055653E+01 -2.37146020E+00 0 1.00000E+01 1.56000E-08 0
22 -1.71725082E+01 -1.56035061E+01 3.65702939E+00 0 1.00000E+01 1.56000E-08 0
41
Appendix F – Sample Element Data
Elem. # Node1 Node2 Node3 frac. # set # Transmiss Storativ Aperture
1 25 164 165 4 1 1.00000E-06 1.00000E-04 6.85640E-05
2 161 162 171 4 1 1.00000E-06 1.00000E-04 6.85640E-05
3 161 162 170 4 1 1.00000E-06 1.00000E-04 6.85640E-05
4 161 171 173 4 1 1.00000E-06 1.00000E-04 6.85640E-05
5 161 170 173 4 1 1.00000E-06 1.00000E-04 6.85640E-05
6 162 169 170 4 1 1.00000E-06 1.00000E-04 6.85640E-05
7 162 167 171 4 1 1.00000E-06 1.00000E-04 6.85640E-05
8 163 171 173 4 1 1.00000E-06 1.00000E-04 6.85640E-05
9 163 165 171 4 1 1.00000E-06 1.00000E-04 6.85640E-05
10 163 166 173 4 1 1.00000E-06 1.00000E-04 6.85640E-05
11 164 165 167 4 1 1.00000E-06 1.00000E-04 6.85640E-05
12 165 167 171 4 1 1.00000E-06 1.00000E-04 6.85640E-05
13 166 168 172 4 1 1.00000E-06 1.00000E-04 6.85640E-05
14 166 172 173 4 1 1.00000E-06 1.00000E-04 6.85640E-05
15 26 869 870 7 1 1.00000E-06 1.00000E-04 1.86050E-05
16 26 866 870 7 1 1.00000E-06 1.00000E-04 1.86050E-05
17 61 178 785 7 1 1.00000E-06 1.00000E-04 1.86050E-05
18 61 693 864 7 1 1.00000E-06 1.00000E-04 1.86050E-05
19 61 174 175 7 1 1.00000E-06 1.00000E-04 1.86050E-05
20 61 785 864 7 1 1.00000E-06 1.00000E-04 1.86050E-05
21 61 175 178 7 1 1.00000E-06 1.00000E-04 1.86050E-05
22 62 862 868 7 1 1.00000E-06 1.00000E-04 1.86050E-05
23 62 130 862 7 1 1.00000E-06 1.00000E-04 1.86050E-05
42
Appendix G – Sample Correlated Data
Filename: results_stripped.txt
X Y Z Head frac#
-1.1291000e+001 -1.1802000e+001 5.0000000e+000 3.7210000e+000 1.0000000e+000
-3.0780000e+000 -2.1686000e+001 3.5380000e+000 3.5780000e+000 1.0000000e+000
-2.7590000e+000 -1.6579000e+001 2.8210000e+000 3.7050000e+000 1.0000000e+000
-5.8460000e+000 -2.6422000e+001 5.0000000e+000 3.3770000e+000 1.0000000e+000
-6.7590000e+000 -1.4339000e+001 3.8430000e+000 3.6940000e+000 1.0000000e+000
-8.0200000e+000 -2.0583000e+001 5.0000000e+000 3.5660000e+000 1.0000000e+000
-4.9180000e+000 -2.8913000e+001 5.0000000e+000 3.3300000e+000 1.0000000e+000
-6.0700000e+000 -1.4725000e+001 3.6670000e+000 3.6910000e+000 1.0000000e+000
-4.8320000e+000 -2.9144000e+001 5.0000000e+000 3.3330000e+000 1.0000000e+000
9.1130000e+000 -2.3225000e+001 -2.1000000e-001 3.7640000e+000 1.0000000e+000
1.3620000e+000 -2.6515000e+001 2.6860000e+000 3.5390000e+000 1.0000000e+000
-4.3210000e+000 -2.1562000e+001 3.9240000e+000 3.5620000e+000 1.0000000e+000
-4.6000000e+000 -2.9062000e+001 5.0000000e+000 3.3370000e+000 1.0000000e+000
-2.6220000e+000 -2.8206000e+001 4.1740000e+000 3.4240000e+000 1.0000000e+000
2.3410000e+001 -1.7097000e+001 -5.0000000e+000 4.9810000e+000 2.0000000e+000
-6.1010000e+000 -2.7958000e+001 -5.0000000e+000 4.1190000e+000 2.0000000e+000
8.6480000e+000 -2.2510000e+001 -5.0000000e+000 4.5500000e+000 2.0000000e+000
4.2110000e+000 -2.4284000e+001 -4.9430000e+000 4.2490000e+000 2.0000000e+000
-7.4620000e+000 -2.8461000e+001 -5.0000000e+000 4.0790000e+000 2.0000000e+000
-7.3590000e+000 -2.8566000e+001 -4.9620000e+000 4.0080000e+000 2.0000000e+000
-1.5548000e+001 -3.1448000e+001 -5.0000000e+000 3.8430000e+000 2.0000000e+000
-1.4873000e+001 -3.3406000e+001 -4.4170000e+000 -7.6370000e-001 2.0000000e+000