00001 #include <SimpleMesh.h>
00002
00003 Square:: Square(GiNaC::ex x0_, GiNaC::ex xn_, int nx_, int ny_) {
00004 x0 = x0_;
00005 xn = xn_;
00006 nx = nx_;
00007 ny = ny_;
00008 }
00009
00010 int Square::no_of_triangles() {
00011 return 2*(nx-1)*(ny-1);
00012 }
00013
00014 int Square:: no_of_boundary_nodes() {
00015 return 2*nx + 2*(ny-2);
00016 }
00017
00018 GiNaC::ex Square:: boundary_node( int i) {
00019 if (i>= 0 && i <= nx-1 ) {
00020 GiNaC::ex dx = (xn.op(0) - x0.op(0))/(nx-1);
00021 return GiNaC::lst(x0.op(0) + (i-1)*dx, x0.op(1));
00022 } else if (i >= nx && i <= nx+ny-2) {
00023 GiNaC::ex dy = (xn.op(1) - x0.op(1))/(ny-1);
00024 return GiNaC::lst(xn.op(0), x0.op(1) + (i-nx)*dy);
00025 } else if (i >= nx+ny-1 && i <= 2*nx+ny-3) {
00026 GiNaC::ex dx = (xn.op(0) - x0.op(0))/(nx-1);
00027 return GiNaC::lst(xn.op(0) - dx*(i-nx-ny+1) , xn.op(1));
00028 } else if (i >= 2*nx+ny-2&& i <= no_of_boundary_nodes() ) {
00029 GiNaC::ex dy = (xn.op(1) - x0.op(1))/(ny-1);
00030 return GiNaC::lst(x0.op(0), xn.op(1) - (i-2*nx-ny+2)*dy);
00031 }
00032 return DUMMY;
00033 }
00034
00035 Triangle Square::triangle(int i) {
00036 GiNaC::ex dx = (xn.op(0) - x0.op(0))/(nx-1);
00037 GiNaC::ex dy = (xn.op(1) - x0.op(1))/(ny-1);
00038
00039 int box = (i-1)/2+1;
00040
00041 GiNaC::ex p0,p1,p2,p3;
00042 p0 = GiNaC::lst(0,0,0);
00043 p0 = GiNaC::lst(x0.op(0) + ((box-1)%(nx-1))*dx, x0.op(1) + ((box-1)/(ny-1))*dy);
00044 p1 = GiNaC::lst(x0.op(0) + (((box-1)%(nx-1))+1)*dx, x0.op(1) + ((box-1)/(ny-1))*dy);
00045 p2 = GiNaC::lst(x0.op(0) + ((box-1)%(nx-1))*dx, x0.op(1) + (((box-1)/(ny-1))+1)*dy);
00046 p3 = GiNaC::lst(x0.op(0) + (((box-1)%(nx-1))+1)*dx, x0.op(1) + (((box-1)/(ny-1))+1)*dy);
00047
00048 if (i%2 == 1) {
00049 return Triangle(p0,p1,p2);
00050 } else if ( i%2 == 0) {
00051 return Triangle(p3,p1,p2);
00052 }
00053 return Triangle(DUMMY,DUMMY,DUMMY);
00054 }
00055
00056