Creating a model from scratch

We describe here how to generate a simple history file for computation with Noddy using the functionality of pynoddy. If possible, it is advisable to generate the history files with the Windows GUI for Noddy as this method provides, to date, a simpler and more complete interface to the entire functionality.

For completeness, pynoddy contains the functionality to generate simple models, for example to automate the model construction process, or to enable the model construction for users who are not running Windows. Some simple examlpes are shown in the following.


In [57]:
from matplotlib import rc_params

In [58]:
from IPython.core.display import HTML
css_file = 'pynoddy.css'
HTML(open(css_file, "r").read())


Out[58]:

In [59]:
import sys, os
import matplotlib.pyplot as plt
# adjust some settings for matplotlib
from matplotlib import rcParams
# print rcParams
rcParams['font.size'] = 15
# determine path of repository to set paths corretly below
repo_path = os.path.realpath('../..')
sys.path.append(repo_path)
import pynoddy.history

In [60]:
%matplotlib inline

In [61]:
rcParams.update({'font.size': 20})

Defining a stratigraphy

We start with the definition of a (base) stratigraphy for the model.


In [70]:
# Combined: model generation and output vis to test:
history = "simple_model.his"
output_name = "simple_out"

import importlib
importlib.reload(pynoddy.history)
importlib.reload(pynoddy.events)

# create pynoddy object
nm = pynoddy.history.NoddyHistory()
# add stratigraphy
strati_options = {'num_layers' : 8,
                  'layer_names' : ['layer 1', 'layer 2', 'layer 3', 
                                   'layer 4', 'layer 5', 'layer 6', 
                                   'layer 7', 'layer 8'],
                  'layer_thickness' : [1500, 500, 500, 500, 500, 500, 500, 500]}
nm.add_event('stratigraphy', strati_options )

nm.write_history(history)

In [71]:
# Compute the model
importlib.reload(pynoddy)
pynoddy.compute_model(history, output_name)


Out[71]:
''

In [72]:
# Plot output
import pynoddy.output
importlib.reload(pynoddy.output)
nout = pynoddy.output.NoddyOutput(output_name)
nout.plot_section('y', layer_labels = strati_options['layer_names'][::-1], 
                  colorbar = True, title="",
                  savefig = False, fig_filename = "ex01_strati.eps")


Add a fault event

As a next step, let's now add the faults to the model.


In [41]:
importlib.reload(pynoddy.history)
importlib.reload(pynoddy.events)
nm = pynoddy.history.NoddyHistory()
# add stratigraphy
strati_options = {'num_layers' : 8,
                  'layer_names' : ['layer 1', 'layer 2', 'layer 3', 'layer 4', 'layer 5', 'layer 6', 'layer 7', 'layer 8'],
                  'layer_thickness' : [1500, 500, 500, 500, 500, 500, 500, 500]}
nm.add_event('stratigraphy', strati_options )




# The following options define the fault geometry:
fault_options = {'name' : 'Fault_E',
                 'pos' : (6000, 0, 5000),
                 'dip_dir' : 270,
                 'dip' : 60,
                 'slip' : 1000}

nm.add_event('fault', fault_options)

In [42]:
nm.events


Out[42]:
{1: <pynoddy.events.Stratigraphy at 0x11a320c50>,
 2: <pynoddy.events.Fault at 0x119e1e208>}

In [43]:
nm.write_history(history)

In [44]:
# Compute the model
pynoddy.compute_model(history, output_name)


Out[44]:
''

In [45]:
# Plot output
importlib.reload(pynoddy.output)
nout = pynoddy.output.NoddyOutput(output_name)
nout.plot_section('y', layer_labels = strati_options['layer_names'][::-1], 
                  colorbar = True, title = "",
                  savefig = False, fig_filename = "ex01_fault_E.eps")



In [46]:
# The following options define the fault geometry:
fault_options = {'name' : 'Fault_1',
                 'pos' : (5500, 3500, 0),
                 'dip_dir' : 270,
                 'dip' : 60,
                 'slip' : 1000}

nm.add_event('fault', fault_options)

In [47]:
nm.write_history(history)

In [48]:
# Compute the model
pynoddy.compute_model(history, output_name)


Out[48]:
''

In [49]:
# Plot output
importlib.reload(pynoddy.output)
nout = pynoddy.output.NoddyOutput(output_name)
nout.plot_section('y', layer_labels = strati_options['layer_names'][::-1], colorbar = True)



In [73]:
nm1 = pynoddy.history.NoddyHistory(history)


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-73-785a8a3b01af> in <module>()
----> 1 nm1 = pynoddy.history.NoddyHistory(history)

/Users/flow/git/pynoddy/pynoddy/history.py in __init__(self, history, **kwds)
     45             # load existing history
     46             self.load_history(history)
---> 47             self.determine_events(verbose=vb)
     48 
     49     def __repr__(self):

/Users/flow/git/pynoddy/pynoddy/history.py in determine_events(self, **kwds)
    362             elif 'STRATIGRAPHY' in e['type']:
    363                 # event_lines = event_lines[:-1]
--> 364                 ev = events.Stratigraphy(lines=event_lines)
    365             elif 'TILT' in e['type']:  # AK
    366                 ev = events.Tilt(lines=event_lines)

/Users/flow/git/pynoddy/pynoddy/events.py in __init__(self, **kwds)
     83         # iterate through lines and determine attributes
     84         if "lines" in kwds:
---> 85             self.parse_event_lines(kwds['lines'])
     86             self.event_type = self.event_lines[0].split("=")[1].strip()
     87 

/Users/flow/git/pynoddy/pynoddy/events.py in parse_event_lines(self, lines)
    127         #         self.property_lines[l[0].strip()] = i
    128 
--> 129         self.name = self.event_lines[-1].split("=")[1].strip()
    130 
    131     def update_properties(self, **kwds):

IndexError: list index out of range

In [51]:
nm1.get_extent()


Out[51]:
(10000.0, 7000.0, 5000.0)

Complete Model Set-up

And here now, combining all the previous steps, the entire model set-up with base stratigraphy and two faults:


In [52]:
importlib.reload(pynoddy.history)
importlib.reload(pynoddy.events)
nm = pynoddy.history.NoddyHistory()
# add stratigraphy
strati_options = {'num_layers' : 8,
                  'layer_names' : ['layer 1', 'layer 2', 'layer 3',
                                   'layer 4', 'layer 5', 'layer 6', 
                                   'layer 7', 'layer 8'],
                  'layer_thickness' : [1500, 500, 500, 500, 500, 
                                       500, 500, 500]}
nm.add_event('stratigraphy', strati_options )

# The following options define the fault geometry:
fault_options = {'name' : 'Fault_W',
                 'pos' : (4000, 3500, 5000),
                 'dip_dir' : 90,
                 'dip' : 60,
                 'slip' : 1000}

nm.add_event('fault', fault_options)
# The following options define the fault geometry:
fault_options = {'name' : 'Fault_E',
                 'pos' : (6000, 3500, 5000),
                 'dip_dir' : 270,
                 'dip' : 60,
                 'slip' : 1000}

nm.add_event('fault', fault_options)
nm.write_history(history)

In [53]:
# Change cube size
nm1 = pynoddy.history.NoddyHistory(history)
nm1.change_cube_size(50)
nm1.write_history(history)

In [54]:
# Compute the model
pynoddy.compute_model(history, output_name)


Out[54]:
''

In [55]:
# Plot output
importlib.reload(pynoddy.output)
nout = pynoddy.output.NoddyOutput(output_name)
nout.plot_section('y', layer_labels = strati_options['layer_names'][::-1], 
                  colorbar = True, title="",
                  savefig = True, fig_filename = "ex01_faults_combined.eps",
                  cmap = 'YlOrRd') # note: YlOrRd colourmap should be suitable for colorblindness!



In [ ]:


In [ ]: