PageSourceSearch

https://docs-vrgeo-version3.netlify.app/assets/js/1f6340b5.8e50ae38.js

js docs-vrgeo-version3.netlify.app collected 2026-10-03 10:42:35 UTC 12,790 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[24344],{30055(e,t,n){n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"tutorial/tutorial-fractures/tf060-building-a-dfn","title":"Building a DFN","description":"Turning a mapped outcrop into a Discrete Fracture Network \u2014 generating from your fracture sets, conditioning it on observed intensity, validating it against your traces, and where to go next.","source":"@site/versioned_docs/version-3.4/tutorial/tutorial-fractures/tf060-building-a-dfn.md","sourceDirName":"tutorial/tutorial-fractures","slug":"/tutorial/tutorial-fractures/tf060-building-a-dfn","permalink":"/docs/tutorial/tutorial-fractures/tf060-building-a-dfn","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/tutorial/tutorial-fractures/tf060-building-a-dfn.md","tags":[],"version":"3.4","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"description":"Turning a mapped outcrop into a Discrete Fracture Network \u2014 generating from your fracture sets, conditioning it on observed intensity, validating it against your traces, and where to go next.","keywords":["DFN","discrete fracture network","P32","validation","fracture model"]},"sidebar":"docs","previous":{"title":"Measuring fracture intensity","permalink":"/docs/tutorial/tutorial-fractures/tf050-intensity"},"next":{"title":"Level of Detail on meshes","permalink":"/docs/tutorial/quick-tips/qt010-level-of-detail"}}');var i=n(74848),s=n(28453);const o={sidebar_position:6,description:"Turning a mapped outcrop into a Discrete Fracture Network \u2014 generating from your fracture sets, conditioning it on observed intensity, validating it against your traces, and where to go next.",keywords:["DFN","discrete fracture network","P32","validation","fracture model"]},a="Building a DFN",c={},d=[{value:"Why not just type the parameters in",id:"why-not-just-type-the-parameters-in",level:2},{value:"The sequence",id:"the-sequence",level:2},{value:"Where to go next",id:"where-to-go-next",level:2},{value:"Wrap-up",id:"wrap-up",level:2},{value:"See also",id:"see-also",level:2}];function h(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"building-a-dfn",children:"Building a DFN"})}),"\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.strong,{children:"Discrete Fracture Network"})," is a synthetic population of fractures whose\nstatistics match the ones you measured. It is how a fracture study stops being a\ndescription of one rock face and becomes something you can propagate into the\nvolume behind it."]}),"\n",(0,i.jsxs)(t.admonition,{title:"Requires the DFN licence feature",type:"info",children:[(0,i.jsxs)(t.p,{children:["If the Interpretation tree has no ",(0,i.jsx)(t.strong,{children:"Discrete Fracture Network"})," node at all \u2014 as\nopposed to one whose commands are greyed out \u2014 this feature is not on your\nlicence. See ",(0,i.jsx)(t.a,{href:"/docs/general/setup-system/feature-availability",children:"Feature availability"}),"."]}),(0,i.jsx)(t.p,{children:"Everything in the previous four pages stands on its own without it."})]}),"\n",(0,i.jsxs)(t.p,{children:["This page is the shape of the workflow and the judgement calls in it. The\nmechanics are in the ",(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide",children:"DFN user\nguide"})," and, for this\noutcrop-driven route specifically, ",(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-interpretation-matching",children:"DFN: Matching\nInterpretations"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"why-not-just-type-the-parameters-in",children:"Why not just type the parameters in"}),"\n",(0,i.jsx)(t.p,{children:"You can build a DFN by typing a mean orientation, a K, a length distribution and\na P32 for each set. Nothing is wrong with that, and for a sensitivity study it\nis the right thing to do."}),"\n",(0,i.jsx)(t.p,{children:"The outcrop-driven route is different in that every one of those numbers comes\nfrom something you measured, and stays tied to it:"}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{}),(0,i.jsx)(t.th,{children:"Typed in"}),(0,i.jsx)(t.th,{children:"Driven from the outcrop"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Mean direction & K"}),(0,i.jsx)(t.td,{children:"You choose"}),(0,i.jsx)(t.td,{children:"Fisher fit to your orientation groups"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Trace-length distribution"}),(0,i.jsx)(t.td,{children:"You choose"}),(0,i.jsx)(t.td,{children:"Fitted from the measurements themselves"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Intensity (P32)"}),(0,i.jsx)(t.td,{children:"You choose"}),(0,i.jsx)(t.td,{children:"Derived from observed P21 over the real outcrop"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Spatial placement"}),(0,i.jsx)(t.td,{children:"Uniform"}),(0,i.jsx)(t.td,{children:"Biased toward where you actually mapped"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Provenance"}),(0,i.jsx)(t.td,{children:"None"}),(0,i.jsx)(t.td,{children:"Recorded per set, and survives save/reload"})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"Validation"}),(0,i.jsx)(t.td,{children:"None"}),(0,i.jsx)(t.td,{children:"Scored trace-against-trace, with a report"})]})]})]}),"\n",(0,i.jsx)(t.p,{children:"That last row is the reason to care. A typed DFN cannot be wrong, because there\nis nothing to check it against. A conditioned one can be \u2014 and finding out that\nit is, is the useful result."}),"\n",(0,i.jsx)(t.h2,{id:"the-sequence",children:"The sequence"}),"\n",(0,i.jsxs)(t.p,{children:["Your fracture sets from ",(0,i.jsx)(t.a,{href:"/docs/tutorial/tutorial-fractures/tf040-orientations-and-sets",children:"step 3"})," are the input."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"1. Generate."})," Select one or more orientation groups \u2192 ",(0,i.jsx)(t.strong,{children:"Create DFN from\nSelected Groups"}),". Each group becomes one fracture set. VRGS shows a preview of\nthe Fisher statistics per group before committing \u2014 read it, and back out if a\nset has a K that says it is not really one set."]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Groups with fewer than ",(0,i.jsx)(t.strong,{children:"3"})," measurements are skipped."]}),"\n",(0,i.jsxs)(t.li,{children:["The domain comes from the project's ",(0,i.jsx)(t.strong,{children:"map limits"})," (the data extents), so a\nproject with no real 3D extents will refuse rather than build a flat domain."]}),"\n",(0,i.jsxs)(t.li,{children:["Every set starts at a placeholder ",(0,i.jsx)(t.strong,{children:"P32 = 0.3"}),". That is a starting value, not\na measurement, and the next step is what replaces it."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"2. Condition the intensity."})," Ctrl-click the DFN, the outcrop mesh and the\ntrace group \u2192 ",(0,i.jsx)(t.strong,{children:"Override P32 from Selected Traces\u2026"}),". VRGS measures P21 from\nyour traces over the real mesh area and converts it to P32 stereologically."]}),"\n",(0,i.jsx)(t.p,{children:"This is the step that connects the model to the rock. Skip it and 
1you have a\nnetwork with your orientations and an arbitrary number of fractures in it."}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"3. Condition the placement"})," ",(0,i.jsx)(t.em,{children:"(optional)"}),". Ctrl-click the DFN and the mesh \u2192\n",(0,i.jsx)(t.strong,{children:"Set Region Mask Source from Selection"}),", then switch each set's ",(0,i.jsx)(t.strong,{children:"Spatial\nModel"})," to ",(0,i.jsx)(t.em,{children:"Region Mask"})," and ",(0,i.jsx)(t.strong,{children:"Regenerate"}),". Fractures are then placed with a\nfalloff away from the mapped surface, instead of uniformly through the domain \u2014\nappropriate when your mapping covers part of the volume and you do not want to\nclaim knowledge of the rest."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"4. Validate."})," Ctrl-click the DFN, the mesh and the trace group \u2192 ",(0,i.jsx)(t.strong,{children:"Score DFN\nagainst Selected Traces\u2026"}),". The network is cut with the outcrop, and the\nsynthetic traces that result are compared against the ones you mapped, on three\naxes: length distribution (Kolmogorov\u2013Smirnov), orientation (Fisher mean and K),\nand intensity (P21). A visual report opens."]}),"\n",(0,i.jsxs)(t.admonition,{title:"This is a comparison, not a grade",type:"tip",children:[(0,i.jsx)(t.p,{children:"The score is not there to be maximised. A DFN that scores poorly on length but\nwell on orientation and intensity is telling you something specific \u2014 usually\nthat the exposure truncated the long fractures, which is censoring rather than a\nmodel failure."}),(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-validating-against-outcrop",children:"Validating Against Outcrop"}),"\nexplains what to change when each axis fails, and which failures are real."]})]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.strong,{children:"5. Iterate."})," Change what the report tells you to change, ",(0,i.jsx)(t.strong,{children:"Regenerate"}),", and\nscore again. ",(0,i.jsx)(t.strong,{children:"Show Outcrop-Constrained Fractures Only"})," is worth knowing here:\nit hides everything that would not leave a trace on the exposure, which is the\nonly part of the network directly comparable with what you mapped."]}),"\n",(0,i.jsx)(t.h2,{id:"where-to-go-next",children:"Where to go next"}),"\n",(0,i.jsxs)(t.p,{children:["Once the network is conditioned, the analysis tools open up \u2014 connectivity\ngraphs and topology, fracture\u2013fracture and mesh intersections, slicers and\ncross-sections, propagation under a stress tensor, and permeability. All of it\nis in the ",(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide",children:"DFN user guide"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"wrap-up",children:"Wrap-up"}),"\n",(0,i.jsx)(t.p,{children:"That is the whole workflow: traces off the model, orientations out of the\ntraces, sets out of the orientations, intensity out of the traces and the mesh,\nand a network out of all of it \u2014 checked back against the outcrop it came from."}),"\n",(0,i.jsx)(t.p,{children:"Worth collecting as you go:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"/docs/general/viewing-collaboration/report-view",children:"Analysis reports"})," \u2014 pull\nthe stereonets, rose diagrams, intensity charts and DFN validation figures\ninto one document and export it to PDF."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"/docs/general/data-exchange/import-export",children:"Getting Data In and Out"})," \u2014 every\nexport route, including GeoJSON for the whole interpretation."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.a,{href:"/docs/general/viewing-collaboration/virtual-field-trips",children:"Virtual Field Trips"}),"\n\u2014 if the audience for the study is people rather than a reservoir model."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"see-also",children:"See also"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-user-guide",children:"DFN User Guide"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-interpretation-matching",children:"DFN: Matching Interpretations"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/dfn-vali
1dating-against-outcrop",children:"DFN: Validating Against Outcrop"})}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/docs/general/fractures-structure/fracture-intensity-mapping",children:"Fracture Intensity Mapping"})}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},28453(e,t,n){n.d(t,{R:()=>o,x:()=>a});var r=n(96540);const i={},s=r.createContext(i);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.