Geometrical operators

Overview

Modeling geometry in a combinatorial manner relies on relationships between volumes/holes. The default relationship is “is contained in” and the following relationships are available to clarify the modeling:

  • “overwrites” or “is overwritten by” another volume (SUPE and INFE keywords);

  • “union with” other Volumes (UNIO keyword);

  • “intersection of” other Volumes (INTE keyword);

  • “truncation of” other Volumes (TRUN keyword).

Warning

The user must meticulously describe any factors that could influence neutron tracking within a volume using these relationships. Omitting an operator may lead to inaccurate neutron tracking due to geometry errors.

The external volume of the geometry cannot be overwritten, joined (union), intersected or truncated.

The following restrictions apply to holes:

  • It is forbidden for a hole to overwrite another hole or be overwritten by another hole or a volume using the SUPE keyword.

  • However, a hole can be overwritten by a volume using the INFE keyword.

  • Union between holes are forbidden (no use of UNIO keyword);

  • Holes cannot be used to intersect a volume (using the INTE keyword);

  • Holes cannot be used to truncate a volume (using the TRUN keyword).

Three additional operations exist for volumes/holes:

  • The REV(X|Y|Z) keywords change the center position through a “circular” translation relative to a point;

  • The ROTA keyword changes the orientation about an axis;

Tip

Excessive reliance on geometric operators can complicate geometry management and impede simulation performance. Whenever feasible, the user must prefer solutions that minimize their usage.

An error is raised when the result of an intersection or truncation is empty.

When dealing with operators and infinite-shape volumes, the code cannot determine whether or not a volume/hole with an infinite shape extends beyond its enclosing volume. In such cases, it takes the following actions:

  • It truncates a volume/hole with an infinite shape by its parent volume and by the volumes truncating its parent volume, by automatically incorporating TRUN keywords;

  • It intersects a volume/hole with infinite shape by the volumes intersecting its parent volume, by automatically adding INTE keywords.

Concerning operators and lattices, applying an operator to a mesh volume is not permitted:

  • If a volume/hole affects, truncates, or intersects lattice volumes, the operator must be applied to the lattice rather than the mesh volumes. The code then autonomously identifies the volumes impacted by the operators;

  • When a non-mesh volume is directly contained within the lattice volume, the code considers that it overwrites the mesh volumes of the lattice. It automatically determines which mesh volumes it overwrites without requiring the user to explicitly specify them.

Below are examples illustrating potential issues arising when geometrical operators cannot be used or are not used correctly.

Operator issue n°1

In this example volume 2 extends beyond the boundaries of its parent volume (volume 1), triggering an error. The use of the TRUN keyword for volume 2 resolves this problem by restricting the area of volume 2 to the area it shares with volume 1.

../_images/generality_example01.drawio1.svg
Erroneous description
VOLU 1  0  0. 0. 0.
VOLU 2  1  3. 3. 0.
Correct description
VOLU 1  0  0. 0. 0.
VOLU 2  1  3. 3. 0.  TRUN  ( 1 )

Operator issue n°2

In this example, since the TRUN keyword has been used on volume 2, this volume is delimited by its shared area with volume 4 (indicated by dotted lines). As a result, volume 3 exceeds the boundaries of its parent volume (i.e. volume 2). Therefore, it is necessary to specify that volume 3 is also truncated by volume 4.

../_images/generality_example02.drawio1.svg
Erroneous description
VOLU  1  0  
VOLU  4  1  
VOLU  2  4    TRUN  ( 4 )
VOLU  3  2  
Correct description
VOLU  1  0  
VOLU  4  1  
VOLU  2  4    TRUN  1  4  * Use former syntax
VOLU  3  2    TRUN  ( 4 ) * Use new syntax
Example of using the TRUN keyword
GEOM
  MODU 0 
    TYPE 1   BOX    25.0   25.0   1.0
    TYPE 2   BOX    10.0    7.0   1.0
    TYPE 3   BOX     5.0    5.0   1.0
    TYPE 4   BOX    10.0   15.0   1.0

    VOLU 1    0     1   M1    0.0    0.0    0.0
    VOLU 2    4     2   M2    0.0    0.0    0.0  TRUN (4)
    VOLU 3    2     3   M3    0.0    0.0    0.0  TRUN (4)
    VOLU 4    1     4   M4    7.0    0.0    0.0

  ENDM
ENDG

Operator issue n°3

In this example volumes 2 and 3 are both contained in volume 1, but they share a common area. A SUPE keyword has to be used to specify, for example, that volume 3 overwrites volume 2.

../_images/generality_example03.drawio1.svg
Erroneous description
VOLU  1  0  
VOLU  2  1  
VOLU  3  1  
Correct description
VOLU  1  0  
VOLU  2  1  
VOLU  3  1    SUPE  1  2
Example of using the SUPE keyword
GEOM
  MODU 0 
    TYPE 1   BOX    25.0   25.0   1.0
    TYPE 2   BOX    10.0   10.0   1.0
    TYPE 3   BOX     7.0    5.0   1.0

    VOLU 1    0     1   M1    0.0    0.0    0.0
    VOLU 2    1     2   M2   -4.0    0.0    0.0
    VOLU 3    1     3   M3    2.0    0.0    0.0  SUPE 1 2
  ENDM
ENDG

Operator issue n°4

In this example, while volumes 2 and 4 are encompassed within volume 1, they do not overlap as there is no shared region between them. Only volume 3 intersects volume 4. Therefore, it is not necessary to specify that volume 4 overwrites volume 2 (using the SUPE keyword).

../_images/generality_example04.drawio1.svg
Erroneous description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2  
VOLU  4  1  
Correct description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2  
VOLU  4  1   SUPE  1  3

Operator issue n°5

In this example, volumes 3 and 4 overlap due to a shared region that remains unresolved by a geometric operation. The code does not propagate the “SUPE volume 2” from volume 4 to volume 3. Therefore, it is necessary to specify that volume 4 overwrites volume 3 using the SUPE keyword.

../_images/generality_example05.drawio1.svg
Erroneous description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2  
VOLU  4  1   SUPE  (2)
Correct description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2  
VOLU  4  1    SUPE  (2 3)

Operator issue n°6

In this example, volumes 3 and 4 overlap each other because they share an area that is not resolved by a geometrical operation. The code does not automatically propagate the containment of volume 3 within volume 2 to the volumes with which it is united using the UNIO keyword. Therefore, it is necessary to specify whether or not volume 3 overwrites volume 4 (using the SUPE keyword).

../_images/generality_example06.drawio1.svg
Erroneous description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2  
VOLU  4  1   UNIO  (2)
Correct description
VOLU  1  0  
VOLU  2  1  
VOLU  3  2   SUPE  (4)
VOLU  4  1   UNIO  (2)

SUPE

The SUPE keyword identifies the volumes/holes overwritten by the current volume/hole. The overwritten volumes/holes must be contained in, or in a union with, the volume containing the volume/hole that overwrites them.

Block syntax
SUPE  n  v(1) (…) v(n)

Input parameter

Description

n

Number of entries

v(1) (…) v(n)

The identifiers of the overwritten volumes/holes

Example of using SUPE keyword

../_images/supe.drawio1.svg
* Vol. 5 is fully contained in vol. 1
* and partially contained in vol. 2, 3 and 4
VOLU  1  0           
VOLU  2  1           
VOLU  3  1           
VOLU  4  3           
VOLU  5  1             SUPE  3  2  3  4

INFE

The INFE keyword specifies the volumes that overwrite the current volume/hole. The overwritten volumes/holes must be contained in, or in a union with, the volume containing the volume/hole that overwrites them.

Block syntax
INFE  v  v1  (…) vn

Input parameter

Description

v

Number of entries

v(1) (…) v(n)

The identifiers of the Volumes that overwrite the current volume/hole

Example of using INFE keyword

../_images/supe.drawio1.svg
* Vol. 5 is fully contained in vol. 1
* and partially contained in vol. 2, 3 and 4
VOLU  1  0           
VOLU  2  1             INFE 1 5
VOLU  3  1             INFE 1 5
VOLU  4  3             INFE (5)
VOLU  5  1           

UNIO

This keyword is applied when multiple volumes with the same material composition intersect. It specifies the volumes that are in union with the current volume.

Block syntax
UNIO  n  v(1) (…) v(n)

Input parameter

Description

n

Number of entries

v(1) (…) v(n)

The identifiers of the Volumes in union with the current volume

Example of using UNION

../_images/unio.drawio1.svg
* Vol. 2, 3 and 4 are in union.
* They contain the same material composition (m2).
VOLU  1  0    m1       
VOLU  2  1    m2       
VOLU  3  1    m2       
VOLU  4  1    m2         UNIO  ( 2  3 )

The union operation is commutative, so it’s unnecessary to specify that volumes 2 and 3 are united with volume 4. The following description for volumes 2 and 3 is redundant:

VOLU  2  1    m2         UNIO  ( 4 )
VOLU  3  1    m2         UNIO  ( 4 )

Note

  • If two volumes are in union:

    • they must have the same parent volume,

    • or one must replace the volume containing the other,

    • or they must replace the same volume.

  • If the united volumes are in a lattice, they must be contained in the same mesh volume.

  • When both the UNIO and SUPE keywords are simultaneously utilized: If two volumes are united, the common space has two volume identifiers. Any volume partially or entirely contained within this shared space must be labelled with respect to both volumes, using the identifier of the parent volume and/or the SUPE keyword.

INTE

This keyword reduces a volume/hole to its shared area with other Volumes of elementary shape. Only this intersecting volume/hole will be taken into account in the calculation.

Block syntax
INTE  n  v(1) (…) v(n)

Input parameter

Description

nv

Number of entries

v(1) (…) v(n)

The identifiers of volumes that intersect the current volume/hole

The v1 (…) vn volumes are termed “fictitious” and solely exist to confine the space of the current volume/hole. They are not considered for the neutron tracking:

  • their material composition is not considered;

  • in most cases, their parent volume can be any volume. However, if the v1 (…) vn Volumes are in a lattice, they must either be contained in the same mesh volume as the current volume/hole, or must not be contained in any mesh volume.

Example of using INTE keyword

../_images/inte.drawio1.svg
* Volumes 5 and 6 are fictitious,
* they do not exist as a material envelope and
* are used to reduce the envelope of
* Volumes 2, 3 and 4.
* The parent volume of volumes 5 and 6
* is volume 1, but it could also be equal
* to 2, 3 or 4 as it is not considered for the
* simulation.
VOLU  1  0           
VOLU  2  1             INTE  1  5
VOLU  3  2             INTE  1  5
VOLU  4  1             INTE  2  5  6
VOLU  5  1           
VOLU  6  1           
* As the infinite volume 6 is fictitious,
* there is no need to truncate this
* volume by its parent volume.

TRUN

This keyword reduces a volume/hole based on the envelopes of outer volumes: the volume/hole no longer exists beyond the limits of the Volumes that truncate it. The truncated volumes/holes must be contained in the volumes truncating them.

Block syntax
TRUN  n  v(1) (…) v(n)

Input parameter

Description

n

Number of entries

v(1) (…) v(n)

Volume identifiers that truncate the current volume/hole

Example of using TRUN keyword

../_images/trun.drawio1.svg
* In the figure above:
* - the shapes of Volumes 3 and 4 are
*   semi-spheres (using the SPHE keyword);
* - the volume 5 is the space of volume 4
*   below the plane (the shape of volume 5
*   is defined using the PLAZ and INFE keywords);
* The TRUN keyword must be used to limit the volume:
* - Volumes 3 and 4 are delimited by their
*   parent volume (i.e. volume 2);
* - Volume 5 is delimited by volume 2 and
*   its parent volume (i.e. volume 4).
VOLU  1  0          
VOLU  2  1          
VOLU  3  2            TRUN  ( 2 )
VOLU  4  3            TRUN  ( 2 )
VOLU  5  4            TRUN  ( 2  4 )

REV(X|Y|Z)

REV(X|Y|Z) change the center position of the volume/hole through a 3D rotation that takes place around point R. Any point in space is reachable using this operator. The θ and φ angles are defined against a main axis, which is one of the axes of the reference frame of the module (axis X with REVX, etc.). The orientation of the volume/hole remains unchanged by the operation.

Block syntax
REV(X|Y|Z) [ CENT rx ry rz ] [ COLA θ ] [ AZIM φ ] [ DIST λ ]

Input parameter

Description

rx ry rz

Center coordinates of the 3D rotation (default is the module center)

θ

Angle added to the polar angle expressed in degree between 0° and 180° (default is 0°)

φ

Angle added to the azimuthal angle expressed in degree between 0° and 360° (default is 0°)

λ

Coefficient ratio of the radial distance (default is 1.0)

The following figure illustrates the usage of the REVZ keyword. The blue reference frame is the reference frame of the R point. Two transformations are shown:

  • rotation of the center of the cube to the position C by angles θ and φ;

  • the same transformation as the first one, with an increase of the radial distance by the coefficient λ.

../_images/revz.drawio1.svg

Note

  • Values of θ and φ can be negative;

  • The λ value must be strictly positive;

  • The center of revolution R must be different from the volume/hole center;

  • The revolution applies independently to each volume/hole. To apply the same revolution movement to all the volumes/holes contained into a volume one has to apply the revolution movement to a Hole containing a Module containing all the volumes/holes.

Example of using revolution
* This example shows how to use the REVZ keyword to position holes.
GEOM
  MODU  0
    * Definition of used shapes for the volumes or holes
    TYPE  1  BOX  30  30  20
    TYPE  2  BOX   5   6   4
    * Definition of the volumes or holes
    VOLU  1  0  1  m1    0  0  0
    * Create a hole
    HOLE  1  1  2  hole1   20  0  0


    * Following holes are set with the same x, y and z values than the previous
    * one. Revolution movement is added to change their positions.
    HOLE  2  1  2  hole1   20  0  0  REVZ  AZIM    45
    HOLE  3  1  2  hole1   20  0  0  REVZ  AZIM    90
    HOLE  4  1  2  hole1   20  0  0  REVZ  AZIM   135
    HOLE  5  1  2  hole1   20  0  0  REVZ  AZIM   180
    HOLE  6  1  2  hole1   20  0  0  REVZ  AZIM   -45
    HOLE  7  1  2  hole1   20  0  0  REVZ  AZIM   -90
    HOLE  8  1  2  hole1   20  0  0  REVZ  AZIM  -135
    * Create another hole
    HOLE  9  1  2  hole1   20  0  0  REVZ  AZIM   140  COLA  45  DIST  0.2
  ENDM

  MODU  hole1
    * Definition of the shape of the external volume (it must be the same shape
    * than the one that has been used for the hole of the module 0)
    TYPE  1  BOX   5. 6. 4.
    VOLU  1  0  1  m2   0. 0. 0.

    TYPE  2  SPHE  3.
    VOLU  2  1  2  m3   0. 0. 0.
  ENDM

ENDG

PAINT X 0. COLO ( m1 WHIT ) ENDP
PAINT Y 0. ENDP
PAINT Z 0. ENDP

STOP

Output of the example against the X-Y axis:

../_images/revolution_00.png

Output of the example against the Y-Z axis:

../_images/revolution_01.png

ROTA

The ROTA keyword changes the orientation of a volume/hole. Its syntax allows specifying the number and order of successive rotations. Successive rotation axes are identified by the values X, Y or Z. The X, Y or Z axis of order n corresponds to the resulting transformation after the (n-1) previous rotations. If the reoriented entity is:

  • a volume, its content is not modified.

  • a hole, the entire content of the module within the hole undergoes reorientation.

Block syntax
ROTA  n e1 θ1 (..) ei θi (..) en θn

Input parameter

Description

n

The number of successive rotations

ei

The axis of the i-th rotation (the authorized values are X, Y and Z)

θi

The angle relative to the i-th rotation (in degrees)

The following examples show how to use the ROTA keyword.

Example n°1 using ROTA

../_images/rota01.drawio1.svg
GEOM
MODU  0
  TYPE  1  
  TYPE  2    ROTA  1  Z  45
  TYPE  3  
  VOLU  1  0  1  
  VOLU  2  1  2  
  VOLU  3  2  3  
ENDM
ENDG

Example n°2 using ROTA

In this case, the rotation is applied to the external volume of the module and also to its entire content.

../_images/rota02.drawio1.svg
GEOM
MODU  0
  TYPE  1  
  VOLU  1  0  1    
  TYPE  2    ROTA  1  Z  45
  HOLE  1  1  2  1  
ENDM
MODU  1
  TYPE  1  
  VOLU  1  0  1  
  TYPE  2  
  VOLU  2  1  2  
ENDM
ENDG

Example n°3 using ROTA

This example illustrates the code behaviour when multiple ROTA keywords are used at several levels of the geometry description. The ROTA keywords are applied to the shapes of the holes containing the modules. The rotation is applied to the entire content of each Module, regardless of its level in the description. The rotation applied to module 2 is therefore the combination of the rotation of module 1 described in module 0 followed by the rotation of module 2 described in module 1.

../_images/rota03.drawio1.svg
GEOM
MODU  0
  TYPE  1  
  VOLU  1  0  1    
  TYPE  2    ROTA  1  Z  45
  HOLE  1  1  2  1  
ENDM
MODU  1
  TYPE  1  
  VOLU  1  0  1  
  TYPE  2    ROTA  1  Z  -15
  HOLE  2  1  2  2  
ENDM
MODU  2
  TYPE  1  
  VOLU  1  0  1  
ENDM
ENDG

Note

  • Rotational movements are always applied counterclockwise;

  • The rotation operator cannot rotate an external volume; instead the user must rotate the hole.