Warning, /education/step/stepcore/Mainpage.dox is written in an unsupported language. File is not indexed.

0001 /*
0002    SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 namespace StepCore {
0008 
0009 /** @mainpage StepCore
0010 
0011 \section overview Overview
0012 
0013 StepCore is a physical simulation library. StepCore focuses on accurate
0014 simulations with error estimations but still tries to be lightweight and fast.
0015 Currently StepCore can simulate two-dimensional classical mechanics. 
0016 
0017 StepCore provides collection of physical bodies and forces which can be
0018 used in simulations and collections of exchangeable solvers with various
0019 integration algorithms. It can be easily extended with new bodies, forces
0020 and solvers.
0021 
0022 \section license License
0023 StepCore is distributed under the terms of the
0024 <a href="http://www.gnu.org/licenses/gpl.html">GNU General Public License (GPL), Version 2</a>.
0025 
0026 \section features Features
0027 
0028 - Object oriented, easy to use
0029 - Accurate simulations, local error estimations
0030 - Reflections for all objects and properties
0031 - Factory for reflections and object creation
0032 - \ref xmlfile "XML file save and load" (requires Qt4)
0033 - \ref bodies "Bodies:"
0034  - Particle
0035  - ChargedParticle
0036 - \ref forces "Forces:"
0037  - GravitationForce
0038  - WeightForce
0039  - CoulombForce
0040  - Spring
0041 - \ref solvers "Solvers:"
0042  - EulerSolver with error estimations
0043  - GslSolver - all solvers from GSL library (requires GSL library)
0044 
0045 \section design Design
0046 Please refer to \ref design_intro "Introduction to StepCore design" for more
0047 information about StepCore design.
0048 
0049 \section download Download
0050 
0051 You can checkout the development tree of StepCore from git, by doing:
0052 <pre>git clone git://anongit.kde.org/step.git</pre>
0053 or view it online at this address:
0054 <a href="https://invent.kde.org/education/step">https://invent.kde.org/education/step</a>
0055 
0056 \section authors Authors
0057 
0058 <b>Original Author:</b> Vladimir Kuznetsov (ks dot vladimir at gmail dot com)
0059 
0060 */
0061 
0062 //////////////////////////////////////////////////////////////////////////////
0063 //////////////////////////////////////////////////////////////////////////////
0064 //////////////////////////////////////////////////////////////////////////////
0065 
0066 /** \page design_intro Introduction to StepCore Design
0067 
0068 Main classes in the StepCore are World, Item (Body and Force) and Solver.
0069 
0070 Item is the root of the physical bodies and forces hierarchy. Body is an
0071 interface for bodies (anything that has dynamic variables that require
0072 ODE integration) and Force is an interface for forces (anything that acts
0073 upon bodies changing derivatives of dynamic variables). One Item can be
0074 a Body and a Force at the same time: for example massive spring or fluid.
0075 
0076 World distinguishes between Body and Force using MetaObject::inherits().
0077 This is also used by Force to distinguish between Body types.
0078 
0079 Solver is an interface for generic ODE solvers. It is quite general so it
0080 can be used not only by World but also by Body or Force that may require
0081 it (massive springs ?), and it allows to implement variety of
0082 integration algorithms.
0083 
0084 World encapsulates multiple Items and one Solver. It also provides
0085 World::doEvolve() function which control integration.
0086 
0087 Integration algorithm (World::doEvolve()) is like the following:
0088 -# Gather all dynamic variables from all Bodies in one array
0089 -# Call Solver::doEvolve() function which will call World::solverFunction()
0090    as callback when Solver needs to calculate variable derivatives (Solver may
0091    call the callback several times during one step with different variable
0092    adjustments - it depends on integration algorithm)
0093 -# World::solverFunction() function does:
0094  -# scatters variables to Bodies and updates World::time
0095  -# calls Force::calcForce() for all forces
0096  -# gathers variable derivatives from all Bodies
0097 -# World::doEvolve() scatters variables to all Bodies and updates World::time
0098 
0099 Currently I'm thinking how to avoid variables copying but preserve generic
0100 solvers. One of the ideas it to store variables in array permanently and
0101 only its indexes in bodies, as a side effect this will allow saving world
0102 state at several moments simultaneously.
0103 
0104 Latter one more Item interface will be added: Restriction. It will
0105 manage all movement restrictions - anchors, collisions, etc. Restrictions
0106 will be calculated after Forces and will compute force adjustments. More
0107 details are still to be decided.
0108 
0109 StepCore still depends on Qt (it uses QString, QVariant and QXml), this
0110 dependency will be removed in the future.
0111 
0112 Vector is a template for generic fixed-length vector with some common
0113 methods on it. This is quite simple, if StepCore will require more I will
0114 look at Eigen library.
0115 
0116 */
0117 
0118 } // namespace StepCore
0119