00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef ForceBeamColumn3d_h
00026 #define ForceBeamColumn3d_h
00027
00028 #include <Element.h>
00029 #include <Node.h>
00030 #include <Matrix.h>
00031 #include <Vector.h>
00032 #include <Channel.h>
00033 #include <BeamIntegration.h>
00034 #include <SectionForceDeformation.h>
00035 #include <CrdTransf3d.h>
00036
00037 class Response;
00038 class ElementalLoad;
00039
00040 class ForceBeamColumn3d: public Element
00041 {
00042 public:
00043 ForceBeamColumn3d();
00044 ForceBeamColumn3d(int tag, int nodeI, int nodeJ,
00045 int numSections, SectionForceDeformation **sec,
00046 BeamIntegration &beamIntegr,
00047 CrdTransf3d &coordTransf, double rho = 0.0,
00048 int maxNumIters = 10, double tolerance = 1.0e-12);
00049
00050 ~ForceBeamColumn3d();
00051 const char *getClassType(void) const {return "ForceBeamColumn3d";};
00052
00053 int getNumExternalNodes(void) const;
00054 const ID &getExternalNodes(void);
00055 Node **getNodePtrs(void);
00056
00057 int getNumDOF(void);
00058
00059 void setDomain(Domain *theDomain);
00060 int commitState(void);
00061 int revertToLastCommit(void);
00062 int revertToStart(void);
00063 int update(void);
00064
00065 const Matrix &getTangentStiff(void);
00066 const Matrix &getInitialStiff(void);
00067 const Matrix &getMass(void);
00068
00069 void zeroLoad(void);
00070 int addLoad(ElementalLoad *theLoad, double loadFactor);
00071 int addInertiaLoadToUnbalance(const Vector &accel);
00072
00073 const Vector &getResistingForce(void);
00074 const Vector &getResistingForceIncInertia(void);
00075
00076 int sendSelf(int cTag, Channel &theChannel);
00077 int recvSelf(int cTag, Channel &theChannel, FEM_ObjectBroker &theBroker);
00078 int displaySelf(Renderer &theViewer, int displayMode, float fact);
00079
00080 friend OPS_Stream &operator<<(OPS_Stream &s, ForceBeamColumn3d &E);
00081 void Print(OPS_Stream &s, int flag =0);
00082
00083 Response *setResponse(const char **argv, int argc, Information &eleInformation, OPS_Stream &s);
00084 int getResponse(int responseID, Information &eleInformation);
00085
00086 int setParameter(const char **argv, int argc, Parameter ¶m);
00087 int updateParameter(int parameterID, Information &info);
00088
00089 protected:
00090 void setSectionPointers(int numSections, SectionForceDeformation **secPtrs);
00091 int getInitialFlexibility(Matrix &fe);
00092
00093 private:
00094 void getForceInterpolatMatrix(double xi, Matrix &b, const ID &code);
00095 void getDistrLoadInterpolatMatrix(double xi, Matrix &bp, const ID &code);
00096 void compSectionDisplacements(Vector sectionCoords[], Vector sectionDispls[]) const;
00097 void initializeSectionHistoryVariables (void);
00098
00099
00100 ID connectedExternalNodes;
00101
00102 BeamIntegration *beamIntegr;
00103 int numSections;
00104 SectionForceDeformation **sections;
00105 CrdTransf3d *crdTransf;
00106
00107 double rho;
00108 int maxIters;
00109 double tol;
00110
00111 int initialFlag;
00112
00113 Node *theNodes[2];
00114
00115 Matrix kv;
00116 Vector Se;
00117
00118 Matrix kvcommit;
00119 Vector Secommit;
00120
00121 Matrix *fs;
00122 Vector *vs;
00123 Vector *Ssr;
00124
00125 Vector *vscommit;
00126
00127 Matrix *sp;
00128 double p0[5];
00129 double v0[5];
00130
00131 Matrix *Ki;
00132
00133 bool isTorsion;
00134
00135 static Matrix theMatrix;
00136 static Vector theVector;
00137 static double workArea[];
00138
00139 enum {maxNumSections = 10};
00140
00141
00142 int maxSubdivisions;
00143
00144 static Vector *vsSubdivide;
00145 static Vector *SsrSubdivide;
00146 static Matrix *fsSubdivide;
00147
00148 };
00149
00150 #endif