00001 #include <iostream>
00002 #include <fstream>
00003 #include <cmath>
00004
00005
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
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
00046 std::ofstream outfile;
00047 outfile.open("fem-springs-output.txt");
00048
00049
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
00070 outfile.close();
00071
00072 return 0;
00073 }
00074
00075 void doCompute() {
00076
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
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
00099 for(int i=0; i<2; i++) {
00100 vb.u0[i] = vb.u1[i];
00101 vb.u1[i] = u2[i];
00102 }
00103 }