00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _ELM_H
00023 #define _ELM_H
00024
00025 #include "node.h"
00026 #include "load.h"
00027
00028
00029
00030
00031 typedef struct _rezone
00032 {
00033 char label[13];
00034 int id;
00035 int numelm;
00036 int *elm;
00037 } sRezone;
00038
00039
00040
00041
00042 typedef struct _tensor
00043 {
00044 double xx, xy, xz;
00045 double yy, yz;
00046 double zz;
00047 double rf;
00048 } sTensor;
00049
00050
00051
00052
00053 typedef struct _ptensor
00054 {
00055 double dir1, cos1x, cos1y, cos1z;
00056 double dir2, cos2x, cos2y, cos2z;
00057 double dir3, cos3x, cos3y, cos3z;
00058 } sPTensor;
00059
00060
00061
00062
00063 typedef struct _derivrst
00064 {
00065 double r;
00066 double s;
00067 double t;
00068 } sDerivRST;
00069
00070
00071
00072
00073 typedef struct _order
00074 {
00075 int r;
00076 int s;
00077 int t;
00078 } sOrder;
00079
00080
00081
00082
00083 typedef enum _elmtype
00084 {
00085 T3,
00086 Q4,
00087 BRICK8,
00088 TETR4,
00089 INFINITE,
00090 INTERFACE,
00091 LINE2,
00092 DKT,
00093 NumElmTypes
00094 } eElmType;
00095
00096
00097
00098
00099 typedef struct _element
00100 {
00101 eElmType type;
00102 eStatus rezone;
00103 eDisplay display;
00104 int curve;
00105 int label;
00106 sNode *nodes;
00107 void *data;
00108 } sElement;
00109
00110
00111
00112
00113 typedef struct _elmclass
00114 {
00115 void (*init)(void);
00116 void (*new)(int, int, int, int, sElement **, sElement **, sNode *);
00117 void (*free)(sElement *);
00118 void (*read)(sElement *);
00119 int (*readinitstr)(sElement *);
00120 void (*readprofile)(sElement *);
00121 void (*mass)(sElement *, double *);
00122 double (*rigidcoeff)(sElement *);
00123 void (*load)(sElement *, eLoadType, int, int, int, int, int *, double *,
00124 double *, double *, double *, double *, double *, double *, double *, double *, double *, double *, double *);
00125 void (*connect)(sElement *, int *);
00126 void (*setconnect)(sElement *, int *);
00127 void (*updateconnect)(sElement *);
00128 void (*numnodes)(sElement *, int *);
00129 void (*gravity)(sElement *, double *, double *, double *);
00130 void (*assvector)(sElement *, double *, double *);
00131 void (*strstrain)(sElement *, double, double *, double *, sTensor *, sTensor *);
00132 void (*timestep)(sElement *, double *);
00133 void (*intforce)(sElement *, sTensor *, double *);
00134 void (*writestr)(sElement *, FILE *, double *, double *);
00135 void (*writendlresult)(sElement *, FILE *, FILE *);
00136 void (*writegauresult)(sElement *, FILE *, FILE *);
00137 void (*writegauvecresult)(sElement *, int, FILE *, FILE *);
00138 void (*updatestress)(sElement *, double, double *, sTensor *);
00139 void (*percforce)(sElement *, double *);
00140 void (*setpressure)(sElement *, double);
00141 void (*setinitstress)(sElement *, sTensor *);
00142 void (*viscoforce)(sElement *, double, sTensor *, double *);
00143 void (*jacobian)(sElement *, double [3][3], double [3][3]);
00144 void (*volume)(sElement *, double *);
00145 void (*KMatrix)(sElement *, double [24][24]);
00146 void (*GetDof)(sElement *, int [24], int *);
00147 void (*GetInc)(sElement *, int [8], int *);
00148 } sElmClass;
00149
00150
00151
00152 extern sOrder *IntOrder;
00153
00154
00155
00156 extern double *Thickness;
00157
00158
00159
00160 extern sElmClass ElmClass[NumElmTypes];
00161
00162
00163
00164 extern sElement **ElmList;
00165
00166
00167
00168 extern int NumElements;
00169 extern int NumIntOrder;
00170 extern int NumThickness;
00171
00172
00173
00174 extern int NumRezones;
00175 extern sRezone *Rezone;
00176
00177
00178
00179
00180
00181
00182
00183 #define ElmInit(type) \
00184 if(ElmClass[type].init != 0L) \
00185 (*ElmClass[type].init)( )
00186
00187 #define ElmNew(type,label,matid,itord,tckid,elm,list,n) \
00188 if(ElmClass[type].new != 0L) \
00189 (*ElmClass[type].new)( label, matid, itord, tckid, elm, list, n )
00190
00191 #define ElmFree(elm) \
00192 if(ElmClass[elm->type].free != 0L) \
00193 (*ElmClass[elm->type].free)( elm )
00194
00195 #define ElmRead(elm) \
00196 if(ElmClass[elm->type].read != 0L ) \
00197 (*ElmClass[elm->type].read)( elm )
00198
00199 #define ElmReadInitStress(elm) \
00200 (( ElmClass[elm->type].readinitstr != 0L ) ? \
00201 (*ElmClass[elm->type].readinitstr)( elm ) : \
00202 0 )
00203
00204 #define ElmReadProfile(elm) \
00205 if( ElmClass[elm->type].readprofile != 0L ) \
00206 (*ElmClass[elm->type].readprofile)( elm )
00207
00208
00209 #define ElmMass(elm,mm) \
00210 if(ElmClass[elm->type].mass != 0L) \
00211 (*ElmClass[elm->type].mass)( elm, mm )
00212
00213 #define ElmRigidCoeff(elm) \
00214 (*ElmClass[elm->type].rigidcoeff)( elm )
00215
00216 #define ElmLoad(elm,type,key,noi,noj,nok,nol,q1x,q1y,q1z,q2x,q2y,q2z,q3x,q3y,q3z,q4x,q4y,q4z) \
00217 if(ElmClass[elm->type].load != 0L ) \
00218 (*ElmClass[elm->type].load)( elm, type, key, noi, noj, nok, nol, \
00219 q1x, q1y, q1z, q2x, q2y, q2z, q3x, q3y, q3z, q4x, q4y, q4z )
00220
00221 #define ElmConnect(elm,conn) \
00222 if(ElmClass[elm->type].connect != 0L ) \
00223 (*ElmClass[elm->type].connect)( elm, conn )
00224
00225 #define ElmSetConnect(elm,conn) \
00226 if(ElmClass[elm->type].setconnect != 0L ) \
00227 (*ElmClass[elm->type].setconnect)( elm, conn )
00228
00229 #define ElmUpdateConnect(elm) \
00230 if(ElmClass[elm->type].updateconnect != 0L ) \
00231 (*ElmClass[elm->type].updateconnect)( elm )
00232
00233 #define ElmNumNodes(elm,num) \
00234 if(ElmClass[elm->type].numnodes != 0L ) \
00235 (*ElmClass[elm->type].numnodes)( elm, num )
00236
00237 #define ElmGravity(elm,qx,qy,qz) \
00238 if(ElmClass[elm->type].gravity != 0L ) \
00239 (*ElmClass[elm->type].gravity)( elm, qx, qy, qz )
00240
00241 #define ElmAssVector(elm,gm,em) \
00242 if(ElmClass[elm->type].assvector != 0L ) \
00243 (*ElmClass[elm->type].assvector)( elm, gm, em )
00244
00245 #define ElmStressStrain(elm,dt,u,y,stre,stra) \
00246 if(ElmClass[elm->type].strstrain != 0L ) \
00247 (*ElmClass[elm->type].strstrain)( elm, dt, u, y, stre, stra )
00248
00249 #define ElmTimeStep(elm,dt) \
00250 if(ElmClass[elm->type].timestep != 0L ) \
00251 (*ElmClass[elm->type].timestep)( elm, dt )
00252
00253 #define ElmInterForce(elm,gv,ev) \
00254 if(ElmClass[elm->type].intforce != 0L ) \
00255 (*ElmClass[elm->type].intforce)( elm, gv, ev )
00256
00257 #define ElmWriteStress(elm,f,u,v) \
00258 if(ElmClass[elm->type].writestr != 0L ) \
00259 (*ElmClass[elm->type].writestr)( elm, f, u, v )
00260
00261 #define ElmWriteNodalResults(elm,f,t) \
00262 if(ElmClass[elm->type].writendlresult != 0L ) \
00263 (*ElmClass[elm->type].writendlresult)( elm, f, t )
00264
00265 #define ElmWriteGaussResults(elm,f,t) \
00266 if(ElmClass[elm->type].writegauresult != 0L ) \
00267 (*ElmClass[elm->type].writegauresult)( elm, f, t )
00268
00269 #define ElmWriteGaussVectorResults(elm,v,f,t) \
00270 if(ElmClass[elm->type].writegauvecresult != 0L ) \
00271 (*ElmClass[elm->type].writegauvecresult)( elm, v, f, t )
00272
00273 #define ElmUpdateStress(elm,dt,v,str) \
00274 if(ElmClass[elm->type].updatestress != 0L ) \
00275 (*ElmClass[elm->type].updatestress)( elm, dt, v, str )
00276
00277 #define ElmPercForce(elm,pf) \
00278 if(ElmClass[elm->type].percforce != 0L ) \
00279 (*ElmClass[elm->type].percforce)( elm, pf )
00280
00281 #define ElmSetPressure(elm,pot) \
00282 if(ElmClass[elm->type].setpressure != 0L ) \
00283 (*ElmClass[elm->type].setpressure)( elm, pot )
00284
00285 #define ElmSetInitStress(elm,str) \
00286 if(ElmClass[elm->type].setinitstress != 0L ) \
00287 (*ElmClass[elm->type].setinitstress)( elm, str )
00288
00289 #define ElmViscoForce(elm,ts,gv,ev) \
00290 if(ElmClass[elm->type].viscoforce != 0L ) \
00291 (*ElmClass[elm->type].viscoforce)( elm, ts, gv, ev )
00292
00293 #define ElmJacobian(elm,j,i) \
00294 if(ElmClass[elm->type].jacobian != 0L) \
00295 (*ElmClass[elm->type].jacobian)(elm,j,i)
00296
00297 #define ElmVolume(elm,v) \
00298 if(ElmClass[elm->type].volume != 0L) \
00299 (*ElmClass[elm->type].volume)(elm,v)
00300
00301 #define ElmKMatrix(elm,k) \
00302 if(ElmClass[elm->type].KMatrix != 0L) \
00303 (*ElmClass[elm->type].KMatrix)(elm,k)
00304
00305 #define ElmGetDof(elm,u,index) \
00306 if(ElmClass[elm->type].GetDof != 0L) \
00307 (*ElmClass[elm->type].GetDof)(elm,u,index)
00308
00309 #define ElmGetInc(elm,inc,index) \
00310 if(ElmClass[elm->type].GetInc != 0L) \
00311 (*ElmClass[elm->type].GetInc)(elm,inc,index)
00312
00313
00314
00315 void ElementInit ( void );
00316 void ElementFree ( void );
00317 void ElementBuildAdjacence( void );
00318 void PrincipalTensordInitStress ( sTensor *, sPTensor * );
00319 void PrincipalTensor ( sTensor *tensor, sPTensor *ptensor );
00320 void ElementOffPlaneStress( double, sTensor * );
00321 void ElementInitTensor ( sTensor * );
00322
00323 #endif
00324