Geometry module (geometry.f90)

Module geometry

Description

Brief Description: This module handles all geometry read/write/tree generation.

LICENSE:

Full Description:

This module handles all geometry read/write/generation.

Quick access

Variables:

allocate_node_arrays, geo_entry_exit_cap, geo_node_offset, get_final_string, get_local_elem, get_local_node, get_parent_branch, line_segments_for_2d_mesh, linregress, make_grid, merge_2d_from_1d_mesh, merge_trifurcations, mesh_2d_from_1d_crux, mesh_2d_from_1d_generic, mesh_rotate_about_axis, mesh_rotate_vector_about_axis, redistribute_mesh_nodes_2d_from_1d, where_inlist, write_3d_geo, write_surface_geo

Routines:

add_matching_mesh(), add_mesh(), append_units(), coord_at_xi(), define_1d_elements(), define_data_geometry(), define_elem_geometry_2d(), define_mesh_geometry_test(), define_node_geometry(), define_node_geometry_2d(), define_rad_from_file(), define_rad_from_geom(), element_connectivity_1d(), element_connectivity_2d(), evaluate_ordering(), get_airway_deadspace(), get_final_integer(), get_final_real(), get_four_nodes(), get_local_elem_1d(), get_local_node_f(), group_elem_parent_term(), import_node_geometry_2d(), import_ply_triangles(), internal_mesh_reorder(), list_tree_statistics(), make_2d_vessel_from_1d(), make_data_grid(), occlude_vessel(), reallocate_node_elem_arrays(), scale_airways(), set_initial_volume(), triangles_from_surface(), volume_of_mesh(), write_elem_geometry_2d(), write_geo_file(), write_node_geometry_2d()

Needed modules

  • arrays: Brief Description: This module defines arrays.

  • diagnostics

  • indices

  • mesh_utilities

  • other_consts

  • precision: Brief Description: Defines the precision of real parameters.

Variables

  • geometry/allocate_node_arrays [private]
  • geometry/geo_entry_exit_cap [private]
  • geometry/geo_node_offset [private]
  • geometry/get_final_string [private]
  • geometry/get_local_elem [private]
  • geometry/get_local_node [private]
  • geometry/get_parent_branch [private]
  • geometry/line_segments_for_2d_mesh [private]
  • geometry/linregress [private]
  • geometry/make_grid [private]
  • geometry/merge_2d_from_1d_mesh [private]
  • geometry/merge_trifurcations [private]
  • geometry/mesh_2d_from_1d_crux [private]
  • geometry/mesh_2d_from_1d_generic [private]
  • geometry/mesh_rotate_about_axis [private]
  • geometry/mesh_rotate_vector_about_axis [private]
  • geometry/redistribute_mesh_nodes_2d_from_1d [private]
  • geometry/where_inlist [private]
  • geometry/write_3d_geo [private]
  • geometry/write_surface_geo [private]

Subroutines and functions

subroutine  geometry/add_mesh(airway_meshfile)
add_mesh: Reads in an ipmesh file and adds this mesh to the terminal

branches of an existing tree geometry

Parameters:

airway_meshfile [character(len=max_filename_len),in]

Call to:

enter_exit(), reallocate_node_elem_arrays(), element_connectivity_1d(), evaluate_ordering()

subroutine  geometry/add_matching_mesh()

add_matching_mesh:

Call to:

enter_exit(), reallocate_node_elem_arrays()

subroutine  geometry/append_units()

append_units: Appends terminal units at the end of a tree structure

Called from:

two_unit_test()

Call to:

enter_exit()

subroutine  geometry/define_1d_elements(elemfile)

define_1d_elements: Reads in an 1D element ipelem file to define a geometry

Parameters:

elemfile [character(len=max_filename_len),in]

Call to:

enter_exit(), get_final_integer(), element_connectivity_1d(), internal_mesh_reorder(), evaluate_ordering()

subroutine  geometry/define_elem_geometry_2d(elemfile, sf_option)

Reads in 2D ipelem file.

Parameters:
  • elemfile [character(len=*)]

  • sf_option [character(len=4)]

Call to:

enter_exit(), get_final_integer(), get_four_nodes(), element_connectivity_2d()

subroutine  geometry/define_mesh_geometry_test()

define_mesh_geometry_test:

Call to:

enter_exit(), element_connectivity_1d(), evaluate_ordering()

subroutine  geometry/define_node_geometry(nodefile)

define_node_geometry: Reads in an ipnode file to define a tree geometry

Parameters:

nodefile [character(len=max_filename_len),in] :: Input nodefile

Call to:

enter_exit(), get_final_integer(), get_final_real()

subroutine  geometry/define_node_geometry_2d(nodefile)

define_node_geometry_2d: Reads in an ipnode file to define surface nodes

Parameters:

nodefile [character(len=*),in]

Call to:

enter_exit(), get_final_integer(), get_final_real()

subroutine  geometry/define_data_geometry(datafile)

define_data_geometry: reads data points from a file

Parameters:

datafile [character(len=*)]

Call to:

enter_exit()

subroutine  geometry/import_node_geometry_2d(nodefile)

define_node_geometry_2d: Reads in an exnode file to define surface nodes DEC$ ATTRIBUTES DLLEXPORT,ALIAS:”SO_DEFINE_NODE_GEOMETRY_2D” :: DEFINE_NODE_GEOMETRY_2D

Parameters:

nodefile [character(len=*),in]

Call to:

enter_exit(), get_final_integer()

subroutine  geometry/import_ply_triangles(ply_file)
import_ply_triangles: Reads in vtk ply file with list of vertex coordinates

and triangles. Used instead of internal triangle mesh creation for tree growing Writes over any existing triangle mesh.

Parameters:

ply_file [character(len=*),in]

Call to:

enter_exit()

subroutine  geometry/list_tree_statistics(filename)
Parameters:

filename [character(len=*),in]

Call to:

enter_exit(), angle_btwn_vectors(), make_plane_from_3points()

subroutine  geometry/triangles_from_surface(surface_elems)
triangles_from_surface: generates a linear surface mesh of triangles

from an existing high order surface mesh.

Parameters:

surface_elems (*) [integer,in]

Called from:

make_data_grid(), grow_tree()

Call to:

enter_exit(), coord_at_xi()

subroutine  geometry/group_elem_parent_term(parent_list, ne_parent)
group_elem_parent_term: group the terminal elements that sit distal to

a given parent element (ne_parent)

Parameters:
  • parent_list (*) [integer] :: will contain terminal elements below ne_parent on exit

  • ne_parent [integer,in] :: the parent element number

Use :

mesh_utilities (group_elem_by_parent())

Called from:

grow_tree()

Call to:

enter_exit(), group_elem_by_parent()

subroutine  geometry/make_data_grid(surface_elems, num_target, offset, spacing0)
make_data_grid: makes a regularly-spaced 3D grid of data points to

fill a bounding surface. surface is defined by elements in ‘surface_elems’. If zero then grow into all elements.

Parameters:
  • surface_elems (*) [integer,in]

  • num_target [integer,in]

  • offset [real,in]

  • spacing0 [real,in]

Call to:

enter_exit(), get_local_elem_2d(), triangles_from_surface(), volume_internal_to_surface()

subroutine  geometry/make_2d_vessel_from_1d(elem_list)
make_2d_vessel_from_1d: create a surface mesh that aligns with the

centrelines of a 1D tree, and located at distance ‘radius’ from the centre. a template for a set of 5 nodes (that together define a bifurcation) is scaled, rotated, translated to align with the 1d mesh and its radii.

Parameters:

elem_list (*) [integer,in] :: the global stem element number for the 2d mesh

Call to:

enter_exit(), get_local_elem_1d(), bifurcation_element(), stem_element(), which_child(), distance_between_points(), angle_btwn_points(), unit_vector(), angle_btwn_vectors(), element_connectivity_2d()

subroutine  geometry/define_rad_from_file(fieldfile[, radius_type_in])
define_rad_from_file: reads in a radius field associated with an

airway tree and assigns radius information to each element, also calculates volume of each element

Parameters:

fieldfile [character(len=max_filename_len),in]

Options:

radius_type_in [character(len=max_string_len)]

Call to:

enter_exit(), get_final_integer(), get_final_real(), get_local_elem_1d()

subroutine  geometry/define_rad_from_geom(order_system, control_param, start_from, user_rad[, group_type_in[, group_option_in]])
define_rad_from_geom: Defines vessel or airway radius based on

their geometric structure. For ‘order_system’ == ‘strah’ or ‘horsf’, uses a user-defined maximum radius and branching ratio; for == ‘fit’, uses pre- defined radii (read in) and a calculated branching ratio for each path so that the order 1 branches have radius = USER_RAD.

Parameters:
  • order_system [character(len=*),in]

  • control_param [real,in]

  • start_from [character(len=*),in]

  • user_rad [real,in] :: radius of largest branch when order_system

Options:
  • group_type_in [character(len=*)]

  • group_option_in [character(len=*)]

Call to:

enter_exit()

subroutine  geometry/occlude_vessel(vessel_number, ratio)
occlude_vessel: Occludes/modifies vessel or airway radius based on

the ratio provided by user. This subroutine is made for partial occlusions where the vessel (artery or vein) element number and the ratio is provided by user and this will be applied on unstrained radius of the vessels. This subroutine should be called after define_rad_from_geom/file so that the tree radii are identified. This subroutine is useful for running Pulmonary hypertension or pulmonary embolism cases.

Parameters:
  • vessel_number [integer,in] :: Element number that you want to apply occlusion on

  • ratio [real,in] :: partial/or full occlsion ratio (100 means full occlusions

Call to:

enter_exit()

subroutine  geometry/element_connectivity_1d()
element_connectivity_1d: Calculates element connectivity in 1D and

stores in array elem_cnct

Called from:

add_mesh(), define_1d_elements(), define_mesh_geometry_test(), internal_mesh_reorder(), grow_tree()

Call to:

enter_exit()

subroutine  geometry/element_connectivity_2d()
element_connectivity_2d: Calculates element connectivity in 2D and

stores in array elem_cnct_2d

Called from:

define_elem_geometry_2d(), make_2d_vessel_from_1d()

Call to:

enter_exit(), inlist()

subroutine  geometry/internal_mesh_reorder()
internal_mesh_reorder: reorder the mesh so that all elements and nodes are

sequential from the stem branches down

Called from:

define_1d_elements()

Call to:

enter_exit(), element_connectivity_1d(), evaluate_ordering()

subroutine  geometry/evaluate_ordering()
evaluate_ordering: calculates generations, Horsfield orders,

Strahler orders for a given tree

Called from:

add_mesh(), define_1d_elements(), define_mesh_geometry_test(), internal_mesh_reorder(), grow_tree()

Call to:

enter_exit()

subroutine  geometry/scale_airways(scale_factor)
Parameters:

scale_factor [real,in]

subroutine  geometry/set_initial_volume(gdirn, cov, total_volume, rmax, rmin)
set_initial_volume: assigns a volume to terminal units appended on a

tree structure based on an assumption of a linear gradient in the gravitational direction with max, min, and COV values defined.

Parameters:
  • gdirn [integer,in]

  • cov [real,in]

  • total_volume [real,in]

  • rmax [real,in]

  • rmin [real,in]

Called from:

evaluate_vent()

Call to:

enter_exit(), volume_of_mesh()

subroutine  geometry/volume_of_mesh(volume_model, volume_tree)
volume_of_mesh: calculates the volume of an airway mesh including

conducting and respiratory airways

Parameters:
  • volume_model [real]

  • volume_tree [real]

Called from:

solve_gasmix(), set_initial_volume(), get_airway_deadspace(), evaluate_vent(), evaluate_uniform_flow()

Call to:

enter_exit()

subroutine  geometry/write_geo_file(type_bn, filename)
write_geo_file: converts a surface mesh (created using make_2d_vessel_from_1d)

into a gmsh formatted mesh and writes to file. options on ‘type’: 1== single layered surface mesh of the vessel wall

2== double-layered thick-walled volume mesh of vessel wall 3== volume mesh of vessel lumen

Parameters:
  • type_bn [integer,in]

  • filename [character(len=*),in]

Call to:

enter_exit()

function  geometry/get_final_real(string_bn)
Return:

get_final_real [real] :: return the real value

Parameters:

string_bn [character(len=*),in]

Called from:

define_node_geometry(), define_node_geometry_2d(), define_rad_from_file()

subroutine  geometry/reallocate_node_elem_arrays(num_elems_new, num_nodes_new)
reallocate_node_elem_arrays: Reallocates the size of geometric

arrays when modifying geometries

Parameters:
  • num_elems_new [integer,in]

  • num_nodes_new [integer,in]

Use :

indices

Called from:

add_mesh(), add_matching_mesh(), grow_tree()

Call to:

enter_exit()

function  geometry/get_airway_deadspace()
Return:

airway_deadspace [real]

Call to:

volume_of_mesh()

function  geometry/get_local_node_f(ndimension, np_global)
Parameters:
  • ndimension [integer,in]

  • np_global [integer,in]

Return:

get_local_node [integer]

Called from:

get_four_nodes(), define_geometry_fit(), map_versions(), distribute_surface_node_fit(), distribute_nodes_between(), centre_a_node()

function  geometry/get_final_integer(string_bn)
Return:

get_final_integer [integer] :: return the integer value

Parameters:

string_bn [character(len=*),in]

Called from:

define_1d_elements(), define_elem_geometry_2d(), define_node_geometry(), define_node_geometry_2d(), import_node_geometry_2d(), define_rad_from_file()

subroutine  geometry/get_four_nodes(ne, string_bn)
Parameters:
  • ne [integer,in]

  • string_bn [character(len=132),in]

Called from:

define_elem_geometry_2d()

Call to:

enter_exit(), get_local_node_f()

function  geometry/coord_at_xi(ne, xi, basis)
Parameters:
  • ne [integer,in]

  • xi (*) [real,in] :: xi^3-2xi^2+xi

  • basis [character(len=*),in]

Return:

coord_at_xi (3) [real]

Called from:

export_cubic_lagrange_2d(), triangles_from_surface(), coord_at_xi()

Call to:

coord_at_xi()

function  geometry/get_local_elem_1d(ne_global)
Parameters:

ne_global [integer,in]

Return:

get_local_elem_1d [integer]

Called from:

make_2d_vessel_from_1d(), define_rad_from_file(), grow_tree()

subroutine  geometry/write_elem_geometry_2d(elemfile)
Parameters:

elemfile [character(len=*),in]

Call to:

enter_exit()

subroutine  geometry/write_node_geometry_2d(nodefile)
Parameters:

nodefile [character(len=*),in]

Call to:

enter_exit()