sandbox/bugs/tensor_boundary.c

Let’s describe a 2D tensor as: (a) a tensor, (b) 2 vectors or (c) 4 scalars

tensor S[];
vector TVx[], TVy[];
scalar TSxx[], TSxy[], TSyx[], TSyy[];

Let’s apply only a shear in x direction (τxy = 1). The rest of components of the tensor are zero.

int main()
{
  init_grid (4);

  vector v = S.x;
  v.n[top] = dirichlet(1); // Sxy
  v.t[top] = dirichlet(0.); // Sxx
  v = S.y;
  v.n[top] = dirichlet(0); // Syy
  v.t[top] = dirichlet(0); // Syx

  TVx.n[top] = dirichlet(1);
  TVx.t[top] = dirichlet(0);
  TVy.n[top] = dirichlet(0);
  TVy.t[top] = dirichlet(0);

  TSxx[top] = dirichlet(0);
  TSxy[top] = dirichlet(1);
  TSyx[top] = dirichlet(0);
  TSyy[top] = dirichlet(0);

  foreach() {
    foreach_dimension () {
      S.x.x[] = 0;
      S.x.y[] = 0;
      TVx.x[] = 0.;
      TVy.x[] = 0.;
    }
    TSxx[] = 0;
    TSxy[] = 0;
    TSyx[] = 0;
    TSyy[] = 0;
  }
  boundary ((scalar *){S.x, S.y, TVx, TVy, TSxx, TSxy, TSyx, TSyy});
  double shear, normal;

Lets compute the x component of the corresponding stress (acceleration): τx=(τxx)x+(τxy)y The shear component should be the same despite the tensor was constructed in (a), (b) or (c) manner.

  foreach_face(x) {
    shear = (S.x.y[0,1]+S.x.y[-1,1]-S.x.y[0,-1]-S.x.y[-1,-1])/(4.*Δ); //(\tau_{xy})_y
    normal = (S.x.x[]-S.x.x[-1,0])/Δ; //(\tau_xx)_x
    if (y > 0.75)
      fprintf(stderr,"Tensor: x %g y %g shear %g normal %g \n",
	      x, y, shear, normal);

    shear = (TVx.y[0,1]+TVx.y[-1,1]-TVx.y[0,-1]-TVx.y[-1,-1])/(4.*Δ);
    normal = (TVx.x[1,0]-TVx.x[])/Δ;
    if (y > 0.75)
      fprintf(stderr,"Vector: x %g y %g shear %g normal %g \n",
	      x, y, shear, normal);

    shear = (TSxy[0,1]+TSxy[-1,1]-TSxy[0,-1]-TSxy[-1,-1])/(4.*Δ);
    normal = (TSxx[1,0]-TSxx[])/Δ;
    if (y > 0.75)
      fprintf(stderr,"Scalar: x %g y %g shear %g normal %g \n",
	      x, y, shear, normal);
  }

  foreach()
    for (int i = -2; i <= 2; i++)
      for (int j = -2; j <= 2; j++)
	printf ("%g %g %g %g %g %g %g %g\n", x + i*Δ, y + j*Δ,
		S.x.x[i,j], S.y.y[i,j], S.x.y[i,j],
		TSxx[i,j], TSyy[i,j], TSxy[i,j]);
}

The results are indeed the same:

Tensor: x 0 y 0.875 shear 4 normal 0 
Vector: x 0 y 0.875 shear 4 normal 0 
Scalar: x 0 y 0.875 shear 4 normal 0 
....