empty fault topology matrix
gpirot opened this issue · comments
Describe your issue
Hi Lachlan,
I am trying to export the topology matrices for the different faults defined in my model.
So far it does not matter when I create_and_add_fault to my model if I define a fault centre, extent, influence and vertical radius or not: either way, when I calculate_fault_topology_matrix, I obtain an empty array.
I am using LoopStructural 1.4.1.
Cheers,
Guillaume
Minimal reproducing code example
I attached a self-contained example in a python notebook.
After building my model, I call:
fault_topo_mat = calculate_fault_topology_matrix(model)
Error message
And when assessing fault_topo_mat, I get the following empty array:
array([], shape=(240, 0), dtype=int32)
The displacement magnitude is 0 for the faults, if you change this it will work.
Providing a displacement magnitude greater than 0 provides me with an array of zeros, which does not inform me if a given voxel is on one side or the other of the faults, or if it is out of its extent.
The fault topology output cannot depend on the magnitude of the fault displacement. It should also be available if no extent is defined (assuming an infinite fault with unlimited extent)
A fault without a displacement is not a fault it is an inactive fault so it does not get incorporated into the topology matrix. Have you plotted the fault displacement map? 0 means the locations are not inside any fault extent so I would be checking that your faults are actually working. Try check if the fault actually appears in the model, either by building the model and checking the offset or plotting the displacement magnitude.
Why is norm of your normal vectors for fault_1 200? This means the scalar field is going to grow very quickly making the fault extent very very small.
The norm of my normal vectors were 200 because I just copied the data from some basal contact, whose orientation vector norm is supposed to be proportional to the maximum thickness, from my understanding of previous explanations.
If I renormalize to 1 the norm of my (fault) normal vectors, then I get some 1, -1 and 0 values in the topology matrix. However, why does the norm of the fault normal vector matter when I specify the fault extent, influence and vertical radius when creating the fault? How is the real extent determined given the fault creation parameters and the norm of the fault normal vectors?
Regarding "A fault without a displacement is not a fault it is an inactive fault ", I read that though inactive, it is still a fault.
In my view, even for an 'inactive fault', the topology matrix should not be empty. What matters in terms of topology is the extent of the fault surface/volume that can act as a barrier or preferential path, not the extent of the displacement field.
If the fault has no displacement what is the fault influence? And which side is the hanging wall? I can change this but the reason it was implemented this way was so you can add a fault for the surface but not increase comutational time
If I renormalize to 1 the norm of my (fault) normal vectors, then I get some 1, -1 and 0 values in the topology matrix. However, why does the norm of the fault normal vector matter when I specify the fault extent, influence and vertical radius when creating the fault? How is the real extent determined given the fault creation parameters and the norm of the fault normal vectors?
I think the default behaviour uses the norm of the vector, you can add an argument points=True
which overwrite this and will use the fault influence distance. Where it adds datapoints to constrain the geometry of the fault volume.
@gpirot the reason you were getting unexpected results is that your orientation data points were constraining the direction and magnitude of the scalar field. The structural frame data were still being added as points to constrain the geometry, but the norms were not being rescaled. Generally using the gradient rather than the norm is better.
I have modified the fault builder to convert norm constraints to gradient constraints when value data points are used to define the shape of the fault volume. If points aren't used and scaled vectors are used by including the argument points=False
in create_and_add_fault then the normal vectors are rescaled. A warning message should appear for either of these cases.