]> SALOME platform Git repositories - tools/solverlab.git/commitdiff
Salome HOME
Test 3D Poisson on cube skin now works
authormichael <michael@localhost.localdomain>
Mon, 7 Jun 2021 18:11:56 +0000 (20:11 +0200)
committermichael <michael@localhost.localdomain>
Mon, 7 Jun 2021 18:11:56 +0000 (20:11 +0200)
CDMATH/tests/examples/Poisson3DCubeSkinEF/FiniteElements3DPoissonCubeSkin.py
CDMATH/tests/validation/Poisson/3DCubeSkinPoissonEF/test_validation3DCubeSkinPoissonEF.py
CDMATH/tests/validation/scripts/Poisson3DCubeSkinEF/FiniteElements3DPoissonCubeSkin.py

index 3573c2a8ff54b6c9d67270d515d2c0ed3642e232..e167456985a5b3bb92ea661371b12e82ed6deb55 100644 (file)
@@ -2,18 +2,15 @@
 #===============================================================================================================================
 # Name        : Résolution EF de l'équation de Laplace-Beltrami -\triangle u = f sur la frontière d'un cube
 # Author      : Michael Ndjinga
-# Copyright   : CEA Saclay 2020
+# Copyright   : CEA Saclay 2021
 # Description : Utilisation de la méthode des éléménts finis P1 avec champs u et f discrétisés aux noeuds d'un maillage triangulaire
 #               Création et sauvegarde du champ résultant ainsi que du champ second membre en utilisant la librairie CDMATH
 #               Résolution d'un système linéaire à matrice singulière : les vecteurs constants sont dans le noyau
-#               Comparaison de la solution numérique avec la solution exacte définie face par face :
-#                              u= sin(2*pi*x)*sin(2*pi*y) (haut et bas)
-#                              u=-sin(2*pi*x)*sin(2*pi*z) (gauche et droite)
-#                              u= sin(2*pi*y)*sin(2*pi*z) (avant et arrière)
+#               Comparaison de la solution numérique avec la solution exacte définie face par face : u(x,y,z)= cos(2*pi*x)*cos(2*pi*y)*cos(2*pi*z)
 #================================================================================================================================
 
 import cdmath
-from math import sin, pi
+from math import cos, pi
 import numpy as np
 import PV_routines
 import VTK_routines
@@ -49,14 +46,7 @@ for i in range(nbNodes):
        y = Ni.y()
        z = Ni.z()
 
-       if   abs(x)<eps or abs(x-1)<eps: #AVANT et ARRIERE
-               my_RHSfield[i]= 8*pi*pi*sin(2*pi*y)*sin(2*pi*z)
-       elif abs(y)<eps or abs(y-1)<eps: #GAUCHE et DROITE
-               my_RHSfield[i]=-8*pi*pi*sin(2*pi*x)*sin(2*pi*z) #Minus sign to have a smooth function of the curvilinear variable
-       elif abs(z)<eps or abs(z-1)<eps: #HAUT et BAS
-               my_RHSfield[i]= 8*pi*pi*sin(2*pi*x)*sin(2*pi*y)
-       else:
-               raise ValueError("Domain should be the unit cube skin with 6 faces")
+       my_RHSfield[i]= 8*pi*pi*cos(2*pi*x)*cos(2*pi*y)*cos(2*pi*z)
 
        if my_mesh.isBorderNode(i): # Détection des noeuds frontière
                raise ValueError("Mesh should not contain borders")
index 3fa8f81c7d92a3cb467522c90e3f638b08c8590b..7d2f71b26a21d13dca9cdd1f0b69dfbc4d16a000 100755 (executable)
@@ -26,16 +26,16 @@ def test_validation3DCubeSkinEF():
     # Storing of numerical errors and mesh sizes
     for filename in meshList:
         error_tab[i], mesh_size_tab[i], min_sol_num, max_sol_num, time_tab[i] =FiniteElements3DPoissonCubeSkin.solve(mesh_path+filename, resolution,meshType,testColor)
-        assert min_sol_num>-1.1 
-        assert max_sol_num<1.1
+        assert min_sol_num>-5. 
+        assert max_sol_num<6.
         error_tab[i]=log10(error_tab[i])
         time_tab[i]=log10(time_tab[i])
-        with open('./FiniteElementsOnCubeSkinPoisson_PlotOnSortedLines'+meshType+str(mesh_size_tab[i])+'.csv') as f:
-            lines = f.readlines()
-            y = [float(line.split(",")[0]) for line in lines[1:]]
-            x = [float(line.split(",")[1]) for line in lines[1:]]
+        with open('./FiniteElementsOnCubeSkinPoisson_PlotOnSortedLines'+meshType+str(mesh_size_tab[i])+'.csv') as f:
+            lines = f.readlines()
+            y = [float(line.split(",")[0]) for line in lines[1:]]
+            x = [float(line.split(",")[1]) for line in lines[1:]]
 
-        plt.plot(x, y, label= str(mesh_size_tab[i]) + ' nodes')
+        plt.plot(x, y, label= str(mesh_size_tab[i]) + ' nodes')
         mesh_size_tab[i] = 0.5*log10(mesh_size_tab[i])
         i=i+1
 
@@ -63,7 +63,7 @@ def test_validation3DCubeSkinEF():
     b=(-a2*b1+a1*b2)/det
     
     print( "FE on 3D cube skin triangle mesh : scheme order is ", -a)
-    assert abs(a+0.816)<0.1
+    assert abs(a+1.915)<0.001
 
     # Plot of convergence curves
     plt.close()
index 459337299b0be0567e8df3a2c585fb98fe878bf7..0bdca0a880849997674f230473a2a6a1517c7e2b 100755 (executable)
@@ -2,19 +2,16 @@
 #===============================================================================================================================
 # Name        : Résolution EF de l'équation de Laplace-Beltrami -\triangle u = f sur la frontière d'un cube
 # Author      : Michael Ndjinga
-# Copyright   : CEA Saclay 2020
+# Copyright   : CEA Saclay 2021
 # Description : Utilisation de la méthode des éléménts finis P1 avec champs u et f discrétisés aux noeuds d'un maillage triangulaire
 #               Création et sauvegarde du champ résultant ainsi que du champ second membre en utilisant la librairie CDMATH
 #               Résolution d'un système linéaire à matrice singulière : les vecteurs constants sont dans le noyau
-#               Comparaison de la solution numérique avec la solution exacte définie face par face :
-#                              u=sin(2*pi*x)*sin(2*pi*y) (haut et bas)
-#                              u=sin(2*pi*x)*sin(2*pi*z) (gauche et droite)
-#                              u=sin(2*pi*y)*sin(2*pi*z) (avant et arrière)
+#               Comparaison de la solution numérique avec la solution exacte définie face par face : u(x,y,z)= cos(2*pi*x)*cos(2*pi*y)*cos(2*pi*z)
 #================================================================================================================================
 
 import cdmath
 import time, json
-from math import sin, pi
+from math import cos, pi
 import PV_routines
 import VTK_routines
 import paraview.simple as pvs
@@ -74,14 +71,7 @@ def solve(filename,resolution,meshType, testColor):
         y = Ni.y()
         z = Ni.z()
     
-        if   abs(x)<eps or abs(x-1)<eps: #AVANT et ARRIERE
-            my_RHSfield[i]= 8*pi*pi*sin(2*pi*y)*sin(2*pi*z)
-        elif abs(y)<eps or abs(y-1)<eps: #GAUCHE et DROITE
-            my_RHSfield[i]=-8*pi*pi*sin(2*pi*x)*sin(2*pi*z) #Minus sign to have a smooth function of the curvilinear variable
-        elif abs(z)<eps or abs(z-1)<eps: #HAUT et BAS
-            my_RHSfield[i]= 8*pi*pi*sin(2*pi*x)*sin(2*pi*y)
-        else:
-            raise ValueError("Domain should be the unit cube skin with 6 faces")
+        my_RHSfield[i]= 8*pi*pi*cos(2*pi*x)*cos(2*pi*y)*cos(2*pi*z)
 
         if my_mesh.isBorderNode(i): # Détection des noeuds frontière
             raise ValueError("Mesh should not contain borders")
@@ -248,7 +238,7 @@ def solve(filename,resolution,meshType, testColor):
     finiteElementsOnCubeSkin_0vtuDisplay = pvs.Show(finiteElementsOnCubeSkin_0vtu, renderView1)
     pvs.ColorBy(finiteElementsOnCubeSkin_0vtuDisplay, ('POINTS', 'ResultField'))
     slice1Display = pvs.Show(slice1, renderView1)
-    pvs.SaveScreenshot("./FiniteElementsOnCubeSkinPoisson"+"_Slice_"+meshType+str(nbNodes)+'.png', magnification=1, quality=100, view=renderView1)
+    pvs.SaveScreenshot("./FiniteElementsOnCubeSkinPoisson"+"_Slice_"+meshType+str(nbNodes)+".png", magnification=1, quality=100, view=renderView1)
     plotOnSortedLines1 = pvs.PlotOnSortedLines(Input=slice1)
     pvs.SaveData('./FiniteElementsOnCubeSkinPoisson_PlotOnSortedLines'+meshType+str(nbNodes)+'.csv', proxy=plotOnSortedLines1)