Hi Anup,

First of all, I am happy to hear that you are interested in using Frackit! One thing though, this mailing list is for questions related to DuMuX, so I guess this is not the right place to ask questions related to Frackit. We have no mailing list for that, yet, but you can email me directly in the future until we have one (which depends on the question if a user base develops).

Regarding your question: the code currently focuses on 3d, which is the much more difficult case to handle. Therefore, random entity geometry generators are currently only implemented for 3d geometries, and some of the constraints evaluations as well. However, adding support for 1d geometries in the constraints and in the network builder (which you use in your snippet) seemed to be pretty straightforward. I added this to a branch and opened a draft merge request:

https://git.iws.uni-stuttgart.de/tools/frackit/-/tree/feature/2d-entity-networks

https://git.iws.uni-stuttgart.de/tools/frackit/-/merge_requests/210


There was another issue with your example, though: You were using lines as fracture geometries. This represents an infinite line, while fracture geometries must be finite. Thus, you should use segments as fracture geometries. Using the above-mentioned branch, the snippet that I added to the end of this mail works for me. The snippet also contains some checks of the constraints at the end. Before merging this, it would be good to more thoroughly test it. Would you mind using this branch to see if your application works? I assume you have cloned the repository and built the python bindings locally, so you would just have to go to the frackit folder and do

git fetch
git checkout feature/2d-entity-networks
cd build
make && make install_python

to update your local bindings installation. If you have an account at https://git.iws.uni-stuttgart.de/ you can then comment or implement things into the above-mentioned merge request if you want.

To summarize, this gives you the possibility to evaluate constraints on fracture entities and then create (possibly embedded) networks of entities, where all intersections are computed. Then, you can write the result to Gmsh format to produce meshes that are usable in Dumux. What is still missing is the random generation of fracture entity candidates. But In 2d and in Python, you can do this quite easily yourself in a few lines of code I suppose. Moreover, note that the snippet uses a three-dimensional ambient space, while using z-coordinates of 0 everywhere. In the future it would be nice to do all computations in 2d, but for this I need to invest some more work. As said, the focus so far was 3d.


*Code snippet:*

from frackit.common import Id
from frackit.geometry import Point_3, Quadrilateral_3, Segment_3
from frackit.entitynetwork import EntityNetworkBuilder
from frackit.entitynetwork import ContainedEntityNetworkBuilder
from frackit.io import GmshWriter

quad = Quadrilateral_3(
    Point_3(0, 0, 0),
    Point_3(1, 0, 0),
    Point_3(0, 1, 0),
    Point_3(1, 1, 0)
)

# define two fracture segments
fracture1 = Segment_3(Point_3(0.1, 0.1, 0.0),
                      Point_3(0.8, 0.1, 0.0))
fracture2 = Segment_3(Point_3(0.1, 0.8, 0.0),
                      Point_3(0.8, 0.1, 0.0))

# Non-contained entity network
builder = EntityNetworkBuilder()
builder.addEntities([fracture1, fracture2])
network = builder.build()

writer = GmshWriter(network)
writer.setMeshSize(GmshWriter.GeometryTag.entity, 0.1)
writer.write("network_uncontained")

# Contained entity network
builder = ContainedEntityNetworkBuilder()
builder.addSubDomain(quad, Id(1))
builder.addSubDomainEntities([fracture1, fracture2], Id(1))
network = builder.build()

writer = GmshWriter(network)
writer.setMeshSize(GmshWriter.GeometryTag.subDomain, 0.1)
writer.setMeshSize(GmshWriter.GeometryTag.entity, 0.1)
writer.write("network_contained")

### Code for testing purposes of the constraints bindings, remove afterwards
import math
from frackit.entitynetwork import EntityNetworkConstraints
constraints = EntityNetworkConstraints()
constraints.setMinDistance(0.05)
constraints.setMinIntersectingAngle(math.radians(40.0))
constraints.setMinIntersectionDistance(0.05)

# violating the minimum distance to fracture 1
assert not constraints.evaluate(
    Segment_3(Point_3(0.1, 0.14, 0.0), Point_3(1.0, 1.0, 0.0)),
    fracture1
)

# not violating the minimum distance to fracture 1
assert constraints.evaluate(
    Segment_3(Point_3(0.1, 0.16, 0.0), Point_3(1.0, 1.0, 0.0)),
    fracture1
)

# violating the minimum intersection distance to fracture 1
assert not constraints.evaluate(
    Segment_3(Point_3(0.5, 0.06, 0.0), Point_3(0.5, 1.0, 0.0)),
    fracture1
)

# not violating the minimum intersection distance to fracture 1
assert constraints.evaluate(
    Segment_3(Point_3(0.5, 0.04, 0.0), Point_3(0.5, 1.0, 0.0)),
    fracture1
)

# violating the minimum intersection angle with fracture 1
assert not constraints.evaluate(
    Segment_3(Point_3(0.0, 0.05, 0.0), Point_3(1.0, 0.5, 0.0)),
    fracture1
)


On 11.09.21 03:31, Anup Kumar wrote:

Hi
My question is regarding frackit package:
https://git.iws.uni-stuttgart.de/tools/frackit <https://git.iws.uni-stuttgart.de/tools/frackit>

I want to create 1D random embedded fracture in 2D domain.

*Test code-python:*

from frackit.geometry import Point_3, Quadrilateral_3, Direction_3, Line_3, Vector_3

# we use the unit quad as domain
# 2--3
# |   |
# 0--1

p0 = Point_3(0,0,0)
p1 = Point_3(1,0,0)
p2 = Point_3(0,1,0)
p3 = Point_3(1,1,0)
quad = Quadrilateral_3(p0,p1,p2,p3)

# get a line Line(point, direction)
line1 = Line_3(Point_3(0.1,0.1,0), Direction_3(Vector_3(0.5,0.5,0)))

# We can now create an entity network
from frackit.entitynetwork import EntityNetworkBuilder
builder = EntityNetworkBuilder()
builder.addEntities([line1]) # single fracture only

## let the builder construct the network and write it to gmsh file format
print("\n --- Constructing entity network from the raw entities ---\n")
network = builder.build()

print("\n --- Writing .geo file ---\n")
from frackit.io <http://frackit.io> import GmshWriter
writer = GmshWriter(network)
writer.setMeshSize(GmshWriter.GeometryTag.entity, 0.1)
writer.write("network") # filename of the .geo files (will add extension .geo automatically)

print("\n --- Finished writing .geo file ---\n")


Output error message:

frackit@54b158438b4a:~/frackit/appl/example1$ python3 example_1Din2D.py
Traceback (most recent call last):
  File "example_1Din2D.py", line 22, in <module>
    builder.addEntities([line1])
  File "/frackit/.local/lib/python3.6/site-packages/frackit/entitynetwork/__init__.py", line 116, in addEntities
    id = super().addEntity(entity)
TypeError: addEntity(): incompatible function arguments. The following argument types are supported:     1. (self: frackit.entitynetwork._entitynetwork._EntityNetworkBuilderWrapper, arg0: frackit.geometry._geometry.Disk) -> Frackit::Id     2. (self: frackit.entitynetwork._entitynetwork._EntityNetworkBuilderWrapper, arg0: frackit.geometry._geometry.Quadrilateral_3) -> Frackit::Id     3. (self: frackit.entitynetwork._entitynetwork._EntityNetworkBuilderWrapper, arg0: frackit.geometry._geometry.Polygon_3) -> Frackit::Id     4. (self: frackit.entitynetwork._entitynetwork._EntityNetworkBuilderWrapper, arg0: frackit.geometry._geometry.OCCFaceWrapper) -> Frackit::Id

Invoked with: <frackit.entitynetwork.EntityNetworkBuilder object at 0x7f6ade4f2a40>, Frackit::Line<3>



How can I use Line shape in the network builder?

Thank you,

Regards
Anup Shahi
Ph.D. Student




_______________________________________________
DuMux mailing list
DuMux@listserv.uni-stuttgart.de
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux
_______________________________________________
DuMux mailing list
DuMux@listserv.uni-stuttgart.de
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux

Reply via email to