--- a +++ b/doc/ocframe/manual.tex @@ -0,0 +1,293 @@ +\documentclass[a4paper]{article} +\usepackage{graphicx} + +\title{Ocframe Manual \\ {\large Structural Analysis functions of the Mechanics package}} +\author{Johan Beke} + +\begin{document} + +\maketitle + +\tableofcontents +% for F in *.m; do octave -q --eval "get_help_text_from_file(\"$F\")"; done > output.texi +% for F in *.m; do octave -q --eval "disp(get_help_text_from_file(\"$F\"))"; done > ref.texi ; makeinfo --plaintext ref.texi > ref.txt + +\section{Introduction} + \begin{sloppypar} + The structural analysis functions of the \emph{Mechanics} packages where written during a FEM course. The following posibilities are in the package: + \begin{itemize} + \item The analysis of 2D frames with rigid connections with the function {\emph{SolveFrame}}. + The solutions for the reaction forces, displacements and member end forces are given. + \item Solution of multiple load cases at once with the function \emph{SolveFrameCases} + \item A plot of the frame, with nodal displacements if needed, with the function \emph{PlotFrame}. The nodes and members are numbered. + \item Calculation the member internal forces for each member with the function \emph{MSNForces} + \item Plot of the internal member forces diagram with the function \emph{PlotDiagrams} + \end{itemize} + \end{sloppypar} +\section{Conventions} + \subsection{Units} + \begin{sloppypar} + The user can use any units as long as they are consistent. So if the forces are provided + in kN, kN/m and kNm, the geometry and member properties must be in similar units (m, m$^2$, m$^4$ and kN/m$^2$). + \end{sloppypar} + \subsection{Global and local axis} + \begin{sloppypar} + For the nodes and the members, care must be taken for the axes. + The following images show the used coordinate systems (figure \ref{fig:axis.png}) + and the conventions for the member forces (figure \ref{fig:dist.png} and \ref{fig:point.png}). + The local axes are always from the near node to the far node. + \end{sloppypar} + \begin{figure}[h] + \includegraphics[width=0.50\linewidth]{axes.png} + \caption{Local and global axis convention} + \label{fig:axis.png} + \end{figure} + \begin{figure}[tb] + \includegraphics[width=0.50\linewidth]{dist.png} + \caption{Conventions for a distributed load on a member} + \label{fig:dist.png} + \end{figure} + \begin{figure}[tb] + \includegraphics[width=0.50\linewidth]{point.png} + \caption{Conventions for a point load on a member} + \label{fig:point.png} + \end{figure} + \begin{figure}[tb] + \includegraphics[width=0.50\linewidth]{sign_conv.png} + \caption{Sign conventions for internal forces} + \label{fig:sign_conv.png} + \end{figure} + +\newpage +\section{Example} + \begin{sloppypar} + An example will clarify the usage of the different functions. + \end{sloppypar} + \subsection{Forces and geometry} + + \begin{figure}[h] + \includegraphics[width=0.75\linewidth]{example5_7.png} + \caption{Example frame} + \label{fig:example_frame} + \end{figure} + + \begin{sloppypar} + An example frame, which was taken from the book Matrix Structural + Analysis, is shown in figure \ref{fig:example_frame}. + The following code snippet is used to enter the geometry: + \end{sloppypar} + + \begin{verbatim} +joints=[0,0,1,1,1; + 7.416,3,0,0,0; + 8+7.416,3,1,1,1]; +# first cells of each row are the x and y coordinates +# next cells are the x, y and z constraints. +# node 1 and 3 are fully fixed, node 2 is free + +# member data +E = 210.0e3; # N/mm^2 = MPa +A = 6000;# mm^2 +I = 200.0e6;# mm^4 + +# convert units to kN and m +E = E*10^3; +A = A*(10^-3)^2; +I = I*(10^-3)^4, + +#connectivity data +members=[1,2,E,I,A; + 2,3,E,I,A]; + \end{verbatim} + + \subsection{Loads} + \begin{sloppypar} + The following code snippet is used to enter the loads: + \end{sloppypar} + \begin{verbatim} + # point load on node 2 + # Fx = 18.75 kN + # Fy = -46.35 kN + # Mz = 0 kNm + nodeloads=[2, 18.75,-46.35, 0.0]; + + loc = 1; + glob = 0; + + # distributed load on member 2 + # Fx = 0 kN/m + # Fy = -4 kN/m + # same for the end of the load + # a = b = 0 m load on full span + # local load + dist=[2,0,-4.0,0,-4.0,0.0,0.0,loc]; + #no point loads on members + point=[]; + \end{verbatim} + + \subsection{Solutions} + \begin{sloppypar} + The following code snippet is used to find the basic solution: + \end{sloppypar} + \begin{verbatim} + [P,D,MemF]=SolveFrame(joints,members,nodeloads,dist,point); + \end{verbatim} + \begin{sloppypar} + The basic solution are the reactions, the displacements and the member end forces: + \end{sloppypar} + \begin{verbatim} + P = + + 130.497 55.677 13.374 + NaN NaN NaN + -149.247 22.673 -45.356 + + D = + + 0.0000000 0.0000000 0.0000000 + 0.0009476 -0.0047441 -0.0005088 + 0.0000000 0.0000000 0.0000000 + + MemF = + + 141.8530 2.6758 13.3742 -141.8530 -2.6758 8.0315 + 149.2473 9.3266 -8.0315 -149.2473 22.6734 -45.3557 + \end{verbatim} + \begin{sloppypar} + Each row of the reaction matrix (matrix P in this case) corresponds to the node. (First row to first node, etc.). + The columns are R$_x$, R$_y$ and M$_z$. For node 1 the reactions are thus: R$_x$ = 130.497 kN, R$_y$ = 55.677 kN and M$_z$ = 13.374 kNm. + In case of a free component without reactions, the value is represented by NaN.\\ + The same convention holds for the displacement matrix (matrix D in this case). For node 2 the displacements are thus: + x = 0.0009476 m, y = -0.0047441 m and rotation = -0.0005088 rad.\\ + A similar principle holds for the member-end-forces. Each row corresponds to the element. The columns are: F$_x$, F$_y$, M$_z$, F$_x$, F$_y$ and M$_z$ where + the first three components are for the first node and the last three components are for the last node. + + \end{sloppypar} + +\newpage +\section{Function reference} + \begin{verbatim} + -- Function File: [X, M, S, N] = MSNForces (JOINTS, MEMBERS, DIST, + POINT, MEMF, MEMBERNUM, DIVISIONS) + This function returns the internal forces of a member for each + position x. The member is divided in 20 subelements if the + argument is not given. The used sign convention is displayed in + the help file. + + Input parameters are similar as with SolveFrame and PlotFrame with + extra arguments: + + membernum = Number of the member to calculate divisions = + Number of divisions for the member + + + -- Function File: ocframe_ex1 () + Example of a planar frame. + + + -- Function File: ocframe_ex2 () + Example of a beam. + + + -- Function File: ocframe_ex3 () + Example of a planar frame. + + + -- Function File: ocframe_exLC () + Example of a beam with generation of eurocode ULS load cases + + + -- Function File: ocframe_railwaybridge () + Example taken from a real railwaybridge. + + + -- Function File: ocframe_tests () + Various tests for the entire package. Test 1, 2 & 3 are simple + beams (tested for reactions and internal forces) Test 4 & 5 are + frames (tested for reactions) + + -- Function File: PlotDiagrams (JOINTS, MEMBERS, DIST, POINT, MEMF, + DIAGRAM, DIVISIONS, SCALE) + This function plots the internal forces for all members. The force + to be plotted can be selected with DIAGRAM which will be "M", "S" + or "N" for the moment, shear or normal forces. + + Input parameters are similar as with SolveFrame and PlotFrame. + + -- Function File: PlotFrame (JOINTS, MEMBERS, D, FACTOR) + Plots a 2D frame (with displacements if needed) using the + following input parameters: + + joints = [x , y, constraints ; ...] + + constraints=[x , y, rotation] free=0, supported=1 + + members = [nodeN, nodeF, E, I, A; ...] + + Optional arguments: + + D = [x,y,rotation;...] Displacements as returned by SolveFrame + + factor= Scaling factor for the discplacements (default: 10) + + + -- Function File: [RESULTS] = SolveFrameCases (JOINTS, MEMBERS, + LOADCASES) + Solves a 2D frame with the matrix displacement method for the + following input parameters: + + joints = [x , y, constraints ; ...] + + constraints=[x , y, rotation] free=0, supported=1 + + members = [nodeN, nodeF, E, I, A; ...] + + loadcases is a struct array with for each loadcase the fields + + - nodeloads = [node, Fx, Fy, Mz; ...] + + - dist = [membernum,FxN,FyN,FxF,FyF,a,b,local ; ...] + + - point = [membernum,Fx,Fy,a,local; ...] + + input is as for the function SolveFrame. + + Output is a struct array with the fields: Displacements, Reactions + and MemF + + (output formated as for the function SolveFrame.) + + -- Function File: [REACTIONS, DISPLACEMENTS, MEMF] = SolveFrame + (JOINTS, MEMBERS, NODELOADS, DIST, POINT) + Solves a 2D frame with the matrix displacement method for the + following input parameters: + + joints = [x , y, constraints ; ...] + + constraints=[x , y, rotation] free=0, supported=1 + + members = [nodeN, nodeF, E, I, A; ...] + + nodeloads = [node, Fx, Fy, Mz; ...] + + loads on members: + + dist = [membernum,FxN,FyN,FxF,FyF,a,b,local ; ...] for distributed + loads where FxN and FyN are the loads on distance a from the + near node (same with far node and distance b) local=1 if + loads are on local axis, 0 if global + + point = [membernum,Fx,Fy,a,local; ...] where Fx and Fy are + the loads on distance a from the node near local=1 if loads + are on local axis, 0 if global + + Output is formated as follows (rownumber corresponds to node + or member number): + + Reactions = [Fx,Fy,Mz;...] where NaN if it was a non supported dof + + Displacements = [x,y,rotation;...] + + MemF = [FxN, FyN, MzN, FxF, FyF, MzF; ...] + \end{verbatim} +\end{document}