Dear Wen,
thanks for your reply. Our idea is to start from you work and develop this capability.
First let me say that I checkout your czm_moose branch, and after recompiling libmesh and running test I had the follwoing errors
materials/stateful_prop.spatial_bnd_only.................................................... FAILED (EXODIFF)
materials/stateful_prop.stateful_copy....................................................... FAILED (EXODIFF)
materials/stateful_internal_side_uo.test.................................................... FAILED (EXODIFF)
materials/stateful_prop.spatial_test........................................................ FAILED (EXODIFF)
userobjects/internal_side_user_object.get_neighbor_test..................................... FAILED (EXODIFF)
I don't know if this relevant or not to what you were doing.
Also I noticed you have a test input file czm.i but the related czm0.e file is missing. If you have it can you upload it?
Then I have a more fundamental question, why you are inserting additional nodes in between the interfaces rather then implementing cohesive elements in libmesh, it shouldn't be this the most natural way to do it? There is a practical reason for this choice?
Dear Wen,
I worked on the base you provided me and I have been able to implement the Xu Needleman model for the cohesive zone.
Code is here https://github.com/arovinelli/moose/tree/czm_wen .
You can compile it and execute the test moose/modules/tensor_mechanics/test/tests/cohesive_zone/czmXN.i
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/8945f6bb-982e-4a5d-aa10-611dfdf1b289%40googlegroups.com.
I'm here - but many things have gotten in the way (as usual). Let me review this and get back to you soon.Derek
On Wed, Apr 4, 2018 at 11:39 AM, Andrea Rovinelli <andrea.r...@gmail.com> wrote:
Dear Wen,
I worked on the base you provided me and I have been able to implement the Xu Needleman model for the cohesive zone.
Code is here https://github.com/arovinelli/moose/tree/czm_wen .
You can compile it and execute the test moose/modules/tensor_mechanics/test/tests/cohesive_zone/czmXN.i
Now that a non-trivial traction separation law works we should find a better way to implement this interface (ie. starting from an already disjoint mesh with hacking during runtime) to make it work with large deformation and convoluted interfaces, like in the case of grain boundaries.
In fact, the current implementation does not work with triple points (see the test czm_junction_2D.i ).
Unfortunately this i beyond my Libmesh and Mosse knowledge. I know Derek was working on it, but I a haven't heard from him in a while.
Andrea
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users...@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/53084002-6a88-433b-bfac-098388144cf7%40googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users...@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/56beed33-c873-47af-9933-0af2c7fb0650%40googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/d0fcf407-105e-4647-847f-3c7f274ee9ae%40googlegroups.com.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/de436d68-4746-4e63-a8bb-84b473e8707f%40googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/80cf94a5-ac39-4dde-b611-2d459f98d334%40googlegroups.com.
On the master side, the sign convention is the same as it would be for an IntegratedBC that falls out of your integration by parts (generally speaking). On the slave side it will be the opposite sign of what would fall out of integration by parts because the normal vector is defined with respect to the master side (e.g. pointing outward from the master volume)
On Mon, May 14, 2018 at 4:00 PM, Andrea Rovinelli <andrea.r...@gmail.com> wrote:
Ok, Digging into the problem I figured out there is a sign error in the residual.
What is the appropriate sign convention for the interface kernel for Elem and Neighbor (and also for the Jacobian)
In this case my traction separation equation is written as u_neighbor-u and a positive jump (let's say in the opening direction) produces a positive traction in that direction whcih is also aligned with the normal of the interface.
On Monday, May 14, 2018 at 1:36:13 PM UTC-5, Wen Jiang wrote:I think the interfaceKernels should add residuals correctly regardless of the interface topology. I need to pull down your branch and see if I can find what causes it fail to converge.
On Monday, May 14, 2018 at 8:09:20 AM UTC-6, Andrea Rovinelli wrote:Dear all,during the weekend I spent some time in trying to figure out what's wrong with my implementation.To make sure that the cause of the problem is not the mesh splitting algorithm, I did a step back.I used a 2D mesh and hard-coded the splitting (i.e. I manually duplicated nodes and assigned sides to the boundary).Mesh modifications are performed in CohesiveZoneMesh2D_JunctionTest. Tests performed with this model can be found in.../tensor_mechanics/test/tests/CohesiveZoneJunction.Even in these cases the solver does not converge, therefore the problem is somewhere else.I think the way the boundary interface is setup does not allow to properly add residuals at npoint junctions.Any comment or help would be really appreciatedAll the best
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users...@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
What do you mean it ignores it?
When I'm testing Jacobians, I always use RandomICs to make sure gradients are non-zero
What do you mean it ignores it?The debugger always returns "no problem detected" even if I purposely implement a wrong Jacobian
Could this be related to the fact that the residual and jacobian are computed and stored as material property and only pulled from the kernel?
When I'm testing Jacobians, I always use RandomICs to make sure gradients are non-zero
I do set RanomICs on the displacement variables on the master side of the interface boundary.
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/4c4afbbe-4cb2-40b4-bc5d-c672b986a6f7%40googlegroups.com.
On Wed, May 16, 2018 at 8:15 AM, Andrea Rovinelli <andrea.r...@gmail.com> wrote:What do you mean it ignores it?The debugger always returns "no problem detected" even if I purposely implement a wrong Jacobian
Could this be related to the fact that the residual and jacobian are computed and stored as material property and only pulled from the kernel?This makes it sound like I need to go look at your code. I don't understand what the above sentence means. Are you not still returning residuals and Jacobians from your computeQpResidual/Jacobian methods?
When I'm testing Jacobians, I always use RandomICs to make sure gradients are non-zero
I do set RanomICs on the displacement variables on the master side of the interface boundary.
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users...@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
The material properties pulled from the interface kernel belong to the wrong element (I.e kernel is working on element 0 and material property come from element 2)
What could be the cause of the problem??
In my czm branch, I used boundary material property to calculate the opening and traction force and use them in the interfaceKernel. The 'boundary' is defined on only one side of the interface.
Could you check if element 0 and element 2 are neighbor? If so, it is possible that the InterfaceKernel works on elem0 and elem2 face while fetching the material property from elem2 face.

--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/d6e05070-1c37-4343-9e99-b9e6649bdf77%40googlegroups.com.
I'm losing track of what's going on here. Without boring down into the code, it seems like this customization of the InterfaceKernel system has gone a bit off the tracks.
If I was to pull your branch, would I find nothing but easy-to-understand, beautiful code?
I'm loathe to go down a rabbit hole for a concept that seems to be a more natural fit for an entirely different system (FaceFaceConstraints)...
Dear AlexanderI'm losing track of what's going on here. Without boring down into the code, it seems like this customization of the InterfaceKernel system has gone a bit off the tracks.let me explain what's happening. I had issues with the jacobian and I wasn't able to understand what was wrong with math. After rechecking the equations dozens of times and making a simple FD check I come to the conclusion that the issue was somewhere else. The original model I posted on this mailing list a couple of weeks ago was divided into 3 components a material (doing all the computation on the interface) a user object containing the CZ law and an interface kernel pulling residual and jacobian coefficients from the material. To check if my jacobian was really wrong or not I did all the computation inside the interfacekernel. As soon as I did this I achieved quadratic convergence and no issues. Therefore the jacobian is right and the interface kernel behave as expected. However I need material property on the interface to keep track of state variables. Therefore I compared one by one the result of MP with the ones obtained in the interfacekernel. It comes out that when retrieving material properties something goes wrong, specifically the property pulled into the interfacekernel sometimes do not belong to the current element or side.
I don't know where this issue is originating. It might be a consequence of splitting the mesh at runtime (we discussed this in the telecon a few months ago), or it might be something else.
As far as my knowledge goes this might be related to my implementation or to the original changes that Wen did to allow a material to be neighbor coupleable, or to other changes related to the ComputeMaterialObjectThread or ComputeResidualThread. I'm not an expert of these core libraries so I can't comment on this. Those changes are what I asked someone with more experience than me to look at not all my code.
If I was to pull your branch, would I find nothing but easy-to-understand, beautiful code?We can discuss about beautiful code styling as much as you want. I don't think you will find my code "beautiful" as it is in the middle of my development and I'm making changes all the time to figure out what is really going on, but I don't consider myself a poor coder. Again it was not my intent to let you review all the implementation but just the changes to the basic routines which are only a few lines in 3 or 4 files (again note that I didn't do these changes).I'm loathe to go down a rabbit hole for a concept that seems to be a more natural fit for an entirely different system (FaceFaceConstraints)...I asked for help in converting the FaceFaceConstraint (which now is deprecated and is renamed as Mortar) from mortar to DG a number of times. I also asked for suggestion on how to do it myself as you might have more compelling things to work on (email and this discussions here) but you know better than what the answer has been until today. If you can provide me with guidance in doing the conversion from mortart to DG or penalty I can do that (this is not a moose user change, is more of adding a core functions that requires deep knowledge of the framework). HoweverI have to say that conventional Cohesive elemnents does not differe so much in their limitation to the interface kernel where the neighboorhood is considered to be the one present in the undeformed configuration (i.e. calculation are performed always between the same faces). These is why we decided to follow the route Wen implemented months ago. Also It was our only option at that time.
I hope this clarify your question and concerns.
Kind regards
Andrea
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/29a2902a-3c90-4f81-90cf-008997fb5d70%40googlegroups.com.
--
You received this message because you are subscribed to a topic in the Google Groups "moose-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/moose-users/hQkaOVbrm88/unsubscribe.
To unsubscribe from this group and all its topics, send an email to moose-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/63c9afc9-1c8d-4746-9f5b-72cabb5c6bce%40googlegroups.com.
Real r = 0.5 * (-_D[_qp] * _grad_u[_qp] * _normals[_qp] +
-_D_neighbor[_qp] * _grad_neighbor_value[_qp] * _normals[_qp]);
switch (type)
{
case Moose::Element:
r *= _test[_i][_qp];
break;
case Moose::Neighbor:
r *= -_test_neighbor[_i][_qp];
break;
}
Real res =
_D * _grad_u[_qp] * _normals[_qp] - _D_neighbor * _grad_neighbor_value[_qp] * _normals[_qp];
switch (type)
{
case Moose::Element:
return res * _test[_i][_qp];
case Moose::Neighbor:
return res * _test_neighbor[_i][_qp];
}
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/f0b663ac-d906-4c5d-b230-fde8a7ebaaa4%40googlegroups.com.
I was wondering how you are managing to keep only one variable of displacement between the two blocks.
I understand that a necessary solution is to duplicate the nodes at the interface so that you can have a displacement discontinuity at the interface. This is why you created the CohesiveZoneMeshSplit. I do not understand however how this solution is sufficient; I do not understand how the code manages to distinguish between disp and disp_neighbor, since both variable and neighbor variable are disp in the InterfaceKernel block of your input file.
How does MOOSE know how to switch from Moose::Element to Moose::Neighbor?
When it will be clarified for me, I would like to know if you think that your CohesiveZoneMeshSplit is quite generic in the sense that it can be applied to all types of InterfaceKernel that are linking the same variable across the interface. Or is there some restrictions to using it?I tried to use a mesh generated by your CohesiveZoneMeshSplit with my code and switch to only one variable in my input file and it didn't work. But it might be because I am using MatchValueBC that has access to a coupled_var and not a neighbor_var. I will try to implement MatchValueBC in an InterfaceKernel...
The second question can be extended to MOOSE developers as well. It regards the general way to implement InterfaceKernel.I noticed that there exists two source files in MOOSE that are implementing the same equation:InterfaceDiffusion in Moose/testInterfaceDiffusionFluxMatch in the phase field moduleThe interesting thing is that the implementation differs between the two. We are comparing:toReal r = 0.5 * (-_D[_qp] * _grad_u[_qp] * _normals[_qp] +
-_D_neighbor[_qp] * _grad_neighbor_value[_qp] * _normals[_qp]);
switch (type)
{
case Moose::Element:
r *= _test[_i][_qp];
break;
case Moose::Neighbor:
r *= -_test_neighbor[_i][_qp];
break;
}I personally have chosen the latter while Andrea chose to implement a modified version of the former (because Andrea is using the same variable across the interface?)Real res =
_D * _grad_u[_qp] * _normals[_qp] - _D_neighbor * _grad_neighbor_value[_qp] * _normals[_qp];
switch (type)
{
case Moose::Element:
return res * _test[_i][_qp];
case Moose::Neighbor:
return res * _test_neighbor[_i][_qp];
}Is there any difference to implement one or the other?
// continuity of each component of traction: sigma_ij . n_i RankTwoTensor stress_diff = _stress_master[_qp] - _stress_slave[_qp]; RealVectorValue res = stress_diff * _normals[_qp];
switch (type) { case Moose::Element: return res(_component) * _test[_i][_qp];
case Moose::Neighbor: return res(_component) * _test_neighbor[_i][_qp];
// continuity of each component of traction: sigma_ij . n_i RankTwoTensor stress_diff = - _stress_master[_qp] - _stress_slave[_qp]; RealVectorValue res = stress_diff * _normals[_qp];
switch (type) { case Moose::Element: return res(_component) * _test[_i][_qp];
case Moose::Neighbor: return - res(_component) * _test_neighbor[_i][_qp];
Thanks for your answers Andrea and Alex,I think that first of all I should introduce my InterfaceKernel.It is solving for the continuity of each component of the traction. The traction is defined in mechanics by stress*normal_vector.So my implementation is:This InterfaceKernel has to be coupled with MatchedValueJumpBC, deriving from MatchedValueBC where the residual is var - coupled_var - delta_disp.// continuity of each component of traction: sigma_ij . n_iRankTwoTensor stress_diff = _stress_master[_qp] - _stress_slave[_qp];RealVectorValue res = stress_diff * _normals[_qp];switch (type){case Moose::Element:return res(_component) * _test[_i][_qp];case Moose::Neighbor:return res(_component) * _test_neighbor[_i][_qp];This implementation is working, I have one benchmark for example where I have no delta_disp and I validate the solution with interface to the continuous problem which should be the same. With the interface, the traction is continuous and is equal to the value of the reference. The two files are compression and compression_interface.After reading your posts, I tried the other implementation to see if my tests are still passing and they are!This new implementation looks like that:
Note that if I multiply the residual by 0.5 (like in InterfaceDiffusion) it does not work anymore.// continuity of each component of traction: sigma_ij . n_iRankTwoTensor stress_diff = - _stress_master[_qp] - _stress_slave[_qp];RealVectorValue res = stress_diff * _normals[_qp];switch (type){case Moose::Element:return res(_component) * _test[_i][_qp];case Moose::Neighbor:return - res(_component) * _test_neighbor[_i][_qp];I am now confused since you told me that the first implementation (InterfaceDiffusionFluxMatch) is supposed to be wrong. However I know it is giving me the right results. And I know now as well that the implementation you are vouching for (InterfaceDiffusion) is also right.However I do not really understand the implementation of InterfaceDiffusion. Is it possible to clarify how does Moose process this residual, which contribution is given to each residual and how does it end up reconciling to the final physical equation which the flux continuity? That would be really helpful, thanks.
Coming back on the mesh splitting, I think it's a great addition to MOOSE framework Andrea, so I tried to make it work for the Moose test of the InterfaceKernel, coupled_value_coupled_flux. I created a generated mesh from Moose that I then opened it with your CohesiveZoneMeshSplit that created the mesh for my input file: mesh_duplicate-nodes (see attached). I then ran it with a modified version of the test file (see attached), that uses now only one variable but the simulation did not give me the right results...
[Mesh]
type = FileMesh
file = mesh_duplicate-nodes.e
[][Mesh]
type = CohesiveZoneMeshSplit
file = mesh2split.e
[]Is it possible that you have a look Andrea to see if it is possible to make it work? I would love to see this functionality in the MOOSE framework because I think it would be useful to a few people using InterfaceKernels.I think it would also alleviate the work on your current pull request where you could take the mesh splitting out in a separate pull request to add in the MOOSE framework (and not the TensorMechanics). Let me know your thoughts about this.
Dear Martin,
I will add this to my to do list.
As for now I can modify my code to work as mesh modifier, submit a PR and make it available to the community quickly.
If you have any suggestions, you are more than welcome to post them in the here Add a mesh modfier to split a mesh by duplicating nodes.
I will open a PR for the mesh split in the next few days as soon as the code is translated from mesh to mesh modifier (deadline are coming so don't be surprised if the actual implementation and deployment to MOOSE is delayed).
[MeshModifiers] [./break_boundary] type = BreakBoundaryOnSubdomain [../][]--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/a8a0334d-b39a-40bc-8337-0bbe4569d0c6%40googlegroups.com.
--
You received this message because you are subscribed to the Google Groups "moose-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to moose-users+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/moose-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/moose-users/bc1e1c82-f11e-4851-bd62-4668dbfdd20b%40googlegroups.com.
The matched value bc strongly sets one variable, let's call it 'u', equal to the value of the other, let's call it 'v'
I think it would also alleviate the work on your current <a href="https://github.com/idaholab/moose/pull/11
When you are desperate, it's not because you don't understand it that you won't try it XD
Andrea what you are saying is true, I ran my tests with PenaltyInterfaceDiffusion (which is the equivalent of MatchedValueBC as an InterfaceKernel) instead of MatchedValueBC and I deactivated my InterfaceKernel for the traction continuity and it converged to the right solution! There was a small exodiff but i'm happy with it.
With this implementation I can finally switch to one variable using your mesh split!So now, I REALLY want to understand the details of your derivation. As I said in my previous post, if you have any literature that I could refer to, it would be really useful...
Don't tell my supervisors but I'm still happy it works even though I don't understand it ;)
</block
after several steps, it looks like:
For case two: I apply the same boundary condition but on the right side
at the beginning it looks like:
I have no idea how this happens, it seems inside the interface, everything works fine, but the problem happens
for the two nodes at the end side?
The attachment is my input file and mesh file.
If you have time could help me to figure out this issue?
Question 2:
Is it possible to store an interface material property and history material property?
I try to implement the PPR cohesive model(https://doi.org/10.1016/j.engfracmech.2012.02.007), the model presented by Park where the maximum history displacement jump is required for the calculation.
I try to define and also get material property old stuff, but it seems not work: https://groups.google.com/forum/#!searchin/moose-users/walkandthinker|sort:date/moose-users/MOGZPwvPgxY/Vi15uMFZCQAJ
Best regards
Yang
Dear all,
I need to setup a cohesive zone model to study intra-granular cracking. In this model cracking can occur only at grain boundaries and to implement this behavior I was thinking to use cohesive elements. I would have XFEM because I don't need an arbitrary crack path, but just grain boundary cracking.
First I'm not sure if MOOSE can handle cohesive elements, i tried to look into libmesh supported element types (https://libmesh.github.io/doxygen/classlibMesh_1_1Elem.html) and I don't see specific elements allowed to have zero thickness. In fact when I try a simple 2D case in which I add some zero thickness QUAD4 elements moose complains saying that the element has zero volume.
I know someone from the MOOSE development team is working on this feature and that at some point it will be released, but we need to work on this project.
Any hint and help would be really appreciated.
Thanks in advance
Andrea (ANL)