.. _vectorfields: .. role:: raw-html(raw) :format: html *************** Vector Fields *************** Vector fields in 3D can be constructed using four surface object methods based on the coordinates of the surface object. These methods provide: * Face normals * Vectors at a position, ( *u, v, w* ) * Surface displacements, :raw-html:`(δx, δy, δy)` * Surface to surface positional differences, :raw-html:`(δx, δy, δy)` The methods return a vector field object of type Vector3DCollection. All methods have the named parameter: ======================= ======================= ======================= named parameter type default value ======================= ======================= ======================= scale numeric 1 width numeric surface *linewidth* alr numeric 0.25 color Matplotlib color 'black' ======================= ======================= ======================= The *scale* argument is a multiplier for the length. The *width* argument controls the line thickness with the default being the surface linewidth named argument of the constructor (same as the edge linewidths). The *alr* argument is the ratio of the arrowhead length to arrow length. Since the Vector3DCollection is derived from the Line3Dcollection, the *vectorfield* object is added to a 3D axis in the identical way a surface is added to the *axis*, e.g.:: axis.add_collection3D(vectorfield) In the following discussion, the named parameters in the method description are omitted for clarity to highlight the main controlling arguments. The *surface* method returns a vector field object labeled *vf*. Face Normals ================================================================================================ The method is:: vf = surface.facenormals() The length of the vectors are proportional to the average size of the triangular faces. As the surface *rez* increases, the length decreases. The length of the vector can also be set by assigning the 'scale' method argument. The vectors are centered at each triangular face, normal to the face, as illustrated below. .. image:: images/vector_norm.png :class: sphx-glr-single-img An example of this vector field is given in :ref:`facenormals`. Vectors at a Coordinate ================================================================================================ The method is:: vf = surface.vectorfield_from_op( op, returnxyz=False ) The *op* argument is a function which takes a 3N array argument in the native coordinate system. The function returns the 3N array for the vector in u,v,w coordinates, aligned using the native coordinates at each coordinate, as shown below for the cylindrical and spherical coordinates. .. image:: images/vector_uvw.png :class: sphx-glr-single-img The uvw axis are aligned with the axis for the planar coordinate system. For the polar coordinates, the uvw axis are similar to the cylindrical coordinates. If the *returnxyz* argument is *True*, uvw are in planar coordinates. The vectors are located at each surface vertex, as illustrated in the figure below. .. image:: images/vector_field.png :class: sphx-glr-single-img An example of this vector field is given in :ref:`tube_disp2`. Surface to Surface ================================================================================================ The method is:: vf = surface.vectorfield_to_surface( surf ) The *surf* argument is a surface object which is the same type and rez as the calling *surface* object. The vector at each vertex of the *surface* object points to the corresponding vertex in the *surf* argument object, as shown below. .. image:: images/vector_surface.png :class: sphx-glr-single-img Surface Displacements ================================================================================================ The method is:: vf = surface.dispfield_from_op( op, returnxyz=False, ussbase=False ) The *op* argument is a function which takes a 3N array argument in the native coordinate system. The function returns the 3N array for the vector in native coordinates. If the *returnxyz* argument is *True*, uvw are in xyz coordinates. .. image:: images/vector_disp.png :class: sphx-glr-single-img This method is similar to the geometric mapping using a function as:: surface.map_geom_from_op( op ) This difference is that instead of transforming the surface shape using the map function, vectors indicate how each surface vertex will be mapped for the function without modifying the surface geometry. This is illustrated above using the blue edges for the 'mapped' surface. This function is equivalent to the *vectorfield_to_surface* method if a transition surface is created as:: import copy ''' code here ''' surf = copy.copy(surface) surf.map_geom_from_op( op ) vf = surface.vectorfield_to_surface( surf )