Problem konzole

Greda učvršćena na jednom kraju, a na drugom postoji primjena sile prema dolje. Problem je pronaći optimalnu geometriju koja minimizira deformaciju pod zadanom silom. Račun derivacije funkcionala elastične podložnosti (compliance)
\[ \int_\Omega A\,\varepsilon(u) : \varepsilon(u)\,\mathrm{d}x \]
možete pronaći na poveznici.

load "iovtk"

ofstream data("data.txt");

real E=15;				// Youngov modul
real nu=0.35;			// Poisson koeficijent
func g1=0;
func g2=-0.5*(y-0.4)*(0.6-y);
//////////////////////////////////////////
// Računanje Lameovih koeficijenta 
//////////////////////////////////////////
real lambda=E*nu/((1.+nu)*(1.-2.*nu));
real mu=E/(2.*(1.+nu));
real lagr=3.8*1e-6;

func truncate=(( (abs(x)<0.002 ) || (abs(x-4)<0.005 && abs(y-0.5)<0.2 )  )? 0:1);
//////////////////////////////////////////
// Mesh
//////////////////////////////////////////

border shapeDirichlet(t=0,1){ x=0; y=1-t; label=1; }
border shapeDown(t=0,4){ x=t; y=0.1*t; label=3; }
border shapeNeumann(t=0.4,0.6){ x=4; y=t; label=2; }
border shapeUp(t=0,4){ x=4-t; y=0.6+0.1*t; label=3; }

border hole01(t=0,2*pi){ x=0.5+0.1*cos(t); y=0.5+0.1*sin(t); label=3;}
border hole02(t=0,2*pi){ x=1+0.1*cos(t); y=0.5+0.1*sin(t); label=3;}
border hole03(t=0,2*pi){ x=1.5+0.1*cos(t); y=0.5+0.1*sin(t); label=3;}
border hole04(t=0,2*pi){ x=0.75+0.1*cos(t); y=0.7+0.1*sin(t); label=3;}
border hole05(t=0,2*pi){ x=0.75+0.1*cos(t); y=0.3+0.1*sin(t); label=3;}
border hole06(t=0,2*pi){ x=1.25+0.1*cos(t); y=0.65+0.1*sin(t); label=3;}
border hole07(t=0,2*pi){ x=1.25+0.1*cos(t); y=0.35+0.1*sin(t); label=3;}
border hole08(t=0,2*pi){ x=2.0+0.1*cos(t); y=0.5+0.1*sin(t); label=3;}
border hole09(t=0,2*pi){ x=1.75+0.1*cos(t); y=0.62+0.1*sin(t); label=3;}
border hole10(t=0,2*pi){ x=1.75+0.1*cos(t); y=0.38+0.1*sin(t); label=3;}
border hole11(t=0,2*pi){ x=2.5+0.1*cos(t); y=0.5+0.1*sin(t); label=3;}
border hole12(t=0,2*pi){ x=2.25+0.1*cos(t); y=0.60+0.05*sin(t); label=3;}
border hole13(t=0,2*pi){ x=2.25+0.1*cos(t); y=0.40+0.05*sin(t); label=3;}
border hole14(t=0,2*pi){ x=0.25+0.1*cos(t); y=0.7+0.05*sin(t); label=3;}
border hole15(t=0,2*pi){ x=0.25+0.1*cos(t); y=0.3+0.05*sin(t); label=3;}



int nn=5;
mesh Omega=buildmesh(shapeDirichlet(nn)+shapeDown(4*nn)+shapeNeumann(nn/2)+shapeUp(4*nn)
				+hole01(-3*nn)+hole02(-3*nn)+hole03(-3*nn)+hole04(-3*nn)+hole05(-3*nn)
				+hole06(-3*nn)+hole07(-3*nn)+hole08(-3*nn)+hole09(-3*nn)+hole10(-3*nn)
				+hole11(-3*nn)+hole12(-3*nn)+hole13(-3*nn)+hole14(-3*nn)+hole15(-3*nn)
				); 
real sizeMesh=0.03;
Omega = adaptmesh (Omega,sizeMesh,IsMetric=1,nbvx=100000);



//////////////////////////////////////////
// Elastični sustav 
//////////////////////////////////////////
// Ae(u):e(v)=2mu(e(u):e(v))+lambda(div(u)*div(v))
fespace Vh(Omega,P1);

Vh ux,uy,vx,vy;

problem elasticity([ux,uy],[vx,vy]) =
    int2d(Omega)( 2*mu*( dx(ux)*dx(vx)+dy(uy)*dy(vy)+((dx(uy)+dy(ux))*(dx(vy)+dy(vx)))/2.)
              +lambda*(dx(ux)+dy(uy))*(dx(vx)+dy(vy)) )
    -int1d(Omega,2)(g1*vx+g2*vy)	           
    +on(1, ux=0.0, uy=0.0);

//////////////////////////////////////////
// Konstrukcija vektora silaska 
//////////////////////////////////////////
Vh theta1,theta2;

problem shapeDerivative([theta1,theta2],[vx,vy])=
	int2d(Omega)(sizeMesh*(dx(theta1)*dx(vx)+dy(theta1)*dy(vx)+dx(theta2)*dx(vy)+dy(theta2)*dy(vy))+theta1*vx+theta2*vy)
	+int2d(Omega)(4*mu*(2*(dx(uy)/2 + dy(ux)/2)*((dx(uy)*dx(vx))/2 + (dx(ux)*dy(vx))/2 + (dx(vy)*dy(uy))/2 
					+ (dy(ux)*dy(vy))/2) + dx(ux)*(dx(ux)*dx(vx) + dx(vy)*dy(ux)) + dy(uy)*(dx(uy)*dy(vx) + dy(uy)*dy(vy))) 
				+ 2*lambda*(dx(ux) + dy(uy))*(dx(ux)*dx(vx) + dx(uy)*dy(vx) + dx(vy)*dy(ux) + dy(uy)*dy(vy))
				-(dx(vx)+dy(vy))*(2*mu*( dx(ux)*dx(ux)+dy(uy)*dy(uy)+((dx(uy)+dy(ux))*(dx(uy)+dy(ux)))/2.)
						+lambda*(dx(ux)+dy(uy))*(dx(ux)+dy(uy)))
				)
	+int1d(Omega,3) (lagr*(vx*N.x+vy*N.y))
	+on(1,2,theta1=0.0,theta2=0.0);

//////////////////////////////////////////
// Iteracije 
//////////////////////////////////////////

int MaxIter=650;

real vol0=Omega.measure;
real vol;
for (int i=0; i<MaxIter; ++i)
{
	elasticity;
	shapeDerivative;

	vol=Omega.measure;
	//lagr=lagr*(1+0.05*(vol-vol0)/vol0); // držimo konstantni
	real J=int2d(Omega)( 2*mu*( dx(ux)*dx(ux)+dy(uy)*dy(uy)+((dx(uy)+dy(ux))*(dx(uy)+dy(ux)))/2.)
              +lambda*(dx(ux)+dy(uy))*(dx(ux)+dy(uy)) ) ;
	
	if (i%10==0) 
	{
		savevtk("Omega"+i/10+".vtk",Omega,[theta1,theta2],[ux,uy]);
	}
	
	data<<J<<" "<<vol<<" "<<J+lagr*vol<<" "<<lagr<<" "<<vol-vol0<<endl;
	data.flush;
	
    //////////////////////////////////////////
	//  Update mesh
	//////////////////////////////////////////
    real coef=100;	
	real minT0 = checkmovemesh(Omega, [x, y]);
    while(1){
        real minT = checkmovemesh(Omega, [x+coef*truncate*theta1,y+coef*truncate*theta2]);
        coef/=1.2;
        if (minT > minT0/5.0) break;
    }
    Omega = movemesh(Omega,[x+coef*truncate*theta1,y+coef*truncate*theta2]);
    Omega = adaptmesh (Omega,sizeMesh,IsMetric=1,nbvx=100000,hmin=sizeMesh*3.0);
}

Rezultati

Initial shape
Initial shape
Initial shape
Initial shape
middle shape
Final shape