periodic boundary condition peoblems with tetrahedral mesh
Moderators: Martin, Developers
periodic boundary condition peoblems with tetrahedral mesh
I want to create a RVE mode with tetrahedral mesh and periodic boundary conditions, as shown in the pictures below. When I check the inp files, numbers of nodes in the corresponding faces and lines are not equal, so the periodic boundary conditions are not existed. So could please tell me how to solve this problem?
- Attachments
-
- RVE.png (174.81 KiB) Viewed 8536 times
Re: periodic boundary condition peoblems with tetrahedral me
Hi,
Have you checked that your domain is correct and that the sections through your model match on the domain faces? In some cases, depending on the model, the algorithm is unable to generate a periodic mesh. Can you send an example so that I can see what's happening?
Best wishes,
Louise
Have you checked that your domain is correct and that the sections through your model match on the domain faces? In some cases, depending on the model, the algorithm is unable to generate a periodic mesh. Can you send an example so that I can see what's happening?
Best wishes,
Louise
Re: periodic boundary condition peoblems with tetrahedral me
At the beginning, thank you very much for your timely help.louisepb wrote:Hi,
Have you checked that your domain is correct and that the sections through your model match on the domain faces? In some cases, depending on the model, the algorithm is unable to generate a periodic mesh. Can you send an example so that I can see what's happening?
Best wishes,
Louise
The python code that used to generate the RVE of the composite is listed below.
*******************
Textile = CTextile()
Yarns = [CYarn(),CYarn(),CYarn(),CYarn()]
delta = 0.2085686
Yarns[0].AddNode(CNode(XYZ(delta*0 ,0.8342744+0.001579,-0.000719)))
Yarns[0].AddNode(CNode(XYZ(delta*1 ,0.8342744-0.005413,0.034950 )))
Yarns[0].AddNode(CNode(XYZ(delta*2 ,0.8342744-0.010288,0.056718 )))
Yarns[0].AddNode(CNode(XYZ(delta*3 ,0.8342744-0.002591,0.065968 )))
Yarns[0].AddNode(CNode(XYZ(delta*4 ,0.8342744-0.006163,0.070504 )))
Yarns[0].AddNode(CNode(XYZ(delta*5 ,0.8342744-0.001306,0.066754 )))
Yarns[0].AddNode(CNode(XYZ(delta*6 ,0.8342744-0.002859,0.056200 )))
Yarns[0].AddNode(CNode(XYZ(delta*7 ,0.8342744-0.002966,0.038290 )))
Yarns[0].AddNode(CNode(XYZ(delta*8 ,0.8342744-0.000270,0.012933 )))
Yarns[0].AddNode(CNode(XYZ(delta*9 ,0.8342744+0.001927,-0.011782)))
Yarns[0].AddNode(CNode(XYZ(delta*10,0.8342744+0.006998,-0.036228)))
Yarns[0].AddNode(CNode(XYZ(delta*11,0.8342744-0.000823,-0.055657)))
Yarns[0].AddNode(CNode(XYZ(delta*12,0.8342744+0.002676,-0.066264)))
Yarns[0].AddNode(CNode(XYZ(delta*13,0.8342744+0.006891,-0.071942)))
Yarns[0].AddNode(CNode(XYZ(delta*14,0.8342744+0.005319,-0.066710)))
Yarns[0].AddNode(CNode(XYZ(delta*15,0.8342744+0.004034,-0.056014)))
Yarns[0].AddNode(CNode(XYZ(delta*16,0.8342744+0.001677,-0.036282)))
Yarns[0].AddNode(CNode(XYZ(delta*17,0.8342744+0.001579,-0.000719)))
Yarns[1].AddNode(CNode(XYZ(delta*0 ,2.7113918+0.001579,-0.000719)))
Yarns[1].AddNode(CNode(XYZ(delta*1 ,2.7113918+0.001677,-0.036282)))
Yarns[1].AddNode(CNode(XYZ(delta*2 ,2.7113918+0.004034,-0.056014)))
Yarns[1].AddNode(CNode(XYZ(delta*3 ,2.7113918+0.005319,-0.066710)))
Yarns[1].AddNode(CNode(XYZ(delta*4 ,2.7113918+0.006891,-0.071942)))
Yarns[1].AddNode(CNode(XYZ(delta*5 ,2.7113918+0.002676,-0.066264)))
Yarns[1].AddNode(CNode(XYZ(delta*6 ,2.7113918-0.000823,-0.055657)))
Yarns[1].AddNode(CNode(XYZ(delta*7 ,2.7113918+0.006998,-0.036228)))
Yarns[1].AddNode(CNode(XYZ(delta*8 ,2.7113918+0.001927,-0.011782)))
Yarns[1].AddNode(CNode(XYZ(delta*9 ,2.7113918-0.000270,0.012933 )))
Yarns[1].AddNode(CNode(XYZ(delta*10,2.7113918-0.002966,0.038290 )))
Yarns[1].AddNode(CNode(XYZ(delta*11,2.7113918-0.002859,0.056200 )))
Yarns[1].AddNode(CNode(XYZ(delta*12,2.7113918-0.001306,0.066754 )))
Yarns[1].AddNode(CNode(XYZ(delta*13,2.7113918-0.006163,0.070504 )))
Yarns[1].AddNode(CNode(XYZ(delta*14,2.7113918-0.002591,0.065968 )))
Yarns[1].AddNode(CNode(XYZ(delta*15,2.7113918-0.010288,0.056718 )))
Yarns[1].AddNode(CNode(XYZ(delta*16,2.7113918-0.005413,0.034950 )))
Yarns[1].AddNode(CNode(XYZ(delta*17,2.7113918+0.001579,-0.000719)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.000829,delta*0 ,-0.000719)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.006998,delta*1 ,-0.036282)))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.000823,delta*2 ,-0.056014)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.002676,delta*3 ,-0.066710)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.006891,delta*4 ,-0.071942)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.005319,delta*5 ,-0.066264)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.004034,delta*6 ,-0.055657)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.001677,delta*7 ,-0.036228)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.000730,delta*8 ,-0.011782)))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.002427,delta*9 ,0.012933 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.005413,delta*10,0.038290 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.010288,delta*11,0.056200 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.002591,delta*12,0.066754 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.006163,delta*13,0.070504 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.001306,delta*14,0.065968 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.002859,delta*15,0.056718 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744-0.002966,delta*16,0.034950 )))
Yarns[2].AddNode(CNode(XYZ(0.8342744+0.000829,delta*17,-0.000719)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.001579,delta*0 ,-0.000719)))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.005413,delta*1 ,0.034950 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.010288,delta*2 ,0.056718 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.002591,delta*3 ,0.065968 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.006163,delta*4 ,0.070504 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.001306,delta*5 ,0.066754 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.002859,delta*6 ,0.056200 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.002966,delta*7 ,0.038290 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.000270,delta*8 ,0.012933 )))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.001927,delta*9 ,-0.011782)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.006998,delta*10,-0.036228)))
Yarns[3].AddNode(CNode(XYZ(2.7113918-0.000823,delta*11,-0.055657)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.002676,delta*12,-0.066264)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.006891,delta*13,-0.071942)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.005319,delta*14,-0.066710)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.004034,delta*15,-0.056014)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.001677,delta*16,-0.036282)))
Yarns[3].AddNode(CNode(XYZ(2.7113918+0.001579,delta*17,-0.000719)))
for Yarn in Yarns:
if Yarn == Yarns[0] or Yarn == Yarns[3]:
Yarn.AssignInterpolation(CInterpolationLinear())
YarnSection = CYarnSectionInterpNode(1, 0, 1)
Section = CSectionEllipse(0.7829025*2, 0.080362*2)
Section = CSectionRotated(Section, -0.216923*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.784817*2, 0.075321*2)
Section = CSectionRotated(Section, -0.097758*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.779567*2, 0.072356*2)
Section = CSectionRotated(Section, -0.231744*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782061*2, 0.071426*2)
Section = CSectionRotated(Section, -0.223119*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.781471*2, 0.069320*2)
Section = CSectionRotated(Section, -0.289946*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.779083*2, 0.070450*2)
Section = CSectionRotated(Section, -0.276007*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.783953*2, 0.071232*2)
Section = CSectionRotated(Section, -0.083315*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.789217*2, 0.074492*2)
Section = CSectionRotated(Section, -0.090647*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.793654*2, 0.080406*2)
Section = CSectionRotated(Section, 0.028518*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.790705*2, 0.079941*2)
Section = CSectionRotated(Section, 0.052015*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.786330*2, 0.074452*2)
Section = CSectionRotated(Section, 0.044724*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.780351*2, 0.070513*2)
Section = CSectionRotated(Section, -0.081866*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.787712*2, 0.070118*2)
Section = CSectionRotated(Section, -0.107904*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.789320*2, 0.068984*2)
Section = CSectionRotated(Section, -0.166876*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782074*2, 0.067477*2)
Section = CSectionRotated(Section, -0.296215*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782956*2, 0.070002*2)
Section = CSectionRotated(Section, -0.132859*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.787867*2, 0.073062*2)
Section = CSectionRotated(Section, -0.261218*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.7829025*2, 0.080362*2)
Section = CSectionRotated(Section, -0.216923*3.1415926/180)
YarnSection.AddSection(Section)
Yarn.AssignSection(YarnSection)
Yarn.SetResolution(20)
Yarn.AddRepeat(XYZ(delta*35,0,0))
Yarn.AddRepeat(XYZ(0,delta*35,0))
Yarn.SetYoungsModulusX(202547.036, 'MPa')
Yarn.SetYoungsModulusY(11366.203, 'MPa')
Yarn.SetYoungsModulusZ(11366.203, 'MPa')
Yarn.SetShearModulusXY(6351.450, 'MPa')
Yarn.SetShearModulusXZ(6351.450, 'MPa')
Yarn.SetShearModulusYZ(4048.035, 'MPa')
Yarn.SetPoissonsRatioX(0.404)
Yarn.SetPoissonsRatioY(0.21452)
Yarn.SetPoissonsRatioZ(0.21452)
Yarn.SetAlphaX(-2e-007, '/K')
Yarn.SetAlphaY(3e-006, '/K')
Yarn.SetAlphaZ(3e-006, '/K')
Textile.AddYarn(Yarn)
else:
Yarn.AssignInterpolation(CInterpolationLinear())
YarnSection = CYarnSectionInterpNode(1, 0, 1)
Section = CSectionEllipse(0.7921795*2, 0.0801735*2)
Section = CSectionRotated(Section, -0.216923*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.786330*2, 0.074452*2)
Section = CSectionRotated(Section, -0.261218*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.780351*2, 0.070513*2)
Section = CSectionRotated(Section, -0.132859*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.787712*2, 0.070118*2)
Section = CSectionRotated(Section, -0.296215*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.789320*2, 0.068984*2)
Section = CSectionRotated(Section, -0.166876*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782074*2, 0.067477*2)
Section = CSectionRotated(Section, -0.107904*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782956*2, 0.070002*2)
Section = CSectionRotated(Section, -0.081866*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.787867*2, 0.073062*2)
Section = CSectionRotated(Section, 0.044724*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.781868*2, 0.079465*2)
Section = CSectionRotated(Section, 0.052015*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.783937*2, 0.081259*2)
Section = CSectionRotated(Section, 0.028518*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.784817*2, 0.075321*2)
Section = CSectionRotated(Section, -0.090647*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.779567*2, 0.072356*2)
Section = CSectionRotated(Section, -0.083315*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.782061*2, 0.071426*2)
Section = CSectionRotated(Section, -0.276007*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.781471*2, 0.069320*2)
Section = CSectionRotated(Section, -0.289946*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.779083*2, 0.070450*2)
Section = CSectionRotated(Section, -0.223119*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.783953*2, 0.071232*2)
Section = CSectionRotated(Section, -0.231744*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.789217*2, 0.074492*2)
Section = CSectionRotated(Section, -0.097758*3.1415926/180)
YarnSection.AddSection(Section)
Section = CSectionEllipse(0.7921795*2, 0.0801735*2)
Section = CSectionRotated(Section, -0.216923*3.1415926/180)
YarnSection.AddSection(Section)
Yarn.AssignSection(YarnSection)
Yarn.SetResolution(20)
Yarn.AddRepeat(XYZ(delta*35,0,0))
Yarn.AddRepeat(XYZ(0,delta*35,0))
Yarn.SetYoungsModulusX(202547.036, 'MPa')
Yarn.SetYoungsModulusY(11366.203, 'MPa')
Yarn.SetYoungsModulusZ(11366.203, 'MPa')
Yarn.SetShearModulusXY(6351.450, 'MPa')
Yarn.SetShearModulusXZ(6351.450, 'MPa')
Yarn.SetShearModulusYZ(4048.035, 'MPa')
Yarn.SetPoissonsRatioX(0.404)
Yarn.SetPoissonsRatioY(0.21452)
Yarn.SetPoissonsRatioZ(0.21452)
Yarn.SetAlphaX(-2e-007, '/K')
Yarn.SetAlphaY(3e-006, '/K')
Yarn.SetAlphaZ(3e-006, '/K')
Textile.AddYarn(Yarn)
Textile.SetMatrixYoungsModulus(3116, 'MPa')
Textile.SetMatrixPoissonsRatio(0.32)
Textile.SetMatrixAlpha(6.5e-006)
Textile.AssignDomain(CDomainPlanes(XYZ(0,0,-0.140927),XYZ(delta*17,delta*17,0.139825)))
AddTextile("C-Epoxy-TrueModel-Modified-LinearInterpolate",Textile)
*****************************
Then I exported the volume mesh of the RVE model, and used Abaqus to read the inp file. The result is listed in the picture below: There are only two faces in sets. The other 4 faces are missing. All the edges are missing too.
- Attachments
-
- Abaqus.jpg (212.35 KiB) Viewed 8530 times
Re: periodic boundary condition peoblems with tetrahedral me
Hi,
I think the issue is that your repeats don't match your domain and therefore your textile isn't periodic. I increased the size of the domain and you can see below that the repeat is far larger than the length of the yarns specified which means that there isn't continuity. Because of this the two surfaces on opposite sides of the domain don't match and TexGen can't generate periodic boundary conditions. It has generated faces E and F because these are the top and bottom surfaces which are all matrix and therefore match.
You need to make your repeat such that it matches the distance between the ends of your yarns and then, as long as the domain matches this, it should be able to create matching boundaries.
Hope that helps,
Louise
I think the issue is that your repeats don't match your domain and therefore your textile isn't periodic. I increased the size of the domain and you can see below that the repeat is far larger than the length of the yarns specified which means that there isn't continuity. Because of this the two surfaces on opposite sides of the domain don't match and TexGen can't generate periodic boundary conditions. It has generated faces E and F because these are the top and bottom surfaces which are all matrix and therefore match.
You need to make your repeat such that it matches the distance between the ends of your yarns and then, as long as the domain matches this, it should be able to create matching boundaries.
Hope that helps,
Louise
Re: periodic boundary condition peoblems with tetrahedral me
Thank you for your effective help, Louise!
According to you advice, I have solve the problem above, and got the tetrahedral mesh with periodical boundary conditions (PBC). The solution is to change the code
“Yarn.AddRepeat(XYZ(delta*35,0,0))
Yarn.AddRepeat(XYZ(0,delta*35,0))”
into
“Yarn.AddRepeat(XYZ(delta*17,0,0))
Yarn.AddRepeat(XYZ(0,delta*17,0))”.
Because we added 17segments in each yarn above.
The tetrahedral mesh is closer to the real geometrical shape than hexahedral mesh. But when I compare the simulation results between the two meshes, the stress distributions of matrix in hexahedral mesh accords with PBC, while those of tetrahedral mesh doesn’t accord with the PBC. And there are obvious stress concentration in the tetrahedral mesh, for example in the edges of matrix and yarn. The biggest Mises Stress of tetrahedral mesh (2.377E7) is 5.6 times of that of hexahedral mesh (4.271E6). Did you ever meet the same problem?
Xiuwei Yu
According to you advice, I have solve the problem above, and got the tetrahedral mesh with periodical boundary conditions (PBC). The solution is to change the code
“Yarn.AddRepeat(XYZ(delta*35,0,0))
Yarn.AddRepeat(XYZ(0,delta*35,0))”
into
“Yarn.AddRepeat(XYZ(delta*17,0,0))
Yarn.AddRepeat(XYZ(0,delta*17,0))”.
Because we added 17segments in each yarn above.
The tetrahedral mesh is closer to the real geometrical shape than hexahedral mesh. But when I compare the simulation results between the two meshes, the stress distributions of matrix in hexahedral mesh accords with PBC, while those of tetrahedral mesh doesn’t accord with the PBC. And there are obvious stress concentration in the tetrahedral mesh, for example in the edges of matrix and yarn. The biggest Mises Stress of tetrahedral mesh (2.377E7) is 5.6 times of that of hexahedral mesh (4.271E6). Did you ever meet the same problem?
Xiuwei Yu
- Attachments
-
- MeshComparison.jpg (251.17 KiB) Viewed 8520 times
Re: periodic boundary condition peoblems with tetrahedral me
Hi Xiuwei Yu,
it's difficult to see from the images what is going on. It could be that there are some distorted elements which are affecting things. You could try a quadratic mesh which might behave better.
It's difficult to see the circled area clearly. If the red portion is on the front face then it's possible that this would, in fact, be replicated on the next repeat of the unit cell. Are you sure that your boundary conditions are set up correctly?
Best regards,
Louise
it's difficult to see from the images what is going on. It could be that there are some distorted elements which are affecting things. You could try a quadratic mesh which might behave better.
It's difficult to see the circled area clearly. If the red portion is on the front face then it's possible that this would, in fact, be replicated on the next repeat of the unit cell. Are you sure that your boundary conditions are set up correctly?
Best regards,
Louise