Hi,
I am trying to use the pre-strain option for the stress solver. The structure is very simple - two boxes one on top another, the bottom box has zero displacement in the bottom as boundary condition and the second box on top has a uniform pre-strain defined as
Pre Strain
Size 6
Real -0.0401 -0.0401 -0.0401 0 0 0
in the corresponding materials section (it is not clear from the manual how the Pre Strain is defined, but looking at the source code I can see that it is a 6-element array).
ElmerSolver runs fine and gives zero result - the displacement, strain and stress in the whole structure is just zero, which is apparently not the correct solution I am looking for in this example.
The sif and gmsh geo files are attached.
I would really appreciate any help in correcting this simple example.
From physical point of view this is an attempt to model a simple "Quantum Well" strain - Ge "thin" strained layer on top of thick (and hence - mainly unstrained) Si layer. The Si layer is assumed to be a "substrate" - therefore zero displacement boundary condition at the bottom. This is related to semiconductor structures - i.e. growth of thin material with different lattice constant on top of the other material, the strain occurs because of difference in lattice constants - the thin material on top "has to match" the lattice constant of the bottom material (="substrate") and hence gets strained.
Many thanks!
Aleksey
Stress Solver - Pre-strain is not applied?
Stress Solver - Pre-strain is not applied?
- Attachments
-
- t1_QW.geo
- (4.39 KiB) Downloaded 11 times
-
- Elmer_t1_QW.sif
- (4.8 KiB) Downloaded 10 times
-
- Posts: 2400
- Joined: 25 Jan 2019, 01:28
- Antispam: Yes
Re: Stress Solver - Pre-strain is not applied?
I put a load on it so that there would be a solution. Then I ran it with and with out the pre strain. There was no change in the answer.
Re: Stress Solver - Pre-strain is not applied?
Hi All,
to add - as you can see from the sif file (commented out Body Force 1 section), I also tried to apply the "pre-strain" in a different way - to have it as "Body Force" to volume 2, the result is the same - zero trivial solution. I also tried to apply "Body Force" as Stress - also zero result = displacement is still zero as a the solution.
I started to look more in the source code and it seems to me that although ElmerSolver does not complain on Pre-Strain entry in the sif file, it may be the case that I do the input incorrectly for some reason and therefore Pre-strain is interpreted as zero and ElmerSolver is doing the solution effectively with pre-strain being just 0.
And / or, it is also possible that I am doing the output in a wrong way?
Many thanks for your help!
Aleksey
to add - as you can see from the sif file (commented out Body Force 1 section), I also tried to apply the "pre-strain" in a different way - to have it as "Body Force" to volume 2, the result is the same - zero trivial solution. I also tried to apply "Body Force" as Stress - also zero result = displacement is still zero as a the solution.
I started to look more in the source code and it seems to me that although ElmerSolver does not complain on Pre-Strain entry in the sif file, it may be the case that I do the input incorrectly for some reason and therefore Pre-strain is interpreted as zero and ElmerSolver is doing the solution effectively with pre-strain being just 0.
And / or, it is also possible that I am doing the output in a wrong way?
Many thanks for your help!
Aleksey
Re: Stress Solver - Pre-strain is not applied?
Hi All,
I am looking at the source code - StressSolve.f90
1. PreStrain is defined as array (6,N), where (I guess) N- number of nodes. This means that my input for Pre Strain as "Size 6" array is probably correct.
2. PreStrain is set by default to zero in the following section:
(line 1177 of StressSolve.f90)
IF (.NOT. ConstantBulkMatrixInUse ) THEN
PreStress = 0.0d0
PreStrain = 0.0d0
IF( AnyPre ) THEN
CALL ListGetRealArray( Material, 'Pre Stress', Work, n, NodeIndexes, Found )
IF ( Found ) THEN
k = SIZE(Work,1)
PreStress(1:k,1:n) = Work(1:k,1,1:n)
END IF
CALL ListGetRealArray( Material, 'Pre Strain', Work, n, NodeIndexes, Found )
IF ( Found ) THEN
k = SIZE(Work,1)
PreStrain(1:k,1:n) = Work(1:k,1,1:n)
END IF
END IF
END IF
The above means to me that to have PreStrain to be non-zero I must have ConstantBulkMatrixInUse set as False ?
In my sif file it is set :
Constant Bulk System = False
I need to check - does it mean that ConstantBulkMatrixInUse is False? I need to dig it further...
3. The in StressSolve.f90 Prestrain is used in a call to StressCompose and, again, this happens ONLY if ConstantBulkMatrixInUse=False
(line 1301 of StressSolve.f90)
CASE( Cartesian, AxisSymmetric, CylindricSymmetric )
IF ( ConstantBulkMatrixInUse ) THEN
CALL StressForceCompose( FORCE, FORCE_im, LOAD, LOAD_im, ElasticModulus, PoissonRatio, &
PlaneStress, Isotropic,StressLoad, StrainLoad, HeatExpansionCoeff, &
LocalTemperature, Element, n, ntot, ElementNodes, RelIntegOrder, RotateC, TransformMatrix )
ELSE
CALL StressCompose( MASS, DAMP, STIFF, FORCE, FORCE_im, LOAD, LOAD_im, ElasticModulus, &
PoissonRatio, Density, PlaneStress, Isotropic, &
PreStress, PreStrain, StressLoad, StrainLoad, HeatExpansionCoeff, &
LocalTemperature, Element, n, ntot, ElementNodes, RelIntegOrder, StabilityAnalysis &
.AND. iter>1, GeometricStiffness .AND. iter>1, NodalDisplacement, &
RotateC, TransformMatrix, NodalMeshVelo, Damping, RayleighDamping, &
RayleighAlpha, RayleighBeta,EvaluateAtIP,EvaluateLoadAtIp,NeedMass)
END IF
My conclusion is that I need to be sure that ConstantBulkMatrixInUse=False, otherwise PreStrain is not applied.
I hope that the above statement in the Solver section Constant Bulk System = False actually does it?
to add - I also put
Constant Bulk Matrix = False
in the sif file and the result is the same.
according to StreeSolver.f90
ConstantBulkMatrix = GetLogical( SolverParams, 'Constant Bulk Matrix', Found )
and
ConstantBulkMatrixInUse = ConstantBulkMatrix .AND. &
ASSOCIATED(Solver % Matrix % BulkValues)
I am not quite sure what is the value of ASSOCIATED(Solver % Matrix % BulkValues) and how it is set, but at least if ConstantBulkMatrix=False, then it is "guaranteed" that ConstantBulkMatrixInUse=False
Any comment would be much appreciated!
Kind regards,
Aleksey
I am looking at the source code - StressSolve.f90
1. PreStrain is defined as array (6,N), where (I guess) N- number of nodes. This means that my input for Pre Strain as "Size 6" array is probably correct.
2. PreStrain is set by default to zero in the following section:
(line 1177 of StressSolve.f90)
IF (.NOT. ConstantBulkMatrixInUse ) THEN
PreStress = 0.0d0
PreStrain = 0.0d0
IF( AnyPre ) THEN
CALL ListGetRealArray( Material, 'Pre Stress', Work, n, NodeIndexes, Found )
IF ( Found ) THEN
k = SIZE(Work,1)
PreStress(1:k,1:n) = Work(1:k,1,1:n)
END IF
CALL ListGetRealArray( Material, 'Pre Strain', Work, n, NodeIndexes, Found )
IF ( Found ) THEN
k = SIZE(Work,1)
PreStrain(1:k,1:n) = Work(1:k,1,1:n)
END IF
END IF
END IF
The above means to me that to have PreStrain to be non-zero I must have ConstantBulkMatrixInUse set as False ?
In my sif file it is set :
Constant Bulk System = False
I need to check - does it mean that ConstantBulkMatrixInUse is False? I need to dig it further...
3. The in StressSolve.f90 Prestrain is used in a call to StressCompose and, again, this happens ONLY if ConstantBulkMatrixInUse=False
(line 1301 of StressSolve.f90)
CASE( Cartesian, AxisSymmetric, CylindricSymmetric )
IF ( ConstantBulkMatrixInUse ) THEN
CALL StressForceCompose( FORCE, FORCE_im, LOAD, LOAD_im, ElasticModulus, PoissonRatio, &
PlaneStress, Isotropic,StressLoad, StrainLoad, HeatExpansionCoeff, &
LocalTemperature, Element, n, ntot, ElementNodes, RelIntegOrder, RotateC, TransformMatrix )
ELSE
CALL StressCompose( MASS, DAMP, STIFF, FORCE, FORCE_im, LOAD, LOAD_im, ElasticModulus, &
PoissonRatio, Density, PlaneStress, Isotropic, &
PreStress, PreStrain, StressLoad, StrainLoad, HeatExpansionCoeff, &
LocalTemperature, Element, n, ntot, ElementNodes, RelIntegOrder, StabilityAnalysis &
.AND. iter>1, GeometricStiffness .AND. iter>1, NodalDisplacement, &
RotateC, TransformMatrix, NodalMeshVelo, Damping, RayleighDamping, &
RayleighAlpha, RayleighBeta,EvaluateAtIP,EvaluateLoadAtIp,NeedMass)
END IF
My conclusion is that I need to be sure that ConstantBulkMatrixInUse=False, otherwise PreStrain is not applied.
I hope that the above statement in the Solver section Constant Bulk System = False actually does it?
to add - I also put
Constant Bulk Matrix = False
in the sif file and the result is the same.
according to StreeSolver.f90
ConstantBulkMatrix = GetLogical( SolverParams, 'Constant Bulk Matrix', Found )
and
ConstantBulkMatrixInUse = ConstantBulkMatrix .AND. &
ASSOCIATED(Solver % Matrix % BulkValues)
I am not quite sure what is the value of ASSOCIATED(Solver % Matrix % BulkValues) and how it is set, but at least if ConstantBulkMatrix=False, then it is "guaranteed" that ConstantBulkMatrixInUse=False
Any comment would be much appreciated!
Kind regards,
Aleksey
Re: Stress Solver - Pre-strain is not applied?
After checking the solver code I think a given Pre Strain is used only in special cases where the effect of geometric stiffness is activated (Stability Analysis = True or Geometric Stiffness = True).
If you update to get the change
https://github.com/ElmerCSC/elmerfem/co ... 0f675667e6
it might be possible to include initial strains by giving them in a body force section as
Strain Load(6) = -0.0401 -0.0401 -0.0401 0 0 0
The stress and strain computation haven't been modified, so their interpretation may need to be done with some care if Strain Load is given.
-- Mika
If you update to get the change
https://github.com/ElmerCSC/elmerfem/co ... 0f675667e6
it might be possible to include initial strains by giving them in a body force section as
Strain Load(6) = -0.0401 -0.0401 -0.0401 0 0 0
The stress and strain computation haven't been modified, so their interpretation may need to be done with some care if Strain Load is given.
-- Mika
Re: Stress Solver - Pre-strain is not applied?
Coincidentally I have wanted to ask a very similar question. I have a different minimal example but the same observation: the only method for applying pre-stress/pre-strain in the StressSolver is to use "Strain Load" or "Stress Load" in a "Body Force".
I'm happy to share the MWE if you're interested (a simple 2D disk with no boundary conditions). My script includes:
where I comment/un-comment various lines for various attempts. The Material "Pre Stress"/"Pre Strain" tags get a "Unlisted keyword" warning in the log, but are not included in the "Unused keywords" at the end. The Body Force "Stress"/"Strain" tags just go straight through to "Unused keywords", which isn't too surprising because I can't see them in the source code.
I'm happy to run any additional suggestions, but for me "Strain Load" is working as expected. Thankfully I had already updated since Mika's fix to the NeedPreStress flag
I'm happy to share the MWE if you're interested (a simple 2D disk with no boundary conditions). My script includes:
Code: Select all
Material 1
...
Pre Strain(6) = Real 2.0 2.0 2.0 0 0 0
Pre Stress(6) = Real 2e3 2e3 2e3 0 0 0
End
Solver 1
...
Procedure = "StressSolve" "StressSolver"
Constant Bulk Matrix = Logical False
! Geometric Stiffness = True
Stability Analysis = True
End
Body Force 1
...
Strain(6) = Real 2.0 2.0 1.0 0 0 0
Stress(6) = Real 2e3 2e3 1.0 0 0 0
Strain Load(3) = Real 0.0 0.0 0.0 ! for me these are always the [xx,yy,xy] components rather than the full 3D tensor
End
I'm happy to run any additional suggestions, but for me "Strain Load" is working as expected. Thankfully I had already updated since Mika's fix to the NeedPreStress flag