flow123d / flow123d

Main repository of the Flow123d project.
http://flow123d.github.io/
19 stars 13 forks source link

Split boundary conditions for mechanics #1296

Open jstebel opened 3 years ago

jstebel commented 3 years ago

In mechanics, there are 2 basic types of b.c. - displacement and traction. Sometimes it is however necessary to use different type for normal and tangential direction. In 2D and 1D we have 1 or 2 additional directions that are neither normal to the boundary nor tangential (aligned with the 2D or 1D element). Summing up, we should provide possibility to set independent type for up to 3 directions (I call them normal, tangent and binormal as in the Frenet frame).

Consider for example the "roller" b.c. on the bottom side of a square domain in XY plane: We want zero displacement in Y direction (normal), zero traction in X direction (tangent) and, in addition, zero displacement in Z direction (binormal). Currently, the "displacement_n" condition would lead to zero traction in Z direction. This may in some situations lead to ill-posed problem.

Proposal: Extend the "bc_type" to a record with 3 keys normal, tangent, binormal. Example:

bc_type:
  normal: displacement
  tangent: traction
  binormal: displacement

bc_displacement: [ dx, dy, dz ]
bc_traction: [ tx, ty, tz ]

The bc_displacement and bc_traction fields are common and only their projection to the particular direction is used.

Paulie14 commented 3 years ago

So the bc_type is relative to the domain, bc fields are relative to the global coordinates, correct?

Regarding the roller b.c. example on XY plane:

region: bottom
bc_type:
  normal: displacement
  tangent: traction
  binormal: displacement

bc_displacement: [ 0, 0, 0 ] bc_traction: [ 0, 0, 0 ] bold values are applied (thanks to the projection), do I understand correctly?

Suppose now, that I rotate the plane arbitrarily in 3D space, still calling the side bottom where we want to prescribe the b.c., I keep the values the same: bc_displacement: [ 0, 0, 0 ] bc_traction: [ 0, 0, 0 ] However, if we want to prescribe e.g. non-zero tangent traction, we would have to project it to global coordinates.

In 1D case: tangent is aligned with the line; tangent, normal and binormal are orthogonal to each other; Is the direction of normal and binormal somehow fixed (since it can rotate along tangent)? example: line along x axis:

bc_type:
  normal: displacement
  tangent: traction
  binormal: traction

I want to fix the boundary point in Z, and let it be free in Y - zero traction. (does that make even sense?) I don't know what directions are normal and binormal - which one should be displacement and which one traction ??

jstebel commented 3 years ago

So the bc_type is relative to the domain, bc fields are relative to the global coordinates, correct?

The problem with the suggested proposal is that bc_type should be a field (evaluated at every boundary element), however this is not possible when it is a record. The (vector) fields bc_displacement and bc_traction are given in global coordinates.

Another option would be to define BC separately for each component: fields bc_type_*, bc_displacement_*, bc_traction_* for * = { normal, tangent, binormal }. Then the displacement and traction would be only scalars (already projected to the particular direction).

Maybe we should allow both ways of definining BC: componentwise and together.

Regarding the roller b.c. example on XY plane:

region: bottom
bc_type:
  normal: displacement
  tangent: traction
  binormal: displacement

bc_displacement: [ 0, 0, 0 ] bc_traction: [ 0, 0, 0 ] bold values are applied (thanks to the projection), do I understand correctly?

Yes, so I meant it.

Suppose now, that I rotate the plane arbitrarily in 3D space, still calling the side bottom where we want to prescribe the b.c., I keep the values the same: bc_displacement: [ 0, 0, 0 ] bc_traction: [ 0, 0, 0 ] However, if we want to prescribe e.g. non-zero tangent traction, we would have to project it to global coordinates.

The bc_traction vector field is applied to all components for which the user indicated type traction, i.e. here tangent and binormal. So the bc_traction vector has to be set properly.

In 1D case: tangent is aligned with the line; tangent, normal and binormal are orthogonal to each other; Is the direction of normal and binormal somehow fixed (since it can rotate along tangent)?

Not really. By tangent I mean any direction aligned with the boundary element. On the boudary of a 1D domain, there is no tangent direction (the boundary "element" is a point) but a 2D "binormal plane". Briefly:

boundary of 3D domain: 1 normal, 2 tangents boundary of 2D domain: 1 normal, 1 tangent, 1 binormal boundary of 1D domain: 1 normal, 2 binormals

example: line along x axis:

bc_type:
  normal: displacement
  tangent: traction
  binormal: traction

I want to fix the boundary point in Z, and let it be free in Y - zero traction. (does that make even sense?) I don't know what directions are normal and binormal - which one should be displacement and which one traction ??

I think there is no generic way to do this unless we allow to explicitly define arbitrary direction in which the particular b.c. would be applied. In my opinion such a situation would not be frequent.

Paulie14 commented 3 years ago

OK, the 1D case was not clear to me and I was a bit confused by the reference to Frenet frame where I thought that the triplet (tangent, normal, binormal) is considered in all dims. That is however valid for boundary in 2D..

It seems to me, that if we have a more complex boundary (a curve), we might have trouble to describe it in global coords and to apply the fields bc_displacement, bc_traction correctly. Having also the componentwise approach, it would be possible. Maybe we should have some more "useful" examples of what we want to solve by these b.c...

jbrezmorf commented 3 years ago

Results of discussion:

jstebel commented 3 years ago
  * Tangential traction for boundary of 2d surface
    `f * tangent_vector`
    tangent_vector is nonzero only on the boundary of 2d surfaces, problematic specification of the direction, requires oriented surface

Better will be to define tangential projection matrix, which is independent of orientation.

Paulie14 commented 3 years ago

COMSOL b.c. interface:

The "advanced" options for b.c. are not clear how they work in different dimension. We still do not know, how COMSOL deals with 2D geometry in 3D coordinates. We might need to suggest some tests and run them in COMSOL...

jbrezmorf commented 2 years ago

Moved to 4.0.0 as the full BParser syntax is needed.

jbrezmorf commented 2 years ago

See the paper on the conditioning of the Nitsche method. Using the stabilization it performs right and can resolve many problems with application of the Dirichlet conditions.