Differences

This shows you the differences between two versions of the page.

en:ivutils [2012/11/24 03:29]
deinega [Geometry objects]
en:ivutils [2014/05/11 18:58] (current)
deinega
Line 1: Line 1:
 +======Basic utilities library ivutils======
  
 +is free C++ library for numerical applications development. ivutils was used in EMTL (electromagnetic modeling) and [[https://sites.physics.utoronto.ca/sajeevjohn/software/transport|Microvolt]] (semiconductor device modeling)
 +
 +To use ivutils you need to download it and compile with your code: {{:ivutils.zip}}
 +
 +ivutils include:
 +
 +^ files \\ h hpp cpp ^    description    ^  
 +| vector_3 \\ basis_3 | n-dimensional vectors and linear transformations |
 +| vector_set | packers for vector sequences |
 +| contour | contours |
 +| plane_3\\ region_2\\ region_3 | 2D and 3D geometrical objects |
 +| gnudump | plotting of geometrical objects in gnuplot and VTK |
 +| | |
 +| grid | uniform and uniform meshes to store and interpolate data |
 +| linsolv | interface to solve system of linear equations using LAPACK and PARDISO |
 +| | |
 +| refobj\\ pencil | smart pointers to manage dynamic memory |
 +| math_utils | useful math functions |
 +| utiltl | useful iterators, modifiers etc.|
 +| seqpack | data packers |
 +| logger| interface for collecting process variables identified by their symbolic names |
 +| | |
 +| logexc | interface to process exceptions and output messages |
 +| loggerio\\ detector| interface to record data in binary or text files |
 +| component | configuration settings \\ timers to measure  computer time used by chosen classes or functions \\ components to develop numerical applications |
 +| | |
 +| string_utils | useful functions to work with strings |
 +| alg_parser | parsers of algebraic expressions |
 +| read_ini | parsers of simple ini-files |
 +| | |
 +| ifmpi \\ implmpi | interface to work with MPI |
 +| | |
 +| qsub.py | Script to run jobs at any supercomputer |
 +| Makefile.arch \\ Makefile.target | Multi-Architectural Makefile |
 +
 +
 +Below we give some examples how to use ivutils.
 +
 +=====Geometry objects=====
 +
 +Here we show how to construct some geometry objects.
 +
 +Vector is constructed by class Vector_3 initialized by x, y and z coordinates in constructor. 
 +You can add and subtract vectors, multiply vector by number, calculate scalar product (using operator *) and cross product (using operator %) of two vectors.
 +For example,
 +
 +<code cpp>
 +  Vector_3 v1(1,0,0),v2(0,1,0);
 +  Vector_3 v0=a%b-Vector_3(0,0,1); // v0 is Vector_3(0,0,0)
 +</code>
 +
 +If you put less then 3 coordinates in constructor, then values for not specified coordinates well be equal to last specified ones. 
 +For example, Vector_3(1) is equal toVector_3(1,1,1). 
 +Also Vector_3() is equal to Vector_3(0,0,0) since first coordinate is zero by default.
 +
 +Vectors for integer coordinates are constructed by class iVector_3.
 +  
 +All geometry classes are derived from the class Region_3.
 +Class Region_3 (as well as its derived classes) has the following functionality:
 +  *it can test, if some chosen point is inside or outside
 +  *it can find the point on the region surface closest to the given one
 +  *it can find intersection with some line 
 +  *it can find intersection with planar contours
 +
 +Below we present examples of functions which can be used to create some common regions.
 +
 +<code cpp>
 +  Region_3 *GetHalfSpace(const Vector_3 &n, const Vector_3 &pos);
 +</code>
 +returns half-space, n is normal to the boundary plane, pos is chosen position at this plane. For example,
 +
 +<code cpp>
 +  Region_3 *reg = GetHalfSpace(Vector_3(0,0,1), Vector_3(0,0,0));
 +</code>
 +returns half-space corresponding to positive side of z-axis.
 +
 +<code cpp>
 +  Region_3 *GetPlate(const Vector_3 &n, const Vector_3 &pos, vec_type width);
 +</code>  
 +returns infinite plate (space between to parallel planes), n is normal to the planes, pos is position at some plane, width is distance between this plane and other plane.
 +
 +<code cpp>
 +Region_3 *getBox(const &Vector_3 a, const &Vector_3 b);
 +</code>
 +returns parallelepiped with edges parallel to coordinate axes. a and b are opposite vertexes.
 +
 +<code cpp>
 +Region_3 *GetSphere(vec_type R, const &Vector_3 center);
 +</code>
 +returns sphere of a chosen radius R and center position.
 +
 +<code cpp>
 +Region_3 *GetCylinder(const Vector_3 &origin, Vector_3 n, vec_type R, valtype h);
 +</code>
 +returns cylinder, origin is point at cylinder axis, n is axis direction, R is radius, h is cylinder height (if h=0 than cylinder is infinite).
 +
 +<code cpp>
 +Region *GetCone(const Vector_3 &origin, Vector_3 n, vec_type R, vec_type h);
 +</code>
 +returns cone, all parameters have the same meaning as for GetCylinder.
 +
 +There are also classes for polyhedron, prism, pyramid, etc.
 +Objects can be rotated, stretched and narrowed, you can take their intersection and sum. 
 +Sophisticated objects with curved surface can be specified by polyhedra with sufficient number of sides. 
 +See detailed reference in region.h
 +/**
 +Parallelepiped with edges parallel to coordinate axes is constructed by class Box.
 +Constructor arguments are opposite vertexes coordinates.
 +
 +<code cpp>
 +  Box b(Vector_3(),Vector_3(1)); // unity box b
 +</code>
 +
 +Sphere is specified by radius and center position.
 +
 +<code cpp>
 +  Sphere s(1,Vector_3()); // sphere s of radius 1 and center in coordinate center
 +</code>
 +
 +There are classes for polyhedron, cylinder, pyramids, cone. 
 +Objects can be rotated, stretched and narrowed, you can take their intersection and sum (detailed reference is [[en/documentation|here]]). 
 +Smooth object can be interpolated by polyhedron with sufficient number of sides.
 +*/
 +======Script to run jobs at any supercomputer======
 +
 +Usually to run a job on some supercomputer you need: 
 +
 +  *make some job script where you specify executable file name, processors number, execution time, etc.,
 +  *submit this job script to a queue.
 +
 +Different supercomputers use different syntax for writing and submitting job scripts.
 +It could be annoying to create job scripts and run them manually.
 +
 +To avoid this problem we made python script {{:qsub.py}}.
 +This script allows you to submit jobs to a queue at arbitrary supercomputer without specifying which supercomputer you are using at the moment.
 +This is especially useful if you run your jobs at different supercomputers.
 +To find which supercomputer you are using at the moment, our scripts use unix comand 'hostname'.
 +
 +To use our script you should put instructions how to make job scripts and submit them on your supercomputer in function make_script.
 +This is already done for some supercomputers: SciNet (Canada), supercomputers of Kurchatov Institute, JSCC RAS, MSU, IHED RAS (Russia)
 +
 +After this you can use function qsub with following parameters:
 +
 +  qsub(workdir,worksubdir,prog,args,time,np,ppn=0,task='',fname='',act=1,skip='')
 +
 +This function creates directory workdir/worksubdir, copies executable file prog there, makes a job script SCRIPT.sh to run this executable file with arguments args at np processors for some time (in seconds).
 +
 +Optional parameters of qsub:
 +
 +ppn - number of processors used per each node (default value ppn=0 means that all processors at the node can be used)
 +
 +task - job name (it will be displayed in submitted job list)
 +
 +fname - file name or list of file names which should be copied to workdir/worksubdir
 +
 +act - 1 (to submit a job script to the queue) or 0 (not do it)
 +
 +skip - some name. if file with this name will be found in the worksubdir, executable will not be copied there and job will not be submitted.
 +
 +For example, you have executable file 'a.out' in the current directory '.'.
 +Copy script 'qsub.py' there and make file 'script.py':
 +
 +  #! /usr/bin/python
 +  from qsub import *
 +  qsub('.','test','a.out','',60*60,8)
 +
 +Make file 'script.py' executable
 +
 +  chmod u+x script.py
 +
 +and run it
 +
 +  ./script.py
 +
 +As a result, subdirectory 'test' will be created in the current directory and executable file 'a.out' will be copied there.
 +You will find in this subdirectory job script SCRIPT.sh to run 'a.out' at 8 processors for one hour, and file QSUB.sh to submit SCRIPT.sh.
 +
 +Usually, you have different home directories (where you compile your projects) and work directories (where you run executable files and store the results of calculation) at different supercomputers. 
 +
 +You can specify these directories for each supercomputer and user name in function getdirs (to find which supercomputer and user name you are using at the moment, unix command 'hostname' and 'whoami' are used).
 +Then you can use function qsub_appl, where these directories will be used automatically.
 +
 +  qsub_appl(workdir,worksubdir,prog,args,time,np,ppn=0,task='',fname='',act=1,skip='')
 +
 +Parameters of this function have the same meaning as for function qsub.
 +The only difference between qsub_appl and qsub is that qsub_appl creates workdir/worksubdir in your work directory, and looks for files prog and fname in your home directory.
 
    Back to top