Open jstebel opened 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 ??
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
andbinormal
- 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.
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...
Results of discussion:
bc_displacement
and bc_traction
prescribed as vectors in global reference frame
We will support FieldFormula containing various vector and tensor fields dependent on the normal field. This allows prescription of the displacement or traction only in normal or tangential directions.
bc_traction: f * normal
bc_traction: A @ normal
F
.bc_traction: tangential_projection @ F
tangential_projection is a tensor defined as: eye - normal[:, None] * normal[None,:]
f * tangent_vector
tangent_vector is nonzero only on the boundary of 2d surfaces, problematic specification of the direction, requires oriented surface
We assume weak Dirichlet condition, so the boundary traction is a sum of Q(bc_traction)
and \alpha * P(bc_displacement - displacement)
, where \alpha
is an adaptively determined weight and P
, Q
are complementary projections given by bc_type
.
We assume constant bc_type on regions, this can be enforced by suitable INPUT_ASSERT. Possible bc_types:
displacement
: P = eye, Q = zerotraction
: P = zero, Q = eyeroller
: P = normal_projection, Q = tangential_projectionrail
: P = tangetnial_vector x normal_vector projection, Q = surface normal projection, both projections zero for boundary of 3D and 1D elements* 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.
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...
Moved to 4.0.0 as the full BParser syntax is needed.
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:
The bc_displacement and bc_traction fields are common and only their projection to the particular direction is used.