%File: ~/OOP/analysis/integrator/LoadPath.tex
%What: "@(#) LoadPath.tex, revA"

\noindent {\bf Files}   \\
\indent \#include $<\tilde{ }$/analysis/integrator/LoadPath.h$>$  \\

\noindent {\bf Class Declaration}  \\
\indent class LoadPath: public StaticIntegrator  \\

\noindent {\bf Class Hierarchy} \\
\indent MovableObject \\
\indent\indent Integrator \\
\indent\indent\indent IncrementalIntegrator \\
\indent\indent\indent\indent StaticIntegrator \\
\indent\indent\indent\indent\indent {\bf LoadPath} \\

\noindent {\bf Description} \\ 
\indent LoadPath is a subclass of StaticIntegrator, it is
used to when performing a static analysis on the FE\_Model using a
user specified load path. The load path is specified in a Vector, {\em
path}, to the objects constructor and at each step in the analysis:

\[ 
\lambda_n^{(i)} - \lambda_{n-1} = path(n) - path(n-1)
\]

Knowing $\lambda_n^{(i)} = path(n)$ prior to each iteration, the $N+1$
unknowns in equation~\ref{staticFormTaylor}, is reduced to $N$ unknowns and
results in the following equation:

\begin{equation} 
\R(\U_{n}) = \lambda_n^{(i)} \P 
 - \f_{R}\left(\U_{n}^{(i)} \right) - 
\K_n^{(i)} 
(\U_{n} - \U_{n}^{(i)})  
\label{staticFormLoadPath}
\end{equation} 

\noindent {\bf Class Interface} \\
\indent // Constructors \\
\indent {\em LoadPath(Vector \&loadPath);}\\ 
\indent {\em LoadPath();}\\ \\
\indent // Destructor \\
\indent {\em $\tilde{ }$LoadPath();}\\  \\
\indent // Public Methods \\
\indent {\em int newStep(void);} \\
\indent {\em int update(const Vector \&$\Delta U$);} \\ \\
\indent // Public Methods for Output\\
\indent {\em int sendSelf(int commitTag, Channel \&theChannel);}\\ 
\indent {\em int recvSelf(int commitTag, Channel \&theChannel,
FEM\_ObjectBroker \&theBroker);}\\ 
\indent {\em int Print(OPS_Stream \&s, int flag = 0);}\\

\noindent {\bf Constructors} \\
\indent {\em LoadPath(Vector \&loadPath);}\\ 
The integer INTEGRATOR\_TAGS\_LoadPath (defined in
$<$classTags.h$>$) is passed to the StaticIntegrator classes
constructor. A vector object {\em path} is created which is a copy of
{\em loadPath} and an index into this vector is set to $0$.\\

\indent {\em LoadPath();}\\ 
The integer INTEGRATOR\_TAGS\_LoadPath (defined in $<$classTags.h$>$) is
passed to the StaticIntegrator classes constructor. No vector object
is created. Provided for the FEM\_ObjectBroker to create a blank
object, {\em recvSelf()} should be invoked on this object. \\

\noindent {\bf Destructor} \\
\indent {\em $\tilde{ }$LoadPath();}\\ 
Invokes the destructor on the vector {\em path}. \\

\noindent {\bf Public Methods}\\
\indent {\em int newStep(void);} \\
The object obtains the current value of $\lambda$ from the {\em path}
vector using the current index. The index is then incremented by
$1$. If the index is greater than the size of {\em path}, $\lambda$ is
set to $0$ and an error message is printed. It will then invoke
{\em applyLoadDomain(0.0, $\lambda$)} on the AnalysisModel
object. Returns $0$ if successful. A warning message is printed and a
$-1$ is returned if no AnalysisModel is associated with the object. \\

{\em int update(const Vector \&$\Delta U$);} \\
Invoked this causes the object to first increment the DOF\_Group
displacements with $\Delta U$, by invoking {\em incrDisp($\Delta U)$}
on the AnalysisModel, and then to update the domain, by invoking {\em
updateDomain()} on the AnalysisModel. Returns $0$ if successful, a
warning message and a $-1$ is returned if no AnalysisModel is
associated with the object. \\


{\em int sendSelf(int commitTag, Channel \&theChannel); } \\ 
Places the size if {\em path} and the index in an ID of size 2 and send this
ID. Then sends the Vector {\em path}. Returns $0$ if successful, a
warning message is printed and a $-1$ is returned if {\em theChannel}
fails to send the ID or the Vector. \\ 

{\em int recvSelf(int commitTag, Channel \&theChannel, 
FEM\_ObjectBroker \&theBroker); } \\ 
Receives in a ID of size 2 the size of the vector and current index.
Creates a new Vector and receives the Vector from the Channel. 
Returns $0$ if successful, a warning message is printed and a $-1$ is
returned if {\em theChannel} fails to receive the Vector or the ID.\\

{\em int Print(OPS_Stream \&s, int flag = 0);}\\
The object sends to $s$ its type, the current value of $\lambda$.
