00001 #ifndef INELASTICYS2DGNL_H
00002 #define INELASTICYS2DGNL_H
00003
00004 #include <UpdatedLagrangianBeam2D.h>
00005 #include <YieldSurface_BC.h>
00006 #include <Vector.h>
00007
00008 #define DISPLAY_YS 2745
00009
00015 class InelasticYS2DGNL : public UpdatedLagrangianBeam2D
00016 {
00017 public:
00018 InelasticYS2DGNL(int tag,
00019 int Nd1, int Nd2,
00020 YieldSurface_BC *ysEnd1, YieldSurface_BC *ysEnd2,
00021 int rf_algo = -1,
00022 bool islinear = false, double rho = 0.0);
00023
00024 ~InelasticYS2DGNL();
00025
00026 virtual const Vector &getResistingForce(void);
00027 virtual const Matrix &getTangentStiff(void);
00028 virtual int commitState(void);
00029 virtual int update(void);
00030 virtual int displaySelf(Renderer &theViewer, int displayMode, float fact);
00031 void Print(OPS_Stream &s, int flag =0);
00032 int sendSelf(int commitTag, Channel &theChannel);
00033 int recvSelf(int commitTag, Channel &theChannel, FEM_ObjectBroker &theBroker);
00034
00035
00036 void createView(char *title, double scale, int x, int y, int cx, int cy, char displaytype = 'l');
00037
00038 virtual Response *setResponse(const char **argv, int argc,
00039 Information &eleInformation);
00040 virtual int getResponse(int responseID, Information &eleInformation);
00041
00042 protected:
00043 virtual void getLocalStiff(Matrix &K) = 0;
00044 virtual void getLocalMass(Matrix &M);
00045
00046 protected:
00047 int computeTrueEleForce(Vector &trial_force);
00048 void checkSpecialCases(void);
00049
00050 private:
00051 void forceBalance(Vector &force, int algo);
00052 void plastifyOneEnd(int end, YieldSurface_BC *ys, Vector &trial_force,
00053 Vector &incrDisp, Matrix &K, Vector &total_force, int algo);
00054
00055 void splitStep(int end_shoot, YieldSurface_BC *ys_shoots, YieldSurface_BC *ys_drifts,
00056 Vector &trial_force, Matrix &K, Vector &total_force);
00057
00058 void driftOneEnd(YieldSurface_BC *ys, Vector &trial_force, Vector &surface_force,
00059 Matrix &K, Vector &total_force);
00060
00061 void driftBothEnds(Vector &trial_force, Vector &surface_force,
00062 Matrix &K, Vector &total_force);
00063
00064 void plastifyBothEnds(Vector &trial_force, Vector &incrDisp,
00065 Matrix &K, Vector &total_force);
00066 void checkEndStatus(bool &end1drifts, bool &end2drifts, Vector &trialForce);
00067 int plasticPredictor(Vector &trialForce);
00068 int elasticCorrector(Vector &trialForce, int algo);
00069
00070 protected:
00071 static Vector elasticForce;
00072 static Vector F1, F2, Fs;
00073
00074
00075 YieldSurface_BC *ys1, *ys2;
00076 char displayType;
00077 Renderer *pView;
00078 ColorMap *theMap;
00079
00080 bool end1Plastify, end2Plastify;
00081 bool end1Plastify_hist, end2Plastify_hist;
00082
00083 Matrix end1G, end2G;
00084 Matrix Stiff;
00085 int forceRecoveryAlgo, forceRecoveryAlgo_orig;
00086 bool end1Damage, end2Damage;
00087 bool split_step;
00088
00089 int debug, fdebug, pdebug, ydebug, statusDebug;
00090 bool init;
00091 bool updateKt;
00092
00093
00094
00095 const static int INSIDE, OUTSIDE, WITHIN;
00096
00097 static double storage;
00098 };
00099
00100 #endif