test/fem-springs.cpp

00001 #include <iostream>
00002 #include <fstream>
00003 #include <cmath>
00004 
00005 /* TYPE AND FUNCTION DEFINITIONS */
00006 struct Vertex;
00007 struct Element;
00008 void doCompute();
00009 
00010 struct Vertex {
00011    Vertex(int    _id,
00012           double _xy[2],
00013          double _m) {
00014       id = _id;
00015       xy[0] = _xy[0]; xy[1] = _xy[1];
00016       u0[0] = 0.0; u0[1] = 0.0;
00017       u1[0] = 0.0; u1[1] = 0.0;
00018       f[0] = 0.0; f[1] = 0.0;
00019       m = _m; }
00020    
00021    int id;
00022    double xy[2];
00023    double u0[2];
00024    double u1[2];
00025    double f[2];
00026    double m;
00027 };
00028 
00029 struct Element {
00030    int id;
00031    Vertex*  vertices[2];
00032    Element* adjacents[3];
00033 };
00034 
00035 /* GLOBAL VARIABLES */
00036 double dt = 0.0001;
00037 double t = 0.0;
00038 double end_time = 0.5;
00039 double k = 1000.0;
00040 double d = 5.0;
00041 Vertex va(0, (double[]){0,0}, 0.1);
00042 Vertex vb(1, (double[]){0,-5}, 0.1);
00043 
00044 int main() {
00045    // Initialise file to write to
00046    std::ofstream outfile;
00047    outfile.open("fem-springs-output.txt");
00048    
00049    // Set initial conditions
00050    vb.u0[0] = 0.0;
00051    vb.u0[1] = -1.0;
00052    vb.u1[0] = 0.0;
00053    vb.u1[1] = -1.0;
00054    
00055    std::cout.setf(std::ios::fixed,std::ios::floatfield);
00056    std::cout.precision(8);
00057    outfile.setf(std::ios::fixed,std::ios::floatfield);
00058    outfile.precision(8);
00059    
00060    std::cout << "T\t\tX\t\tY" << std::endl;
00061    outfile   << "T\t\tX\t\tY" << std::endl;
00062    while(t < end_time) {
00063       doCompute();
00064       std::cout << t << "\t" << vb.xy[0] + vb.u1[0] << "\t" << vb.xy[1] + vb.u1[1] << std::endl;
00065       outfile   << t << "\t" << vb.xy[0] + vb.u1[0] << "\t" << vb.xy[1] + vb.u1[1] << std::endl;
00066       t+=dt;
00067    }
00068    
00069    // Close output file
00070    outfile.close();
00071    
00072    return 0;
00073 }
00074 
00075 void doCompute() {
00076    // Compute forces
00077    double A[2], a[2], b[2];
00078    for(int i=0; i<2; i++) {
00079       A[i] = vb.xy[i] - va.xy[i];
00080       a[i] = A[i] + vb.u1[i] - va.u1[i];
00081       b[i] = A[i] + vb.u0[i] - va.u0[i];
00082    }
00083    
00084    double modA = sqrt((A[0] * A[0]) + (A[1] * A[1]));
00085    double moda = sqrt((a[0] * a[0]) + (a[1] * a[1]));
00086    double modb = sqrt((b[0] * b[0]) + (b[1] * b[1]));
00087    
00088    for(int i=0; i<2; i++) {
00089       vb.f[i] = (k * (a[i] - (a[i]*(modA/moda)))) + (d * ((a[i] - (a[i]*(modb/moda)))/dt));
00090    }
00091    
00092    // Compute displacements
00093    double u2[2];
00094    for(int i=0; i<2; i++) {
00095       u2[i] = (((vb.m*(2*vb.u1[i]-vb.u0[i]))/(dt*dt))-vb.f[i])*((dt*dt)/vb.m);
00096    }
00097    
00098    // Update displacements arrays
00099    for(int i=0; i<2; i++) {
00100       vb.u0[i] = vb.u1[i];
00101       vb.u1[i] = u2[i];
00102    }
00103 }

Generated on Tue May 29 17:13:49 2007 for DAPTA by  doxygen 1.5.1