Hello,

I would like to know if it is possible to pin nodes (instead of surfaces) as boundary conditions to solve thermoelasticity problems.

I want to get the geometric distorsion of the part from the thermal shrinkage. However, I don’t want to pin a surface but just 3 nodes to avoid rigid body translation/rotation.

I looked and try different solution proposed here but it doesn’t work properly.

There is two options :

- Pin different nodes
- Extract an element surface and apply the boundary condition only in this surface.

I can illustrate the exemple if necessary.

Here some part of my code : (no shrinkage, it is just to try with a pressure)

mesh3 MTPt = cube(1, 1, 1, [x*0.3-0.15, y*0.3-0.15, z*0.1]);

fespace TP(MTPt, [P1, P1,P1]);

TP [ut, vt, wt], [uut, vvt, wwt];

real E1 = 5.5e10;

real E2 = 30e8;

real E3 = 10e8;

real nu12 = 0.33;

real nu13 = 0.33;

real nu23 = 0.33;

real nu21 = 0.33;

real nu31 = 0.33;

real nu32 = 0.33;

real G23 = 5.2e9;

real G13 = 5.2e9;

real G12 = 5.2e9;

real Aa = 1 - nu12*nu21 - nu23*nu32 - nu31*nu13 - 2*nu21*nu32*nu13;

Aa = Aa / ( E1*E2*E3);

real C11 = (1- nu23*nu32) / (E2*E3*Aa);
real C12 = (nu21 + nu31*nu23) / (E2

*E3*Aa);

real C13 = (nu31 + nu21

*nu32) / (E2*E3

*Aa);*

real C22 = (1 - nu13nu31) / (E1

real C22 = (1 - nu13

*E3*Aa);

real C23 = (nu32 - nu12

*nu31) / (E1*E3

*Aa);*

real C33 = (1- nu12nu21) / (E1

real C33 = (1- nu12

*E2*Aa);

real C44 = 2

*G23;*

real C55 = 2G13;

real C55 = 2

real C66 = 2*G12;

macro Strain(u,v,w) [dx(u), dy(v), dz(w), sqrt(2)*(dy(w)+dz(v)), sqrt(2)*(dx(w)+dz(u)), sqrt(2)*(dy(u)+dx(v))]//

func Cc = [ [C11, C12, C13, 0, 0, 0 ] ,

[C12, C22, C23, 0, 0, 0 ] ,

[C13, C23, C33, 0, 0, 0 ] ,

[0, 0, 0, C44, 0, 0 ] ,

[0, 0, 0, 0, C55, 0 ] ,

[0, 0, 0, 0, 0, C66] ];

real Pressure = -1;

solve mechanics([ut,vt,wt],[uut,vvt,wwt])=

int3d(MeshTP)(Strain(uut,vvt,wwt)’*(Cc*Strain(ut,vt,wt)))

- int2d(MeshTP, 6)(Press*wwt)

- on(5, wt=0)
- on(1, vt=0)
- on(2, ut=0);

savevtk(“presse.vtu”,dataname=“u v w tot”,MeshTP, u,t vt, wt, [ut,vt,wt], order=Order, bin=false);

I also tried with a varf approach :

varf a ( [ut, vt, wt],[uut, vvt, wwt] ) = int3d ( MTPt ) ( Strain(uut,vvt,wwt)'*Cc*Strain(ut,vt,wt) )

+ int2d(MTPt, 6)(Pressure*wwt)

+ on(5, wt = 0)

+ on(1, vt = 0)

+ on(2, ut = 0) ;

matrix A = a ( TP , TP, solver=sparsesolver ) ; // build the matrix

real[int] b = a(0, TP);

ut[] = A^-1*b;

which leads to the same result obviously.

I then tried to reduce the matrix A by removing the row and colum associated to my pinned nodes. Same for b. But I don"t get the result I expected …

Thank you for your help.

DENIS Yvan