Loop3D / LoopStructural

LoopStructural is an open-source 3D structural geological modelling library.
MIT License
184 stars 36 forks source link

[Question] Type in input data #70

Closed andrea-bistacchi closed 2 years ago

andrea-bistacchi commented 3 years ago

Hello, I am wondering what are the legal types of input data and what is their definition according to classical structural geology terminology.

In core/geological_model.py, at line 333, I find:

Type can be any unique identifier for the feature the data point 'eg' 'S0', 'S2', 'F1_axis' it is then used by the create functions to get the correct data.

I suspect that 'eg' is not a type but means e.g., then I understand that S0 is bedding or layering, S1, S2, etc. are different generations of foliation/schistosity, F1_axis is clear, but what is the type for e.g. a fold axial surface? And the letters should be capitalized or not? In some examples they are lower case.

More in general, is there a general definition of types of these structural data. Unfortunately I cannot find it.

In addition, I have the impression that columns for structural data are somehow redundant. They are: strike, dip, dip_dir, plunge, plunge_dir, azimuth.

strike -> is this defined according to right hand rule with respect to dip direction? I.e. strike = dip_dir - 90°? Is strike or dip_dir "prevailing" in case they are both defined?

plunge, plunge_dir -> I suppose that plunge is used for axes and lineations, and that plunge_dir is actually "trend". Correct?

azimuth (the last column) -> what is this for? Also strike, dip_dir and plunge_dir are azimuths.

Thanks very much!

lachlangrose commented 3 years ago

Hi Andrea,

type is used as a way to link the observations to the geological feature being modelled. For example, if we are modelling a fault the data would have a name that can be used to identify the fault. I have actually renamed type to feature_name to make this more clear but it is backwards compatible but I missed the reference in that documentation.

Each row in the table is an observation and can record the value of the implicit function or components of a vector normal to the surface. There is a bit more information here.

Each feature is then added to the model using the methods of the GeologicalModel class e.g. create_and_add_foliation(name,**kwargs), create_and_add_fault(name,displacement,**kwargs). The function gets the data for the feature being modelled by finding rows where the name matches the feature_name.

The columns strike, dip, dip_dir, plunge etc are all converted into vector components nx,ny,nz. The data i/o is undergoing some changes at the moment to make it easier to go from a map to a model - this will make the conversions easier. It should be finished in the next 2 weeks. For now, I would recommend just specifying the vector components for what you are trying to model.

Hopefully, this is helps.

andrea-bistacchi commented 3 years ago

Thanks for instantaneous reply!

From "For now, I would recommend just specifying the vector components for what you are trying to model." I guess you are only using bedding/foliation constraints at the moment? No fold axes?

Thanks!

andrea-bistacchi commented 3 years ago

One suggestion: using just "feature_name" could be not enough. For instance you can have a "cretaceous" that could be either the top of cretaceous (conformal), a cretaceous unconformity, or a dip/azimuth measurement collected somewhere within the cretaceous (informational). How do you manage that?

I am particularly interested because I am trying to use LoopStructural within a modelling application that we are developing, with a rich user-friendly GUI, and we are reasoning quite a lot about the geological data model (or "legend" in traditional geological terms).

andrea-bistacchi commented 3 years ago

Ah, now I see... is this more up-to-date?

https://loop3d.github.io/LoopStructural/user_guide/input_data.html

To create a geological model the data needs to be formatted in a table the following headings:

X - x component of the cartesian coordinates
Y - y component of the cartesian coordinates
Z - z component of the cartesian coordinates
feature_name - unique name of the geological feature being modelled
val - value observations of the scalar field
interface - unique identifier for an inteface containing similar scalar field values
nx - x component of the gradient norm
ny - y component of the gradient norm
nz - z component of the gradient norm
gx - x component of a gradient constraint
gy - y component of a gradient constraint
gz - z component of a gradient constraint
tx - x component of a gradient tangent constraint
ty - y component of a gradient tangent constraint
tz - z component of a gradient tangent constraint
coord - coordinate of the structural frame data point is used for
andrea-bistacchi commented 3 years ago

Additional question: how do you calculate val for intraformational dip measurements? Just live it as None?

andrea-bistacchi commented 3 years ago

I am now running example 1. Here you use just one feature called 'conformable' for two different stratigraphic surfaces, so it appears that the feature_name acts as the name of a continuous stratigraphic sequence. Correct?

Actually, I have the impression that feature_name is used as a sort of keyword to pick some rows from the data dataframe and tell LoopStructural to use them in the interpolation. Correct?

andrea-bistacchi commented 3 years ago

I confirm. In example 2 feature_name = 'strati' and it is definitely a continuous stratigraphic sequence.