Major reorganization and cleaning--separated FEM-specific
[charm.git] / examples / fem / crack2D / crack.h
1 /**
2  * Main header file for crack propagation code.
3  */
4 #include <string>
5 #include <stdlib.h>
6 #include <math.h>
7 #include "fem.h"
8
9 //Coord describes a property with X and Y components
10 struct Coord
11 {
12   double x;
13   double y;
14 };
15
16 // Declaration for class VolElement (Volumetric Elements) 
17 // These are 6-vertex triangles (each side has an extra vertex)
18 struct Vol
19 {
20   int material; //VolMaterial type
21   int conn[6]; // 6 nodes around this element
22   double s11l[3], s22l[3], s12l[3];//Stress coefficients
23 };
24
25
26 // Declaration for class CohElement (Cohesive Elements) 
27 //  These are 6-vertex rectangles (long sides have an extra vertex)
28 struct Coh
29 {
30   int material; //CohMaterial type
31   int conn[6]; // 6 nodes around this element
32   Coord T[3];//Tractions at each sample point
33   double sidel[3];//[0]->length of element; 
34                 //[1],[2] give cosine and sine of orientation
35   double Sthresh[3];//The threshold, and damage for this edge
36 };
37
38 // Declaration for class Material
39 struct Material
40 {
41   double c[4], ci[4];          // Elastic stiffness constants & inverses
42 };
43
44 struct VolMaterial : public Material
45 {
46   double e1, e2;               // Young's moduli 
47   double g12, g23;             // Shear moduli 
48   double xnu12, xnu23;         // Poisson's ratios 
49   double rho;                  // density 
50   double alpha1, alpha2;       // thermal expansion coefficients 
51   double theta;                // principal material direction 
52 };
53
54 struct CohMaterial : public Material
55 {
56   double deltan;           // normal characteristic length
57   double deltat;           // tangent characteristic length
58   double sigmax;           // max. normal stress
59   double taumax;           // max. shearing stress
60   double mu;               // coefficient of friction
61   double Sinit;            // initial Sthreshold
62 };
63   
64 struct Node
65 {
66   Coord Rin;   //Internal force, from volumetric elements
67   Coord Rco;   //Cohesive traction load, from cohesive elements
68   Coord xM;    //Mass at this node (xM.x==xM.y)
69   Coord vel;
70   Coord accel;
71   Coord disp;  //Distance this node has moved
72   Coord pos;   //Undeformed position of this node
73   //FIXME: boundary conditions should be stored in a separate array
74   Coord r; //Boundary condition vector
75   unsigned char isbnd; //Flag: is this a boundary node?
76   unsigned char id1, id2; //Boundary condition flags
77 };
78
79 //Global constants
80 const double   g1          = -0.774596669241483;
81 const double   g3          = 0.774596669241483;
82 const double   w1          = 0.555555555555555;
83 const double   w2          = 0.888888888888888;
84 const double   w3          = 0.555555555555555;
85 const double   pi          = 3.14159265358979;
86
87 /// Contains data read from the configuration file that
88 /// never changes during the run.
89 struct ConfigurationData {
90   /// Simulation control
91   int nTime;               //total number of time steps
92   int tsintFull;          //output interval in time steps
93   int tsintEnergy;        //partial output interval
94   int restart;
95   
96   /// Timestep control
97   int steps;               //ratio of delta and Courant cond
98   double delta;            //timestep
99   double delta2;           //delta squared times 2????
100   int numProp;             //number of proportionality constants
101   int *ts_proportion;      //time step to apply proportionality constant at
102   double *proportion;      //boundary load proportionality constant
103
104   /// Material formulation
105   int lin;                 //elastic formulation, 0=nl, 1=linear
106   int ncoh;                //type of cohesive law, 0=exp., 1=linear
107   int nplane;              //type of plane analysis, 0=stress, 1=strain
108   
109   /// Material properties
110   int numMatVol;           //number of volumetric materials (numat_vol)
111   int numMatCoh;           //number of cohesive materials (numat_coh)
112   VolMaterial *volm;  // Properties of volumetric materials
113   CohMaterial *cohm;  // Properties of cohesive materials
114   
115   /// "Impact": special boundary condition on just one node
116   int imp;                //Is there impact?
117   double voImp;         //Velocity of impactor
118   double dImp;             //Displacement
119   double aImp;             //Acceleration
120   double vImp;             //Velocity
121   double xnuImp,eImp,eTop,radiusImp;   //Impact parameters
122   double indent;           //indentation of impactor
123   double fImp;             //contact force
124   double massImp;          //mass
125 };
126
127 extern ConfigurationData config;
128 void readConfig(const char *configFile,const char *meshFile);
129
130 /// This structure describes the nodes and elements of a mesh:
131 struct MeshData {
132   int nn;               //number of nodal points (numnp)
133   int ne;              //number of LST elements (numlst)
134   int nc;             //number of LST cohesive elements (numclst)
135   int numBound;            //number of boundary nodes w/loads
136   int nImp;            //node hit by impactor
137
138   Node *nodes;
139   Vol *vols;
140   Coh *cohs;
141 };
142
143 //Serial mesh routines: in mesh.C
144 void readMesh(MeshData *mesh,const char *meshFile);
145 void setupMesh(MeshData *mesh); //Initialize newly-read mesh
146 void deleteMesh(MeshData *mesh); //Free storage allocated in mesh
147
148 //Parallel mesh routines: in fem_mesh.C
149 void sendMesh(MeshData *mesh,int fem_mesh);
150 void recvMesh(MeshData *mesh,int fem_mesh);
151 extern "C" void pupMesh(pup_er p,MeshData *mesh); //For migration
152
153
154 //Node physics: in node.C
155 struct NodeSlope {
156   int kk; //Index into config.ts_proportion array
157   double prop; //Proportion of boundary conditions to apply
158   double slope; //Slope of prop
159 };
160 void nodeSetup(NodeSlope *sl);
161 void nodeBeginStep(MeshData *mesh);
162 void nodeFinishStep(MeshData *mesh, NodeSlope *sl,int tstep);
163
164 //Element physics: in lst_NL.C, lst_coh2.C
165 extern void lst_NL(MeshData *mesh);
166 extern void lst_coh2(MeshData *mesh);
167
168
169 void crack_abort(const char *why);