1. Functions overview
1.1. Tracking of a particule and operations allong a flow line
- class icetrackpy.icetracker.Mesh(mesh_path=None, compiled=True, parallel=True, nb_processors=8)
Bases:
object
This object contains the mesh on wich we want to work and all of the values associated with it, it can also add values to the mesh by for example computing the strain field from the velocity field
This methode creats an object of Mesh, is is used at the begining to initialise the mesh object
- Parameters:
mesh_path (str or None) – This is the complete path of the mesh on which you want to work on, it should contain the name of the file and the extension (idealy a .vtu), for example it can be something like : ‘/home/my_mesh.vtu’, if no values or given the function “from_save” can be used to restor a saved mesh
compiled (bool) – Defines if later the object can use compiled versions of the code or if the python versions of the algorihtms should be used
parallel (bool) – Defines if multiprocessing is allowed or not later when dooing operations on the mesh
nb_processors (int) – If parallel==True, it defines in how many parts the task is splited, this is idealy equal to the number of cores of the processor
- DN(a1: float, a2: float, a3: float)
This function gives out the derivative of the shape functions, this enables the uder to then calculate the jacobian for example Theses shape functions are for wedges elements only The numeroation is made acording to this page https://web.mit.edu/calculix_v2.7/CalculiX/ccx_2.7/doc/ccx/node34.html
- Parameters:
a1 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 1
a2 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 2
a3 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 3
- Returns:
returns a matrix of size 6 by 3 of the derivative of the shape functions
- Return type:
np.array([6,3])
- J(a1: float, a2: float, a3: float, wedge_id: int)
This function calculates the jacobian of the wedge element at the cordinate given and for the given wedge
- Parameters:
a1 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 1
a2 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 2
a3 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 3
wedge_id (int) – the id of the wedge in wich the jacobian will be calculated
- Returns:
returns a matrix of size 3 by 3 which is the jacobian
- Return type:
np.array([3,3])
- N(a1, a2, a3)
This methode computes the shape functions of a wedge element base on the numeroation on this web site ‘https://web.mit.edu/calculix_v2.7/CalculiX/ccx_2.7/doc/ccx/node34.html’
- Parameters:
a1 (float) – coordiate in the 1 direction in the local bass
a2 (float) – coordiate in the 2 direction in the local bass
a3 (float) – coordiate in the 3 direction in the local bass
- Returns:
returns an array of size 6 of the shape functions
- Return type:
np.array
- _compute_deviatoric_stress_cuffey(strain_rate, A1, A2, Q1, Q2, T, glen_exponent)
Compute the deviatoric stress tensor directly from the strain rate tensor using Glen’s flow law with cuffey prefactor
- Parameters:
strain_rate – Strain rate tensor (3x3 ndarray)
A1 – flow rate prefactor dependant on the temeprature for low temp <-10
A2 – flow rate prefactor dependant on the temeprature for high temp >-10
Q1 – activation energie for the first A1
Q2 – activation energie for the first A2
glen_exponent – glen exponent of the flow law
- Returns:
Deviatoric stress tensor (3x3 ndarray).
- _compute_deviatoric_stress_glen(strain_rate, A, n)
Compute the deviatoric stress tensor directly from the strain rate tensor using Glen’s flow law.
- Parameters:
strain_rate – Strain rate tensor (3x3 ndarray)
A – flow rate viscosity
n – glen exponent
- Returns:
Deviatoric stress tensor (3x3 ndarray).
- _invert_mesh_parallel(queue, task)
This methode allows us to find the wedges connected to a given lis of points This methode is internal and allows for parallel computing internally, it should not be directly used
- Parameters:
queue (mp.queue object) – queue for multiprocessing
task (list) – list of the start node and end node for the mesh insertion task
- _invert_mesh_parallel_compiled(queue, task, mesh_wedges_ctype)
This methode allows us to find the wedges connected to a given lis of points This methode is internal and allows for parallel computing internally with the compiled function, it should not be directly used
- Parameters:
queue (mp.queue object) – queue for multiprocessing
task (list) – list of the start node and end node for the mesh insertion task
mesh_wedges_ctype – memory adress where the list of wedges is storded
- Type:
ctype object
- _strain_rate_parallel(queue, tasks)
This function in not meant to used directly by the end user but it allows for strain calculation in parallel
- Parameters:
queue (mp.queue object) – queue for multiprocessing
task (list) – list of the start node and end node for the mesh insertion task
- compute_strain_rate(save_to_mesh=True)
This functions is meant to compute the strain rate if only the velocity field is availabe is can save or not the new filed to the vtu file
- Parameters:
save_to_mesh (bool) – tells if we whant to save the calculated value to the vtu file for future use or visualisation
- compute_stress_cuffey(A1=9125353404000.0, A2=7.660165593599999e+23, Q1=60000.0, Q2=115000.0, T=273, glen_exponent=3)
This function computes an approxiamtion of the stress using the glen law it enable the user to compute stress after the simulation has run, this doent igve the same results has elmer a closer look should be taken to better understand why
- Parameters:
A1 (float) – flow rate prefactor dependant on the temeprature for low temp <-10
A2 (float) – flow rate prefactor dependant on the temeprature for high temp >-10
Q1 (float) – activation energie for the first A1
Q2 (float) – activation energie for the first A2
T (float) – temperature of the ice in kelins
glen_exponent (float) – exponent of the glen law, usually 3 for ice
- Returns:
adds the fileds “sxx” – “syz” to the mesh nodes fields so that they can be advected with the particule
- compute_stress_glen(glen_exponent=3, viscosity=3.17e-06)
This function computes an approxiamtion of the stress using the glen law it enable the user to compute stress after the simulation has run, this doent igve the same results has elmer a closer look should be taken to better understand why
- Parameters:
glen_exponent (float) – exponent of the glen law, usually 3 for ice
viscosity (float) – the viscosity that should be used for the glen law
- Returns:
adds the fileds “sxx” – “syz” to the mesh nodes fields so that they can be advected with the particule
- extract_data()
This function extracts all of the available data at each nodes of the mesh and adds it to the local mesh object
- from_save(folder_path)
Allows the user to creat a mesh from a previous save made before, it will recreat all of the elements needed for the mesh creation
- Parameters:
folder_path (str) – path to the global folder of the save
- grad_v(a1: float, a2: float, a3: float, wedge_id: int)
This function calculates the gradient of the velocity field in the given element at the given coordinates
- Parameters:
a1 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 1
a2 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 2
a3 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 3
wedge_id (int) – the id of the wedge in wich the jacobian will be calculated
- Returns:
returns a matrix of size 3 by 3 which is the gradient of the velocity
- Return type:
np.array([3,3])
- invert_mesh()
This methode allows the user to find the relation between the nodes and the wedges, this is not stored in the .vtu file. It is mendatory to call it after mesh import for the tracker to work properlly This operation is quite time consuming (O(n^2) with n the number of elements) thus it is parallelized and compiled
- is_top_surface(point)
This function tells the user if a given point is on the top surface of the mesh or not
- Parameters:
point (int) – this should be the id of the point where we whant to know if we are on top or not
- Returns:
returns true if the point given is on the top surface
- Return type:
bool
- select_points(methode='z_min_max', ice_mask=False, ice_mask_key='icymask', ice_mask_inside_val=1, tol=0.1, **kwargs)
This methode enable the user to to select a big number of points at the same time, the selected particules can only be selected on the top and bottom surface not on the edeges or in the volume, each time they or selected at the node
- Parameters:
methode (str) – this parameters helps select the methode of point selection it can take 2 values : “z_min_max” or “z_min_max_y_min_max_x_min_max”
ice_mask (bool) – says if there is an ice mask to use for point selection
ice_mask_key (str) – key word in the mesh dictionnary for the icemask layer
ice_mask_inside_val (float) – value where ice is supposed to exist
tol (float) – this is by how much the ice_mask_value is able to change for it to be inside the glacier or not
kwargs (kwargs) – this is to define the boundaries of the selection depending on the methode, if the methode “z_min_max” is selected, the arguments are “z_min”:int, “z_max”:int and “surf_type”:str in [“top”,”bottom”,”top_and_bottom”], if the methode “z_min_max_y_min_max_x_min_max” is selected the parameters “x_min”:int, “x_max”:int, “y_min”:int, “y_max”:int are added
- Returns:
it returns the list of the coodrinates of each points and the list of the trianlges of the mesh composed by those points
- Return type:
tuple(list,list)
- strain_rate(a1: float, a2: float, a3: float, wedge_id)
This function calculates the strain rate a given coordinate in a given wedge
- Parameters:
a1 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 1
a2 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 2
a3 (float) – value of the coordinate of the point in the local bases of the wedge for the direction 3
wedge_id (int) – the id of the wedge in wich the jacobian will be calculated
- Returns:
returns a matrix of size 3 by 3 which is the tensor of strain rate
- Return type:
np.array([3,3])
- class icetrackpy.icetracker.ParticuleTracker(mesh, eps_top=0.0001, u_min=0.01, start_acu_level=0, nb_friends_max=3, ellipse_factor=10, outside_iter=1, ini_iter=100, dt=-0.01, n=1000, compiled=True, params_to_track=[], parallel=True, verbose=True)
Bases:
object
This class is the instance that enables the user to do some particule tracking and more opperations on each particules
This creats an instance of particule tracker, many parameters are set at the beegining that will be used mater for the particule tracking instance
- Parameters:
mesh (Mesh.object) – this should be an object mesh created by icetrackpy, it can be just a mesh openned by meshio for example
eps_top (float) – this defines the level at which a particule died, if the projection of the nomalized vector motion on the normal to the surface is higher then eps_top then the particule died, if set high it allows the particule to do some surfing, should be between 0 an 1
u_min (float) – This defines the minimum speed at which a particule can go, if the particule is slower then said speed it will die, the speed is both calculated by taking the norm of the velocity field and also by calculating the real speed between 2 cordiantes
start_acu_level – this is the level at which the particules are allowed to melt under if time goes in the normal direction and fall if time is reversed
nb_friends_max (int) – this defines the number of elements the code will look thru when looking for an wedge arround a point, this size is the small axis of an ellips good values between 2 and 4, smaller is faster but less accurate
ellipse_factor (int) – this defines how our research radius looks like an ellipse, for meshesh where elements can have a really bad shapes it is a good idea to set the value higher, value between 1 and 10 is good higher is slower
outside_iter (int) – this is the number of random iterations added to the normal iteration to find the good value of wedge
ini_iter (int) – number of initial tryins to find the node on the first step time, if the mesh is really non concave this value need to be high arround 100 is a good start
dt (float) – this is the step time of the particule tracker higher is faster but less precise
n (int) – number of maximum iterations of the particule tracker
compiled (bool) – tels the programm if he is able to use compiled code recources
params_to_track (list[str]) – list of strings of the parameters that should be added to the dictionnary during the tracking
parallel (bool) – tels the code if he is allowded to multi process the task
verbose (bool) – tells if time steps are printed or not
- _flow_path_parallel(queue, point: array, particule_id)
Called function for parallelisation of the tracking shloud no be used directly by the end user
- Parameters:
queue (queue.object) – queue of the storted results:
point (np.array) – point to be computed
- _int_strain_particule_parallel(queue, particule: dict, param_to_int: str)
This function calls int_strain_particule, it is used for parallization it should not be used by the end user
- Parameters:
particule (dict) – this is the dictionnary of the particule element
param_to_int (str) – parameter wich we want to integrate like “e”
- compact_tensor(field)
This function helps the user compact a tensor that is in the form of many components in the form of xx or _11
- Parameters:
filed – filed name of the tensor that should be compacted for example “e”
- Returns:
adds to the said filed the values of the said tensor
- compact_vector(field)
This function helps the user compact a vector that is in the form of many components in the form of x or _1
- Parameters:
filed – filed name of the vector that should be compacted for example “velocity”
- Returns:
adds to the said filed the values of the said vector
- compute_age()
adds the filed I1 that represent the integration of the time step over the time, this represents the age of the particule
- Returns:
adds the age of the particule in the field “I1”
- compute_deformation_eigval(strain_eigval: str)
This function is used when the strain has been calculated and that we know the eigen value of the strain, in this situation we can compute the déformation tensor of the particule, this is usfull to use the anisotropy factor
- Parameters:
strain_eigval (str) – this is the name of the field of the eigen values of the strain, this field should be a 1D array
- Returns:
adds the field deformation_eigval to the particule trunk where the eigen values of the deformation tensor are storded a 1D np array
- compute_dev(field: str)
This function computes the deviatoric version of the tensor field given
- Parameters:
field – type of tensor field for which we want to know the deviatoric version, for example “e”
- Type:
“str”
- Returns:
adds to the particule dictionnary each filed of the tensor with the addition of the letter “D” for deviatoric, for example “Dexx”
- compute_flatness_anisotropy(tensor_eigval)
This function computes the flatness anisotropy of a tensor field
- Parameters:
tensor_eigval (str) – eigen values field of the tensor we want to calculate
- Returns:
retruns the flatness anisotropy at each step time in the field flatness_anisotropy
- compute_flinn(field, top_cutoff=1)
Computes the vector of the field in the flinn plane for easy visualisation of the anisotropy
- Parameters:
field (str) – field name taht will go through the flinn process calculation, idealy it is the field of the aigen values of the transfomation vector
top_cutoff (int) – to help visualisation, this parametters compresses the to value, if set to one 1 every thing has the proper value, if set to 2 the maximum bound is set to half of the highest value, value shoud be an int higher then 1
- compute_fractional_anisotropy(tensor_eigval)
This function computes the fractional anisotropy of a tensor field
- Parameters:
tensor_eigval (str) – eigen values field of the tensor we want to calculate
- Returns:
retruns the fractional anisotropy at each step time in the field relative_anisotropy
- compute_in_particule_coord(tensor_type: str)
This function function helps us convert ensy tensor field that we have on the particule flowline to the local bases
- Parameters:
tensor_type (str) – give what field we should convert to the local base for strain rate it will be “e” for example
- Returns:
adds the fields of each component of the tensor with a “L” before to indicate the local carrater of the field
- compute_path(points: array)
This functions calculates the tracking of a list of points, it is parallelised and in part compiled
- Parameters:
points (list(np.array([3]))) – list of the starting points for the tracking
- compute_relative_anisotropy(tensor_eigval)
This function computes the relative anisotropy of a tensor field
- Parameters:
tensor_eigval (str) – eigen values field of the tensor we want to calculate
- Returns:
retruns the relative anisotropy at each step time in the field relative_anisotropy
- compute_rotation_matrix()
This functions computes the roation matrix from the field “path” it takes the vector at each time step and calculate the angle relative to base coordinate system. The time step vectors are filtered to keep the algorythm stable even with very noisy data. It can be used with a reversed time step or a foward time step
- compute_strain(param_to_int)
This function calculates the strain rate in the high deformation context, it is the parallelised or not version depending on the object config
- Parameters:
param_to_int (str) – parameter wich we want to integrate like “e”
- Returns:
adds to the diconnary 2 fileds that are “eigval_I”+param to int and “eigvect_I”+param wich are the rigen values and aigen vectors of the strain for each time step
- compute_volume_ratio_anisotropy(tensor_eigval)
This function computes the volume_ratio anisotropy of a tensor field
- Parameters:
tensor_eigval (str) – eigen values field of the tensor we want to calculate
- Returns:
retruns the volume_ratio anisotropy at each step time in the field relative_anisotropy
- diag_tensor_field(field)
This function takes field of symmetric tensor and creats 2 new keys in the dictionnary with the eigen values and the eigen vectors of the the field tensor
- extract_scalar(field)
This function extracts the data that are formed in tensors or vectors into all of the bases components and adds it to the field of the particule
- Parameters:
field (str) – field of tensor or vector that should be extracted
- Retrun:
addts to the particule dictionnary each element with a “_1” or “_11” at the end to telle the user where the value comes from
- extract_vector(field, direction=1)
This function extracts the data that are formed in tensors into all of the bases vectors and adds it to the field of the particule
- Parameters:
field (str) – field of tensor or vector that should be extracted
direction (int) – defines wether we extract line : 0 or if we extract line : 1
- Retrun:
adds to the particule dictionnary each element with a “_1” at the end to telle the user where the value comes from
- find_best_sommet(coord_objectif, start_wedge)
Given the coordinate of a point and the coordinates of a wedge this function finds the nearest node of the mesh to the coordinate given This function is subject to compilation
- Parameters:
coord_objectif (np.array([3])) – coordinate of the traget point
start_wedge (int) – id of the id of the start of the search
- Returns:
returns the id of the best node of the mesh
- Return type:
int
- find_wedge_near_point(coord_objectif: array, start_wedge=None)
This function finds the best wedge for a given point, if the point is inside the wedge what will be returned is the wedge over the point, eles it will return the nerest wedge This funtion may call compiled functions
- Parameters:
coord_objectif (np.array([3])) – cooridnates of the point we want to know the nearest wedge
start_wedge (int of None) – gives a initial idea of where we are in the mesh
- Returns:
the wedge id in which we are the closes are inside, if we are inside or non, the local coodrinates of the given wedge
- Return type:
int, bool, np.array([3])
- flow_path(particule_coord, particule_id=None)
This function cumputs the flow path of an initial particule
- Parameters:
particule_coord (np.arrray([3])) – inital coordinates of the particule
- Returns:
returns a dictionnary with the following fields, “status”: tels what is the status of the particule, “is_inside”: bool if the particule is inside the glacier are touching a wall, “path” : coordiantes of the particule at each step, “velocity” velocity of the particule at each time step, “time_step” : time step of the simulaiton at each step, add all of the additional fields asked when the object was created
- Return type:
dic
- from_save(folder_path)
This methode allows the user to restor previous particule tracking instances that have run previouslly
- Parameters:
path (str) – path to the folder where every_thing is saved, something like /home/savetracking_folder
- int_strain_particule(particule: dict, param_to_int: str)
This function computes the strain tensor in the high deformation context
- Parameters:
particule (dict) – particule dictionnary of which we want to compute the strain
param_to_int (str) – parameter wich we want to integrate like “e”
- Returns:
returns the eigen values of the strain tensor, the eigen vectors of the strain tensor at each time step and the initial start coordinate
- Return type:
np.array, np.array, np.array
- int_strain_rate_over_path_small_displacement(param_to_int: str)
This funciton computes the strain rate with the small displacement approximation which is not correct in many cases
- Parameters:
param_to_int (str) – parameter we want to icompute like “exx”
- Returns:
adds to the particule dic the parameter with a “I” before for integrated like “Iexx”
- is_inside_wedge(point_of_interest, id_wedge)
This methode helps to know weather a point is inside a given wedge, it is an essantial funtion in the particule tracking code
- Parameters:
point_of_interest (int) – point id for which we desiere to know wether it is inside the wedge
id_wedge (int) – id of the wedge for which we whant to know if we are inside or not
- Returns:
return where it is inside or not, a list of the coordinates in the local bases and a score to know how far ethe point is fro mthe given wedge
- Return type:
bool, list(floats), float
- normalise_vector(field)
This function is helpfull to nomalize a filed when we want to plot it where it needs to be nomed to 1
- Parameters:
field (str) – field to normalise
- Returns:
adds to the particule dic the vector field with a “N” before to indicate the normalisation
- roation_matrix(xyz_component: array)
This function computes the rotation matrix that is needed to go from the x axis to the normal of the flow line
- Parameters:
xyz_component (np.array([3,n]) or np.array([3])) – components of the vector we want to to know the orientation
- Retrun:
returns an arrray of roation matricies or simply the rotation matrix depending on the input
- Return type:
np.array([n,3,3]) or np.array([3,3])
- save_tracking(path, name, things_to_save='all', header=None, particule_to_save='all', save_mesh=True, auto_delete=True)
Allows the user to save the data of a particule are all of them and save the usefull parameters of said particule in one convinient folder, make shure that all of the elements of your particules are floats, np.arrays (up to 2 dimentions) or lists
- Parameters:
path (str) – path to the folder where the file should be saved
name (str) – name of the folder where everything will be saved
things_to_save (str ("all") or list of str or None) – what field should be saved for each partticule
header (None or list of str) – additionnal text to put allong the parameter name for more explicit description
particule_to_save (int or str ("all") of None or list) – wich particule is saved
save_mesh (bool) – saves the mesh for easy import
auto_delete (bool) – delets the file if it already exists, if set to False and the file is there it will print an error
- time_int_over_path(param_to_int: str)
This function does time integration over the path for a parameter that is defined allong the flow line
- Parameters:
param_to_int (str) – type of parameter we whant to integrate for example “1” if we have addted a list of 1ones in the particule dic and want to kwon the time
- Returns:
adds to the particule dic the parameter with a “I” before for integrated
- time_inversion()
This function must be called when negative time is used to flip elements in the dictionnary to make shure that for post processing it looks like time was going forward
- class icetrackpy.icetracker.ParticuleTrackerTransient(mesh_list, eps_top=0.0001, u_min=0.01, start_acu_level=0, nb_friends_max=3, ellipse_factor=10, outside_iter=1, ini_iter=100, dt=-0.01, n=1000, compiled=True, params_to_track=[], parallel=True, verbose=True)
Bases:
object
This class is the instance that enables the user to do some particule tracking in the case of a transient simulation
This creats an instance of particule tracker, many parameters are set at the beegining that will be used mater for the particule tracking instance
- Parameters:
mesh_list ([Mesh.object]) – this should be a list of objects mesh created by icetrackpy, it can be just a mesh openned by meshio for example
eps_top (float) – this defines the level at which a particule died, if the projection of the nomalized vector motion on the normal to the surface is higher then eps_top then the particule died, if set high it allows the particule to do some surfing, should be between 0 an 1
u_min (float) – This defines the minimum speed at which a particule can go, if the particule is slower then said speed it will die, the speed is both calculated by taking the norm of the velocity field and also by calculating the real speed between 2 cordiantes
start_acu_level – this is the level at which the particules are allowed to melt under if time goes in the normal direction and fall if time is reversed
nb_friends_max (int) – this defines the number of elements the code will look thru when looking for an wedge arround a point, this size is the small axis of an ellips good values between 2 and 4, smaller is faster but less accurate
ellipse_factor (int) – this defines how our research radius looks like an ellipse, for meshesh where elements can have a really bad shapes it is a good idea to set the value higher, value between 1 and 10 is good higher is slower
outside_iter (int) – this is the number of random iterations added to the normal iteration to find the good value of wedge
ini_iter (int) – number of initial tryins to find the node on the first step time, if the mesh is really non concave this value need to be high arround 100 is a good start
dt (float) – this is the step time of the particule tracker higher is faster but less precise
n (int) – number of maximum iterations of the particule tracker for each mesh thus the total maximum number of iteration is n*len(self.mesh_list)
compiled (bool) – tels the programm if he is able to use compiled code recources
params_to_track (list[str]) – list of strings of the parameters that should be added to the dictionnary during the tracking
parallel (bool) – tels the code if he is allowded to multi process the task
verbose (bool) – tells if time steps are printed or not
- compute_path(points: array)
This functions calculates the tracking of a list of points, it is parallelised and in part compiled
- Parameters:
points (list(np.array([3]))) – list of the starting points for the tracking
- Returns:
returns an object of the class ParticuleTracker that way is can be used as any other tracking instances for further analysis
- Return type:
<ParticuleTracker.object>
- class icetrackpy.icetracker.Plot(cmap='hsv', bgcolor='white', min_val=None, max_val=None, projection_2D=False, canvas_size=(1200, 800), projection_type='steriographic', cwheel_shadding='classic', cwheel_symetry=True, projection_base=array([[1, 0, 0], [0, 1, 0], [0, 0, 1]]), cbar_symmetric=False)
Bases:
object
This methode helps the user to plot the different meshes and particules allong there flow line with the color representing vectors or saclars
This creats the object that will be plotted it, creats the window of the plot, thus a display option needs to be present on the computure for this to work
- Parameters:
cmap (str) – this is the color map wanted for the plotting of the colors =, only available for the color bar not for the vector plot, by default set to “hsv”
bgcolor (str) – color of the backgroud of the plot by default “white”
canvas_size (tuple) – size of the canvas, higer will give better results when saving the figure
min_val (float) – minimum value for the color bar by default set to none and will be calculated during plotting
max_val (float) – maximum value for the color bar by default set to none and will be calculated during plotting
projection_2D (bool) – this tells if we want to project the plot in the xy plane for 2D mapping
projection_type ("steriographic" or "equal_angle" or "equal_area") – allows for all of the different types of projections
cwheel_shadding ("classic" or "none" or "full" or "full_sqrt" or "full_sqrt") – allows for different visual of the color ball and wheel, the sqrt version is to make the dark area easyer to read
cwheel_symetry (bool) – allows to chose if we want a symmetric or not colorwheel
projection_base (np.array) – bases from which the angles are calculated for vector plot, usfull if we want to change the orientation of the cwheel
cbar_symmetric (bool) – tells if we want the color bar to have symmetric values arround 0, usfful when using a diverging colormap
- _download_image(url, output_file)
Download an image from the given URL and save it to a file.
- Parameters:
url – URL of the image to download.
output_file – Path where the image will be saved.
- _on_key_press(event)
This function is internal and is called when a key is pressed, it saves the image when “ctrl+s” is pressed
- Parameters:
event (all) – is usless can be anything
- _on_mouse_click(event)
This function is internal is regulates when a mousse click is pressed, this is for the selection of the line
- Parameters:
event (all) – useless
- _photo_and_close(event)
This function is internal and closes the window
- Parameters:
event (all) – is usless can be anything
- angle_from_vect(vect)
This function calculates the rotations that are needed to to convert a vector to the bases represented by the value Mesh.projection_base
- Parameters:
vect (np.array or lsit) – vector for which we want to know the angles
- Retrun:
returns the angles of the roation in radiants
- Return type:
float,float
- angles_to_color(angles)
This function converts 2 angles and gives the color corresponding on the color wheel chosen
- Parameters:
angles (list or array) – the 2 angles for which we want to know the color
- Returns:
returs an array of the color in the rbg space
- Return type:
np.array
- axis(size=150, border_color=None)
This function plots the axis xyz of the main plot on the bottom let side
- Parameters:
size (int) – size of the view box of the axis
border_color (str) – color of the border of the axis by default set to None
- background_geotiff(dem_crs, image_path)
This function helps the user to plot a geotiff image in the background of the 2 plot of the glacier, the geotiff can be from any sources and in theory in any coordinate system, the image should allways be put in the right place
- Parameters:
dem_crs (str) – this is the coordinate system that is used for the glacier dem (the one used in elmer) for example for argentirere example it is ‘EPSG:27592’
dem_crs – this is the complete path to the geotiff file, the file should be a .tif only
- cball(size=200, border_color=None)
This function plots a color ball at the bottom of the frame that rotates with the motion of the main figure
- Parameters:
size (int) – size of the view box of the colorball
border_color (str) – color of the border of the colorball by default set to None
- cbar(title='', number_of_digits=4)
This function prints the color bar on the right side of the plot
- Parameters:
title (str) – title name for the plot, if not defined it will be the data that is plotted
number_of_digits (int) – number of decimals that we keep on the displayed values
- cquarter(size=150, border_color=None)
This function plots the quarter of a colorwheel at the bottom right of the plot
- Parameters:
size (int) – size of the view box of the colorwheel
border_color (str) – color of the border of the colorwheel by default set to None
- cwheel(size=75, border_color=None)
This function plots the colorwheel at the bottom right of the plot
- Parameters:
size (int) – size of the view box of the colorwheel
border_color (str) – color of the border of the colorwheel by default set to None
- find_min_max(liste_particule_data, plot_field)
This function sets the min and max value of the color bar if the value has not been defined by the user to th value minimum and maximum value of the given field
- Parameters:
liste_particule_data (list(dict)) – list of all the particule dictionnaries
plot_field (str) – name of the filed we want to set the maximum and minimum value to
- line_selection()
This function activates the mousse selection of a flow line, when the scroll wheel button is pressed on a flow line it will change its color and print id of the particule
- mesh(mesh, mesh_color='black', mesh_width=0.1)
This function plots the mesh frame, it only plots the top and the bottom surface of the mesh for better visibility
- Parameters:
mesh (Mesh.object) – Mesh object from icetrackpy
mesh_color (str) – color of the mesh line, by default it is “black”
mesh_width (float) – size of the mesh line by default set to 0.1
- mesh_full(mesh, mesh_color=(1, 1, 1, 0.2), mesh_width=0.1)
This function plots the mesh frame, it only plots the top and the bottom surface of the mesh for better visibility it plot a background of the mesh to mask goegraphic data
- Parameters:
mesh (Mesh.object) – Mesh object from icetrackpy
mesh_color (str) – color of the mesh line, by default it is “black”
mesh_width (float) – size of the mesh line by default set to 0.1
- particule_scalar(liste_particule_data, plot_field, linewidth=10)
This function plot the particule path with the data plotted as the color of the path
- Parameters:
liste_particule_data (list(dict)) – list of all the particule dictionnaries
plot_field (str) – name of the filed we want to plot allong the flow line
linewidth (float) – size of the lien of the particule, set to default to 10
- particule_vector(liste_particule_data, plot_field, linewidth=10)
This function plots the flow line with the data of a vector
- Parameters:
liste_particule_data (list) – list of dictionnary of the particule data to plot
plot_field – field that we want to plot, this should be a vector field
linewidth – size of the line
- Type:
str
- set_camera_range(mesh)
This function sets the range of the camera in function of the mesh so that every point is in frame
- Parameters:
mesh (Mesh.object) – Mesh object from icetrackpy
- show(path='', auto_close=False, save_fig=False, auto_delete=True, key_save=True)
This function finelizes the plot and makes the figure appear for the user
- Parameters:
path (str) – full path to the image and where it needs to be saved and the extension like : “home/img.png”
show (bool) – tells if we want the view to automaticly close once the rendering is done
save_fig (bool) – tells if we want to save the figure or not automaticaly
auto_delete (bool) – this parameter tells if we want to errase the picture that has the same name when we save a new one
- Param:
- surface_scalar(start_points_list: list, triangle_list: list, liste_particule_data: list, plot_field='is_inside', time_step=-1)
This function plots a surface of scalars values on the surface of the mesh and interpolates between each nodes
- Parameters:
start_points_list (list) – list of points that represent a node of the mesh on which we kown the value
triangle_list (list) – list of trizngles that represent the mesh on which we plot everything
liste_particule_data (list) – list of all the particule dictionnaries
plot_field (str) – field that we went to represent
time_step (int) – time moment at wich we want to plot the value on the mesh
- surface_vector(start_points_list, triangle_list, liste_particule_data, plot_field, time_step=-1)
This function plots a surface of vectors values on the surface of the mesh and interpolates between each nodes
- Parameters:
start_points_list (list) – list of points that represent a node of the mesh on which we kown the value
triangle_list (list) – list of trizngles that represent the mesh on which we plot everything
liste_particule_data (list) – list of all the particule dictionnaries
plot_field (str) – field that we went to represent this should be a vector field it should be a normalised vector of dimention 3
time_step (int) – time moment at wich we want to plot the value on the mesh
- icetrackpy.icetracker.pvtu_to_vtu(file_path)
This function converts a pvtu file into a vtu file that can later be read by the library
- Parameters:
file_path (str or list) – it can be a string of the complet path of a single file or a list of files names
- Returns:
save the files with the same names as before but in the vtu format, and it retruns a list of the new files names
- Return type:
list
1.2. Creating a simple example of a glacier
- class icetrackpy.theoretical_glacier.Glacier(vx=1.0, vz=-1.0, mesh_factor=[1, 1, 1], square_size=[50, 10, 10], type='3d')
Bases:
object
This class is able to creat a theoretical glacier where all of the values of tensors fields are mathematically known.
The functions creats an object of Glacier.
- Parameters:
vx (float) – velocity of the particule in the x direction, (m/year)
vz (float) – velocity of the particule in the z direction, (m/year)
mesh_factor (list) – compaction of the mesh in the 3 directions in numbers of nodes for 1 meter, should be a list of size 3 of int types elements bigger or equal to 1. [Default] :code:’[1,1,1]’
square_size (list) – size of the 3D volume where the particules will evolve, should be a list of size 3 of floats, the volume cant be negative or null. [Default] :code:’[50,10,10]’
type (str) – type of glacier that will be used for creating the fields on the mesh, 2 options are available, “compression” or “3d”, the first is juste a single bar in compression and the second one is a more realistic approximation of a glacier
- __dict__ = mappingproxy({'__module__': 'icetrackpy.theoretical_glacier', '__doc__': '\n This class is able to creat a theoretical glacier where all of the values of tensors fields are mathematically known.\n\n ', '__init__': <function Glacier.__init__>, 'v': <function Glacier.v>, 'strain_rate': <function Glacier.strain_rate>, 'phi': <function Glacier.phi>, 'strain': <function Glacier.strain>, 'vtu': <function Glacier.vtu>, 'msh': <function Glacier.msh>, '__dict__': <attribute '__dict__' of 'Glacier' objects>, '__weakref__': <attribute '__weakref__' of 'Glacier' objects>, '__annotations__': {}})
- __init__(vx=1.0, vz=-1.0, mesh_factor=[1, 1, 1], square_size=[50, 10, 10], type='3d')
The functions creats an object of Glacier.
- Parameters:
vx (float) – velocity of the particule in the x direction, (m/year)
vz (float) – velocity of the particule in the z direction, (m/year)
mesh_factor (list) – compaction of the mesh in the 3 directions in numbers of nodes for 1 meter, should be a list of size 3 of int types elements bigger or equal to 1. [Default] :code:’[1,1,1]’
square_size (list) – size of the 3D volume where the particules will evolve, should be a list of size 3 of floats, the volume cant be negative or null. [Default] :code:’[50,10,10]’
type (str) – type of glacier that will be used for creating the fields on the mesh, 2 options are available, “compression” or “3d”, the first is juste a single bar in compression and the second one is a more realistic approximation of a glacier
- __module__ = 'icetrackpy.theoretical_glacier'
- __weakref__
list of weak references to the object (if defined)
- msh(path: str, file_name='mesh')
Creats a .msh file containing the mesh that can be converted as elmer-ice input
- Parameters:
path (str) – path where the file needs to be saved
file_name (str) – name of the vtu file
Note
saves a msh file at the path given and with the given file name
- phi(x0: float, y0: float, z0: float, t: float)
Gives out the position of a particule with an initial position at a given time, this function is defined everywhere even out of the domain
- Parameters:
x0 (float) – initial position of the particule in the x direction
y0 (float) – initial position of the particule in the y direction
z0 (float) – initial position of the particule in the z direction
t (float) – time at which we want to know the particule position can be positive of negative
- Returns:
gives out a tuple of floats of size 3 giving out the 3 coordinates of the position of the particule
- Return type:
tuple
- strain(x0: float, y0: float, z0: float, t: float)
Gives out the strain of a particule with an initial position at a given time, this function is defined everywhere even out of the domain
- Parameters:
x0 (float) – initial position of the particule in the x direction
y0 (float) – initial position of the particule in the y direction
z0 (float) – initial position of the particule in the z direction
t (float) – time at which we want to know the particule strain can be positive of negative
- Returns:
gives out a matrix of size 3 representing the symmetric strain tensor
- Return type:
np.array
- strain_rate(x: float, y: float, z: float)
Gives out the strain rate field at any place in the 3D space, this function is defined everywhere even out of the domain
- Parameters:
x (float) – cordinate in the x axis to evaluate the strain rate field
y (float) – cordinate in the y axis to evaluate the strain rate field
z (float) – cordinate in the z axis to evaluate the strain rate field
- Returns:
gives out a square matrix of size 3 which is the symmetric strain tensor
- Return type:
np.array
- v(x: float, y: float, z: float)
Gives out the velocity field at any place in the 3D space,this function is defined everywhere even out of the domain
- Parameters:
x (float) – cordinate in the x axis to evaluate the velocity field
y (float) – cordinate in the y axis to evaluate the velocity field
z (float) – cordinate in the z axis to evaluate the velocity field
- Returns:
gives out a tuple of floats of length 3 contaning the velocity filed in the x,y,z directions
- Return type:
tuple
- vtu(path: str, file_name='mesh')
Creats a .vtu file containing the mesh and the vlaues of strain rate and velocity at each nodes
- Parameters:
path (str) – path where the file needs to be saved
file_name (str) – name of the vtu file
Note
saves a vtu file at the path given and with the given file name
1.3. Strain calculation from elementray strains
- icetrackpy.diag_matrix_iterative.eig_DM(D: array, M: array)
This functions allows to find a good approximation of the eigne values and eigen vectors of the product D by M where the determinant of D and M or 1 and D is diagonal
- Parameters:
D (np.array) – Diagonal matrix of size 3 and of determiant equal to 1
M (np.array) – Matrix of size 3 by 3 that should be symmetric and of determinant 1
- Returns:
gives out the eigen values and eigen vectors of the product DM
- Return type:
np.array,np.array
- icetrackpy.diag_matrix_iterative.int_strain(strain_list: list)
Calculates the cumulated strain from a list of elementry small strains that should be summed in the incomrpessible case
- Parameters:
strain_list (list) – list of strain tensor (represented by 3 by 3 arrays) idealy they are incompressible strain rates tensor multiplied by a small step time
- Returns:
returns a list of eigen values and an orthogonal matrix, when taking the product PDP^T we get the cumulated strain
- Return type:
np.array,np.array