diff --git a/examples/Freefem/projet_validation/cases/__init__.py b/examples/Freefem/projet_validation/cases/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/bar_1d/__init__.py b/examples/Freefem/projet_validation/cases/bar_1d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/validation/1D/freefem_bar_distributed.edp b/examples/Freefem/projet_validation/cases/bar_1d/freefem_bar_distributed.edp similarity index 100% rename from examples/Freefem/validation/1D/freefem_bar_distributed.edp rename to examples/Freefem/projet_validation/cases/bar_1d/freefem_bar_distributed.edp diff --git a/examples/Freefem/projet_validation/cases/bar_1d/params.json b/examples/Freefem/projet_validation/cases/bar_1d/params.json new file mode 100644 index 00000000..e6cf7f68 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/bar_1d/params.json @@ -0,0 +1,11 @@ +{ + +"length":1, +"nx":10, +"q": 1000, +"youngModulus": 1000, +"poissonRatio":0.3 + + + +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/bar_1d/run.py b/examples/Freefem/projet_validation/cases/bar_1d/run.py new file mode 100644 index 00000000..71cd4d67 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/bar_1d/run.py @@ -0,0 +1,71 @@ +""" +Cas 1D — Barre encastrée-libre, charge répartie. + +Toute la logique (paramètres, FreeFem, SOFA, solution analytique) est +encapsulée ici. Le notebook n'appelle que run_case(). +""" +import json +import os + +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner + +from .sofa_scene import sofaRun + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "Barre 1D — charge répartie" + +MATH_DESCRIPTION = """ +Équation forte : E·u''(x) + q = 0, avec u(0)=0 (encastrement) et u'(L)=0 (extrémité libre). +Solution analytique : u(x) = (q/E) · (L·x - x²/2) +""" + + +def _load_params(): + with open(os.path.join(HERE, "params.json")) as f: + return json.load(f) + + +def _u_exact(x, q, E, L): + return (q / E) * (L * x - x**2 / 2.0) + + +def run_case(): + """ + Exécute FreeFem et SOFA sur le cas 1D distribué, calcule la solution + analytique, et renvoie un dict de résultats prêt pour common.metrics + et common.plotting. + """ + cfg = _load_params() + length, nx = float(cfg["length"]), int(cfg["nx"]) + q = float(cfg["q"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + + # --- FreeFem++ --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_bar_distributed.edp")) + exports = runner.execute({ + "youngModulus": young_modulus, + "q": q, + "nx": nx, + "length": length, + }, verbosity=0) + x_ff, u_ff = exports["xcoords"], exports["u[]"] + + # --- SOFA --- + x_sofa, u_sofa = sofaRun( + length=length, q=q, + young_modulus=young_modulus, poisson_ratio=poisson_ratio, nx=nx, + ) + + # --- Analytique --- + u_ana = _u_exact(x_ff, q, young_modulus, length) + + return { + "label": LABEL, + "params": cfg, + "x_ff": x_ff, "u_ff": u_ff, + "x_sofa": x_sofa, "u_sofa": u_sofa, + "u_ana": u_ana, + } diff --git a/examples/Freefem/projet_validation/cases/bar_1d/sofa_scene.py b/examples/Freefem/projet_validation/cases/bar_1d/sofa_scene.py new file mode 100644 index 00000000..0ef7ef47 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/bar_1d/sofa_scene.py @@ -0,0 +1,179 @@ +""" +1D Bar Simulation - Distributed Load - SOFA Scene File + +Physical case: bar fixed at x=0 (Dirichlet), free at x=L, subject to a +uniform distributed load q per unit length (e.g. self-weight). + +Consistent nodal forces for a constant q on a uniform mesh of spacing h: + F_0 = q*h/2 (absorbed by the Dirichlet reaction, value irrelevant) + F_i = q*h for interior nodes + F_(N-1) = q*h/2 (free end) +""" +import json +import os +import sys +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + + +class DisplacementExporter(Sofa.Core.Controller): + + def __init__(self, dofs_node, output_file, *args, **kwargs): + super().__init__(*args, **kwargs) + self.dofs_node = dofs_node + self.output_file = output_file + self.x_initial = None + self.u_x = None + + def onSimulationInitDoneEvent(self, event): + self.x_initial = self.dofs_node.position.array().flatten().copy() + + def onAnimateEndEvent(self, event): + x_final = self.dofs_node.position.array().flatten() + self.u_x = x_final - self.x_initial + + with open(self.output_file, 'w') as f: + f.write(f"{'x_initial':>12} {'x_final':>12} {'u_x':>12}\n") + f.write("-" * 42 + "\n") + for xi, xf, ui in zip(self.x_initial, x_final, self.u_x): + f.write(f"{xi:12.6f} {xf:12.6f} {ui:12.6f}\n") + + +def _consistent_nodal_forces(q, h, nx): + + forces = [q * h] * nx + forces[0] = q * h / 2.0 + forces[-1] = q * h / 2.0 + return [[f] for f in forces] + + +def create_scene_args(rootNode, length, q, young_modulus, poisson_ratio, nx): + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Grid", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + h = length / (nx - 1) + + Grid = rootNode.addChild('Grid') + Grid.addObject('RegularGridTopology' + , name="grid" + , nx=nx, ny=1, nz=1 + , min=[0., 0., 0.] + , max=[length, 0., 0.]) + + with rootNode.addChild('Bar') as Bar: + Bar.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , warnWhenLineSearchFails=True + , maxNbIterationsNewton=1 + , maxNbIterationsLineSearch=1 + , lineSearchCoefficient=1 + , relativeSuccessiveStoppingThreshold=0 + , absoluteResidualStoppingThreshold=1e-7 + , absoluteEstimateDifferenceThreshold=1e-12 + , relativeInitialStoppingThreshold=1e-12 + , relativeEstimateDifferenceThreshold=0 + ) + + Bar.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Bar.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + Bar.addObject('EdgeSetTopologyContainer' + , name="topology" + , edges="@../Grid/grid.edges" + , position="@../Grid/grid.position") + + dofs = Bar.addObject('MechanicalObject' + , name="dofs" + , template="Vec1d" + , showObject=True + , showObjectScale=0.02) + + Bar.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template="Vec1d" + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Bar.addObject('FixedProjectiveConstraint', indices="0") + + Bar.addObject('ConstantForceField' + , name="DistributedLoad" + , indices=list(range(nx)) + , forces=_consistent_nodal_forces(q, h, nx)) + + os.makedirs(RESULTS_DIR, exist_ok=True) + exporter = rootNode.addObject( + DisplacementExporter( + dofs_node = dofs, + output_file = os.path.join(RESULTS_DIR, "sofa_distributed_results.txt"), + name = "exportCtrl" + ) + ) + + return rootNode, exporter + + +def _default_params_path(): + """params.json next to this script, regardless of CWD.""" + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params.json") + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , length=float(cfg["length"]) + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , nx=int(cfg["nx"])) + return rootNode + + +def sofaRun(length, q, young_modulus, poisson_ratio, nx): + root = Sofa.Core.Node("root") + _, exporter = create_scene_args(root + , length=length + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio + , nx=nx) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + return exporter.x_initial, exporter.u_x + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(length=float(cfg["length"]) + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , nx=int(cfg["nx"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_2d/__init__.py b/examples/Freefem/projet_validation/cases/case_2d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/__init__.py b/examples/Freefem/projet_validation/cases/case_2d/compression/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/beam2d_tri.msh b/examples/Freefem/projet_validation/cases/case_2d/compression/beam2d_tri.msh new file mode 100644 index 00000000..69c0bf53 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/compression/beam2d_tri.msh @@ -0,0 +1,330 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +5 +1 1 "Fixed" +1 2 "Bottom" +1 3 "Right" +1 4 "Top" +2 5 "Beam" +$EndPhysicalNames +$Nodes +105 +1 0 0 0 +2 1 0 0 +3 1 0.2 0 +4 0 0.2 0 +5 0 0.1500000000001384 0 +6 0 0.100000000000274 0 +7 0 0.05000000000013835 0 +8 0.04999999999989938 0 0 +9 0.09999999999981413 0 0 +10 0.1499999999997028 0 0 +11 0.1999999999995569 0 0 +12 0.2499999999994109 0 0 +13 0.299999999999265 0 0 +14 0.3499999999991191 0 0 +15 0.3999999999989731 0 0 +16 0.4499999999988272 0 0 +17 0.4999999999986921 0 0 +18 0.5499999999988131 0 0 +19 0.599999999998945 0 0 +20 0.6499999999990769 0 0 +21 0.6999999999992088 0 0 +22 0.7499999999993406 0 0 +23 0.7999999999994725 0 0 +24 0.8499999999996044 0 0 +25 0.8999999999997362 0 0 +26 0.9499999999998682 0 0 +27 1 0.04999999999988333 0 +28 1 0.0999999999997371 0 +29 1 0.1499999999998672 0 +30 0.9499999999997918 0.2 0 +31 0.8999999999995836 0.2 0 +32 0.849999999999653 0.2 0 +33 0.8 0.2 0 +34 0.7500000000003471 0.2 0 +35 0.7000000000006938 0.2 0 +36 0.6500000000010406 0.2 0 +37 0.6000000000013874 0.2 0 +38 0.5500000000017343 0.2 0 +39 0.5000000000020595 0.2 0 +40 0.450000000001873 0.2 0 +41 0.400000000001665 0.2 0 +42 0.3500000000014568 0.2 0 +43 0.3000000000012487 0.2 0 +44 0.2500000000010406 0.2 0 +45 0.2000000000008325 0.2 0 +46 0.1500000000006244 0.2 0 +47 0.1000000000004162 0.2 0 +48 0.0500000000002081 0.2 0 +49 0.05000000000013093 0.1500000000001248 0 +50 0.1000000000002657 0.1500000000001113 0 +51 0.150000000000394 0.1500000000000977 0 +52 0.2000000000005136 0.1500000000000841 0 +53 0.2500000000006332 0.1500000000000705 0 +54 0.3000000000007528 0.1500000000000571 0 +55 0.3500000000008724 0.1500000000000435 0 +56 0.4000000000009921 0.1500000000000299 0 +57 0.4500000000011116 0.1500000000000164 0 +58 0.5000000000012177 0.1500000000000028 0 +59 0.5500000000010041 0.1499999999999892 0 +60 0.6000000000007768 0.1499999999999757 0 +61 0.6500000000005497 0.1499999999999621 0 +62 0.7000000000003226 0.1499999999999486 0 +63 0.7500000000000955 0.149999999999935 0 +64 0.7999999999998681 0.1499999999999214 0 +65 0.849999999999641 0.1499999999999079 0 +66 0.8999999999996218 0.1499999999998944 0 +67 0.949999999999811 0.1499999999998808 0 +68 0.05000000000005374 0.1000000000002471 0 +69 0.1000000000001152 0.1000000000002203 0 +70 0.1500000000001636 0.1000000000001934 0 +71 0.2000000000001947 0.1000000000001666 0 +72 0.2500000000002258 0.1000000000001398 0 +73 0.3000000000002568 0.1000000000001129 0 +74 0.350000000000288 0.1000000000000861 0 +75 0.4000000000003191 0.1000000000000592 0 +76 0.4500000000003501 0.1000000000000324 0 +77 0.5000000000003757 0.1000000000000056 0 +78 0.5500000000002736 0.09999999999997869 0 +79 0.6000000000001662 0.09999999999995186 0 +80 0.6500000000000588 0.09999999999992504 0 +81 0.6999999999999513 0.09999999999989816 0 +82 0.7499999999998439 0.09999999999987133 0 +83 0.7999999999997363 0.09999999999984448 0 +84 0.8499999999996287 0.09999999999981764 0 +85 0.89999999999966 0.09999999999979081 0 +86 0.9499999999998299 0.09999999999976396 0 +87 0.04999999999997656 0.0500000000001256 0 +88 0.09999999999996464 0.05000000000011284 0 +89 0.1499999999999332 0.0500000000001001 0 +90 0.1999999999998758 0.05000000000008736 0 +91 0.2499999999998184 0.0500000000000746 0 +92 0.299999999999761 0.05000000000006185 0 +93 0.3499999999997035 0.0500000000000491 0 +94 0.3999999999996461 0.05000000000003635 0 +95 0.4499999999995887 0.0500000000000236 0 +96 0.4999999999995339 0.05000000000001084 0 +97 0.5499999999995435 0.04999999999999809 0 +98 0.5999999999995556 0.04999999999998535 0 +99 0.6499999999995678 0.04999999999997258 0 +100 0.6999999999995801 0.04999999999995983 0 +101 0.7499999999995923 0.04999999999994709 0 +102 0.7999999999996044 0.04999999999993435 0 +103 0.8499999999996166 0.04999999999992158 0 +104 0.8999999999996982 0.04999999999990884 0 +105 0.9499999999998492 0.04999999999989609 0 +$EndNodes +$Elements +208 +1 1 2 1 1 4 5 +2 1 2 1 1 5 6 +3 1 2 1 1 6 7 +4 1 2 1 1 7 1 +5 1 2 2 2 1 8 +6 1 2 2 2 8 9 +7 1 2 2 2 9 10 +8 1 2 2 2 10 11 +9 1 2 2 2 11 12 +10 1 2 2 2 12 13 +11 1 2 2 2 13 14 +12 1 2 2 2 14 15 +13 1 2 2 2 15 16 +14 1 2 2 2 16 17 +15 1 2 2 2 17 18 +16 1 2 2 2 18 19 +17 1 2 2 2 19 20 +18 1 2 2 2 20 21 +19 1 2 2 2 21 22 +20 1 2 2 2 22 23 +21 1 2 2 2 23 24 +22 1 2 2 2 24 25 +23 1 2 2 2 25 26 +24 1 2 2 2 26 2 +25 1 2 3 3 2 27 +26 1 2 3 3 27 28 +27 1 2 3 3 28 29 +28 1 2 3 3 29 3 +29 1 2 4 4 3 30 +30 1 2 4 4 30 31 +31 1 2 4 4 31 32 +32 1 2 4 4 32 33 +33 1 2 4 4 33 34 +34 1 2 4 4 34 35 +35 1 2 4 4 35 36 +36 1 2 4 4 36 37 +37 1 2 4 4 37 38 +38 1 2 4 4 38 39 +39 1 2 4 4 39 40 +40 1 2 4 4 40 41 +41 1 2 4 4 41 42 +42 1 2 4 4 42 43 +43 1 2 4 4 43 44 +44 1 2 4 4 44 45 +45 1 2 4 4 45 46 +46 1 2 4 4 46 47 +47 1 2 4 4 47 48 +48 1 2 4 4 48 4 +49 2 2 5 1 4 5 48 +50 2 2 5 1 48 5 49 +51 2 2 5 1 48 49 47 +52 2 2 5 1 47 49 50 +53 2 2 5 1 47 50 46 +54 2 2 5 1 46 50 51 +55 2 2 5 1 46 51 45 +56 2 2 5 1 45 51 52 +57 2 2 5 1 45 52 44 +58 2 2 5 1 44 52 53 +59 2 2 5 1 44 53 43 +60 2 2 5 1 43 53 54 +61 2 2 5 1 43 54 42 +62 2 2 5 1 42 54 55 +63 2 2 5 1 42 55 41 +64 2 2 5 1 41 55 56 +65 2 2 5 1 41 56 40 +66 2 2 5 1 40 56 57 +67 2 2 5 1 40 57 39 +68 2 2 5 1 39 57 58 +69 2 2 5 1 39 58 38 +70 2 2 5 1 38 58 59 +71 2 2 5 1 38 59 37 +72 2 2 5 1 37 59 60 +73 2 2 5 1 37 60 36 +74 2 2 5 1 36 60 61 +75 2 2 5 1 36 61 35 +76 2 2 5 1 35 61 62 +77 2 2 5 1 35 62 34 +78 2 2 5 1 34 62 63 +79 2 2 5 1 34 63 33 +80 2 2 5 1 33 63 64 +81 2 2 5 1 33 64 32 +82 2 2 5 1 32 64 65 +83 2 2 5 1 32 65 31 +84 2 2 5 1 31 65 66 +85 2 2 5 1 31 66 30 +86 2 2 5 1 30 66 67 +87 2 2 5 1 30 67 3 +88 2 2 5 1 3 67 29 +89 2 2 5 1 5 6 49 +90 2 2 5 1 49 6 68 +91 2 2 5 1 49 68 50 +92 2 2 5 1 50 68 69 +93 2 2 5 1 50 69 51 +94 2 2 5 1 51 69 70 +95 2 2 5 1 51 70 52 +96 2 2 5 1 52 70 71 +97 2 2 5 1 52 71 53 +98 2 2 5 1 53 71 72 +99 2 2 5 1 53 72 54 +100 2 2 5 1 54 72 73 +101 2 2 5 1 54 73 55 +102 2 2 5 1 55 73 74 +103 2 2 5 1 55 74 56 +104 2 2 5 1 56 74 75 +105 2 2 5 1 56 75 57 +106 2 2 5 1 57 75 76 +107 2 2 5 1 57 76 58 +108 2 2 5 1 58 76 77 +109 2 2 5 1 58 77 59 +110 2 2 5 1 59 77 78 +111 2 2 5 1 59 78 60 +112 2 2 5 1 60 78 79 +113 2 2 5 1 60 79 61 +114 2 2 5 1 61 79 80 +115 2 2 5 1 61 80 62 +116 2 2 5 1 62 80 81 +117 2 2 5 1 62 81 63 +118 2 2 5 1 63 81 82 +119 2 2 5 1 63 82 64 +120 2 2 5 1 64 82 83 +121 2 2 5 1 64 83 65 +122 2 2 5 1 65 83 84 +123 2 2 5 1 65 84 66 +124 2 2 5 1 66 84 85 +125 2 2 5 1 66 85 67 +126 2 2 5 1 67 85 86 +127 2 2 5 1 67 86 29 +128 2 2 5 1 29 86 28 +129 2 2 5 1 6 7 68 +130 2 2 5 1 68 7 87 +131 2 2 5 1 68 87 69 +132 2 2 5 1 69 87 88 +133 2 2 5 1 69 88 70 +134 2 2 5 1 70 88 89 +135 2 2 5 1 70 89 71 +136 2 2 5 1 71 89 90 +137 2 2 5 1 71 90 72 +138 2 2 5 1 72 90 91 +139 2 2 5 1 72 91 73 +140 2 2 5 1 73 91 92 +141 2 2 5 1 73 92 74 +142 2 2 5 1 74 92 93 +143 2 2 5 1 74 93 75 +144 2 2 5 1 75 93 94 +145 2 2 5 1 75 94 76 +146 2 2 5 1 76 94 95 +147 2 2 5 1 76 95 77 +148 2 2 5 1 77 95 96 +149 2 2 5 1 77 96 78 +150 2 2 5 1 78 96 97 +151 2 2 5 1 78 97 79 +152 2 2 5 1 79 97 98 +153 2 2 5 1 79 98 80 +154 2 2 5 1 80 98 99 +155 2 2 5 1 80 99 81 +156 2 2 5 1 81 99 100 +157 2 2 5 1 81 100 82 +158 2 2 5 1 82 100 101 +159 2 2 5 1 82 101 83 +160 2 2 5 1 83 101 102 +161 2 2 5 1 83 102 84 +162 2 2 5 1 84 102 103 +163 2 2 5 1 84 103 85 +164 2 2 5 1 85 103 104 +165 2 2 5 1 85 104 86 +166 2 2 5 1 86 104 105 +167 2 2 5 1 86 105 28 +168 2 2 5 1 28 105 27 +169 2 2 5 1 7 1 87 +170 2 2 5 1 87 1 8 +171 2 2 5 1 87 8 88 +172 2 2 5 1 88 8 9 +173 2 2 5 1 88 9 89 +174 2 2 5 1 89 9 10 +175 2 2 5 1 89 10 90 +176 2 2 5 1 90 10 11 +177 2 2 5 1 90 11 91 +178 2 2 5 1 91 11 12 +179 2 2 5 1 91 12 92 +180 2 2 5 1 92 12 13 +181 2 2 5 1 92 13 93 +182 2 2 5 1 93 13 14 +183 2 2 5 1 93 14 94 +184 2 2 5 1 94 14 15 +185 2 2 5 1 94 15 95 +186 2 2 5 1 95 15 16 +187 2 2 5 1 95 16 96 +188 2 2 5 1 96 16 17 +189 2 2 5 1 96 17 97 +190 2 2 5 1 97 17 18 +191 2 2 5 1 97 18 98 +192 2 2 5 1 98 18 19 +193 2 2 5 1 98 19 99 +194 2 2 5 1 99 19 20 +195 2 2 5 1 99 20 100 +196 2 2 5 1 100 20 21 +197 2 2 5 1 100 21 101 +198 2 2 5 1 101 21 22 +199 2 2 5 1 101 22 102 +200 2 2 5 1 102 22 23 +201 2 2 5 1 102 23 103 +202 2 2 5 1 103 23 24 +203 2 2 5 1 103 24 104 +204 2 2 5 1 104 24 25 +205 2 2 5 1 104 25 105 +206 2 2 5 1 105 25 26 +207 2 2 5 1 105 26 27 +208 2 2 5 1 27 26 2 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/freefem_beam2d_compression.edp b/examples/Freefem/projet_validation/cases/case_2d/compression/freefem_beam2d_compression.edp new file mode 100644 index 00000000..2b3bbf03 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/compression/freefem_beam2d_compression.edp @@ -0,0 +1,57 @@ +IMPORT "io.edp" +load "gmsh" + +DEFAULT (q, 100.0) +DEFAULT (youngModulus, 1000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam2d_tri.msh") +DEFAULT (planeStrain, 1) + + +real Q = $q; +real E = $youngModulus; +real nu = $poissonRatio; +int isPlaneStrain = $planeStrain; // 1 = plane strain, 0 = plane stress + + +real mu = E / (2.*(1.+nu)); +real lambda; +if (isPlaneStrain == 1) { + lambda = E*nu / ((1.+nu)*(1.-2.*nu)); // plane strain +} else { + lambda = E*nu / (1. - nu*nu); // plane stress +} + +// --- Mesh --- +mesh Th = gmshload("$meshFile"); + + +// --- FE space --- +fespace Vh(Th, P1); +Vh ux, uy, vx, vy; + +// Uniaxial compression traction (-Q, 0) applied on the right edge (label 3). +// Left edge (label 1) fully clamped: ux = uy = 0. +solve Elasticity([ux, uy], [vx, vy]) = + int2d(Th)( + lambda*(dx(ux)+dy(uy))*(dx(vx)+dy(vy)) + + 2.*mu*( dx(ux)*dx(vx) + dy(uy)*dy(vy) ) + + mu*( dy(ux)+dx(uy) )*( dy(vx)+dx(vy) ) + ) + - int1d(Th, 3)( -Q*vx ) + + on(1, ux=0, uy=0); + +Elasticity; + +exportArray(ux[]); +exportArray(uy[]); + + +real[int] xcoords(Th.nv), ycoords(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; +} + +exportArray(xcoords); +exportArray(ycoords); diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/params_beam2d_compression.json b/examples/Freefem/projet_validation/cases/case_2d/compression/params_beam2d_compression.json new file mode 100644 index 00000000..113099b3 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/compression/params_beam2d_compression.json @@ -0,0 +1,7 @@ +{ + +"q": 100, +"youngModulus": 1000, +"poissonRatio": 0.3 + +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/run.py b/examples/Freefem/projet_validation/cases/case_2d/compression/run.py new file mode 100644 index 00000000..c8cab1f3 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/compression/run.py @@ -0,0 +1,141 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .sofa_scene import sofaRun, read_gmsh_2d + +HERE = os.path.dirname(os.path.abspath(__file__)) + +_VALID_MODES = ("plane_strain", "plane_stress") + +LABEL_TEMPLATE = "2D — Compression (traction sur bord droit, {mode})" + +# Couche limite de Saint-Venant : le clampage exact en x=0 perturbe la +# solution de compression uniforme sur une distance de l'ordre de la +# hauteur H de la poutre. La comparaison analytique n'a de sens que pour +# x >= SAINT_VENANT_FACTOR * H. +SAINT_VENANT_FACTOR = 2.0 + +MATH_DESCRIPTION = f""" +Poutre 2D encastree en x=0 (bord "Fixed"), soumise a une traction uniforme +(-q, 0) sur le bord droit (x=L, label 3) -> compression uniaxiale. + + -div(sigma) = 0 dans Omega + sigma.n = (-q, 0) sur le bord Right (x=L) + u = 0 sur le bord Fixed (x=0) + +Mode choisi a l'appel de run_case(mode=...) : "plane_strain" (defaut) ou +"plane_stress" -- change a la fois le solveur (SOFA : template Vec3d/z=0 +verrouille vs Vec2d ; FreeFem : formule de lambda) ET la solution +analytique en champ lointain (les deux regimes ont une reponse elastique +differente sous chargement uniaxial) : + + plane strain : ux = -q(1-nu^2)/E * x uy = q*nu(1+nu)/E * y + plane stress : ux = -q/E * x uy = q*nu/E * y + +Valable seulement pour x >= {SAINT_VENANT_FACTOR:.1f}*H (effet Saint-Venant : +le clampage exact perturbe la solution pres du bord encastre). La +comparaison SOFA vs FreeFem, elle, reste valable sur tout le domaine. +""" + + +def _load_params(): + with open(os.path.join(HERE, "params_beam2d_compression.json")) as f: + return json.load(f) + + +def _mesh_path(): + return os.path.join(HERE, "beam2d_tri.msh") + + +def _pair_by_coordinates(x_a, y_a, x_b, y_b, tol=1e-6): + """Retourne perm tel que (x_b[perm], y_b[perm]) correspond noeud a + noeud a (x_a, y_a). Les deux maillages doivent partager le meme + ensemble de noeuds (ici : meme beam2d_tri.msh des deux cotes).""" + order_a = np.lexsort((y_a, x_a)) + order_b = np.lexsort((y_b, x_b)) + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def _analytical_far_field(x, y, q, E, nu, mode): + if mode == "plane_strain": + ux = -q * (1.0 - nu**2) / E * x + uy = q * nu * (1.0 + nu) / E * y + else: + ux = -q / E * x + uy = q * nu / E * y + return ux, uy + + +def run_case(mode="plane_strain"): + """ + Execute le cas 2D compression. + + mode : "plane_strain" (par defaut, template SOFA Vec3d, z=0 verrouille) + ou "plane_stress" (template SOFA Vec2d, elasticite 2D genuine). + """ + if mode not in _VALID_MODES: + raise ValueError(f"mode doit etre parmi {_VALID_MODES}, recu {mode!r}") + + cfg = _load_params() + q = float(cfg["q"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + mesh_file = _mesh_path() + + # --- FreeFem++ --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam2d_compression.edp")) + exports = runner.execute({ + 'q': q, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': mesh_file, + 'planeStrain': 1 if mode == "plane_strain" else 0, + }, verbosity=0) + x_ff = np.asarray(exports['xcoords']) + y_ff = np.asarray(exports['ycoords']) + ux_ff = np.asarray(exports['ux[]']) + uy_ff = np.asarray(exports['uy[]']) + + # --- SOFA --- + pos0_sofa, u_sofa = sofaRun(mesh_file=mesh_file, q=q, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio, + mode=mode) + x_sofa, y_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, x_ff, y_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm]]) + + # --- Champ analytique en zone lointaine (Saint-Venant), formule selon le mode --- + H = y_sofa.max() - y_sofa.min() + saint_venant_x = SAINT_VENANT_FACTOR * H + ux_an, uy_an = _analytical_far_field(x_sofa, y_sofa, q, young_modulus, poisson_ratio, mode) + u_far_field_ana = np.column_stack([ux_an, uy_an]) + + # Connectivite du maillage (utile pour le trace 2D : tripcolor) + _, triangles, _, _ = read_gmsh_2d(mesh_file) + + return { + "label": LABEL_TEMPLATE.format(mode=mode.replace("_", " ")), + "mode": mode, + "dim": 2, + "coords_ff": np.column_stack([x_sofa, y_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa]), + "u_sofa": u_sofa, + "u_ana": None, # pas de solution exacte sur tout le domaine (effet Saint-Venant) + "triangles": triangles, + "component_names": ["ux", "uy"], + # Specifique a ce cas : verification analytique en champ lointain + "u_far_field_ana": u_far_field_ana, + "saint_venant_x": saint_venant_x, + "vline_x": saint_venant_x, # utilise par plot_fields_2d pour tracer le seuil + } diff --git a/examples/Freefem/projet_validation/cases/case_2d/compression/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_2d/compression/sofa_scene.py new file mode 100644 index 00000000..c0c0002c --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/compression/sofa_scene.py @@ -0,0 +1,236 @@ +""" +2D Beam Simulation - Compression (traction on right edge) - P1 Triangles +Cross-validation SOFA vs FreeFEM, plus a far-field analytical check +(Saint-Venant boundary layer near the clamped edge). + +Physical labels in beam2d_tri.msh (Gmsh 2.2 format): + 1 = Fixed (x=0, boundary edges) -> Dirichlet + 2 = Bottom (y=0) + 3 = Right (x=L) -> traction (-q, 0) applied here + 4 = Top (y=H) + 5 = Beam (2D domain, triangles) + +Two regimes, selected via `mode` (same convention as distributed_load) : + - "plane_strain" : template="Vec3d", z locked at 0 via + PartialFixedProjectiveConstraint. + - "plane_stress" : template="Vec2d", genuine 2D elasticity, no z dof. +""" +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + +_VALID_MODES = ("plane_strain", "plane_stress") + + +def read_gmsh_2d(path): + with open(path) as f: + lines = f.read().splitlines() + + i = 0 + nodes = None + triangles = [] + fixed_nodes = set() + right_edges = [] + + while i < len(lines): + line = lines[i].strip() + if line == "$Nodes": + n = int(lines[i + 1]) + nodes = np.zeros((n, 2)) + for k in range(n): + parts = lines[i + 2 + k].split() + node_id = int(parts[0]) + nodes[node_id - 1, 0] = float(parts[1]) + nodes[node_id - 1, 1] = float(parts[2]) + i += 2 + n + elif line == "$Elements": + m = int(lines[i + 1]) + for k in range(m): + parts = lines[i + 2 + k].split() + elm_type = int(parts[1]) + n_tags = int(parts[2]) + physical = int(parts[3]) + node_ids = [int(x) - 1 for x in parts[3 + n_tags:]] + if elm_type == 2: + if physical == 5: + triangles.append(node_ids) + elif elm_type == 1: + if physical == 1: + fixed_nodes.update(node_ids) + elif physical == 3: + right_edges.append(node_ids) + i += 2 + m + else: + i += 1 + + triangles = np.array(triangles, dtype=int) + right_edges = np.array(right_edges, dtype=int) + fixed_idx = sorted(fixed_nodes) + return nodes, triangles, fixed_idx, right_edges + + +def consistent_nodal_forces_traction(nodes, edges, q): + """Consistent (1/2 per node) nodal forces for a constant traction + (-q, 0) per unit length, integrated over each boundary edge (P1).""" + N = len(nodes) + F = np.zeros((N, 2)) + for e in edges: + p0, p1 = nodes[e[0]], nodes[e[1]] + Le = np.linalg.norm(p1 - p0) + for nid in e: + F[nid, 0] += -q * Le / 2.0 + return F + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "beam2d_tri.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam2d_compression.json") + + +def create_scene_args(rootNode, mesh_file, q, young_modulus, poisson_ratio, mode="plane_strain"): + if mode not in _VALID_MODES: + raise ValueError(f"mode doit etre parmi {_VALID_MODES}, recu {mode!r}") + + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + nodes, triangles, fixed_idx, right_edges = read_gmsh_2d(mesh_file) + N = len(nodes) + tris_list = triangles.tolist() + F_nodal_2d = consistent_nodal_forces_traction(nodes, right_edges, q) + + if mode == "plane_strain": + template = "Vec3d" + positions = np.hstack([nodes, np.zeros((N, 1))]).tolist() + forces_list = np.hstack([F_nodal_2d, np.zeros((N, 1))]).tolist() + else: + template = "Vec2d" + positions = nodes.tolist() + forces_list = F_nodal_2d.tolist() + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position=positions + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TriangleSetTopologyContainer' + , name="topology" + , position="@dofs.position" + , triangles=tris_list) + Beam.addObject('TriangleSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + if mode == "plane_strain": + # Verrouille explicitement la direction z (en plus de z=0 initial) + Beam.addObject('PartialFixedProjectiveConstraint' + , name="zLock" + , fixedDirections=[0, 0, 1] + , indices=list(range(N))) + + Beam.addObject('ConstantForceField' + , name="CompressionLoad" + , indices=list(range(N)) + , forces=forces_list) + + return rootNode, dofs, np.array(positions) + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , mode=cfg.get("mode", "plane_strain")) + return rootNode + + +def sofaRun(mesh_file, q, young_modulus, poisson_ratio, mode="plane_strain"): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio + , mode=mode) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + if mode == "plane_strain": + u = pos_final[:, :2] - pos0[:, :2] + x0 = pos0[:, :2] + else: + u = pos_final - pos0 + x0 = pos0 + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, f"sofa_beam2d_compression_{mode}_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'ux':>12} {'uy':>12}\n") + f.write("-" * 54 + "\n") + for (xi, yi), (uxi, uyi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {uxi:12.6f} {uyi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , mode=cfg.get("mode", "plane_strain")) diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/__init__.py b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/beam2d_tri.msh b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/beam2d_tri.msh new file mode 100644 index 00000000..6f400f46 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/beam2d_tri.msh @@ -0,0 +1,330 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +5 +1 1 "Fixed" +1 2 "Bottom" +1 3 "Right" +1 4 "Top" +2 5 "Beam" +$EndPhysicalNames +$Nodes +105 +1 0 0 0 +2 1 0 0 +3 1 0.2 0 +4 0 0.2 0 +5 0 0.1500000000001384 0 +6 0 0.100000000000274 0 +7 0 0.05000000000013835 0 +8 0.04999999999989938 0 0 +9 0.09999999999981413 0 0 +10 0.1499999999997028 0 0 +11 0.1999999999995569 0 0 +12 0.2499999999994109 0 0 +13 0.299999999999265 0 0 +14 0.3499999999991191 0 0 +15 0.3999999999989731 0 0 +16 0.4499999999988272 0 0 +17 0.4999999999986921 0 0 +18 0.5499999999988131 0 0 +19 0.599999999998945 0 0 +20 0.6499999999990769 0 0 +21 0.6999999999992088 0 0 +22 0.7499999999993406 0 0 +23 0.7999999999994725 0 0 +24 0.8499999999996044 0 0 +25 0.8999999999997362 0 0 +26 0.9499999999998682 0 0 +27 1 0.04999999999988333 0 +28 1 0.0999999999997371 0 +29 1 0.1499999999998672 0 +30 0.9499999999997918 0.2 0 +31 0.8999999999995836 0.2 0 +32 0.849999999999653 0.2 0 +33 0.8 0.2 0 +34 0.7500000000003471 0.2 0 +35 0.7000000000006938 0.2 0 +36 0.6500000000010406 0.2 0 +37 0.6000000000013874 0.2 0 +38 0.5500000000017343 0.2 0 +39 0.5000000000020595 0.2 0 +40 0.450000000001873 0.2 0 +41 0.400000000001665 0.2 0 +42 0.3500000000014568 0.2 0 +43 0.3000000000012487 0.2 0 +44 0.2500000000010406 0.2 0 +45 0.2000000000008325 0.2 0 +46 0.1500000000006244 0.2 0 +47 0.1000000000004162 0.2 0 +48 0.0500000000002081 0.2 0 +49 0.04999999999997656 0.0500000000001256 0 +50 0.05000000000005374 0.1000000000002471 0 +51 0.05000000000013093 0.1500000000001248 0 +52 0.09999999999996464 0.05000000000011284 0 +53 0.1000000000001152 0.1000000000002203 0 +54 0.1000000000002657 0.1500000000001113 0 +55 0.1499999999999332 0.0500000000001001 0 +56 0.1500000000001636 0.1000000000001934 0 +57 0.150000000000394 0.1500000000000977 0 +58 0.1999999999998758 0.05000000000008735 0 +59 0.2000000000001947 0.1000000000001666 0 +60 0.2000000000005136 0.1500000000000841 0 +61 0.2499999999998183 0.0500000000000746 0 +62 0.2500000000002258 0.1000000000001398 0 +63 0.2500000000006332 0.1500000000000706 0 +64 0.299999999999761 0.05000000000006186 0 +65 0.3000000000002568 0.1000000000001129 0 +66 0.3000000000007528 0.150000000000057 0 +67 0.3499999999997035 0.0500000000000491 0 +68 0.350000000000288 0.1000000000000861 0 +69 0.3500000000008723 0.1500000000000435 0 +70 0.3999999999996461 0.05000000000003635 0 +71 0.4000000000003192 0.1000000000000592 0 +72 0.4000000000009921 0.1500000000000299 0 +73 0.4499999999995887 0.05000000000002358 0 +74 0.4500000000003502 0.1000000000000324 0 +75 0.4500000000011116 0.1500000000000164 0 +76 0.4999999999995339 0.05000000000001084 0 +77 0.5000000000003757 0.1000000000000055 0 +78 0.5000000000012177 0.1500000000000028 0 +79 0.5499999999995435 0.04999999999999809 0 +80 0.5500000000002736 0.09999999999997869 0 +81 0.5500000000010041 0.1499999999999893 0 +82 0.5999999999995558 0.04999999999998533 0 +83 0.6000000000001662 0.09999999999995185 0 +84 0.6000000000007768 0.1499999999999756 0 +85 0.6499999999995678 0.04999999999997259 0 +86 0.6500000000000588 0.099999999999925 0 +87 0.6500000000005497 0.1499999999999621 0 +88 0.6999999999995801 0.04999999999995983 0 +89 0.6999999999999513 0.09999999999989817 0 +90 0.7000000000003226 0.1499999999999485 0 +91 0.7499999999995923 0.04999999999994709 0 +92 0.7499999999998439 0.09999999999987133 0 +93 0.7500000000000955 0.149999999999935 0 +94 0.7999999999996044 0.04999999999993435 0 +95 0.7999999999997363 0.09999999999984449 0 +96 0.7999999999998681 0.1499999999999214 0 +97 0.8499999999996166 0.04999999999992158 0 +98 0.8499999999996287 0.09999999999981762 0 +99 0.8499999999996409 0.1499999999999079 0 +100 0.8999999999996982 0.04999999999990884 0 +101 0.89999999999966 0.09999999999979081 0 +102 0.8999999999996218 0.1499999999998944 0 +103 0.9499999999998492 0.04999999999989609 0 +104 0.9499999999998299 0.09999999999976394 0 +105 0.949999999999811 0.1499999999998808 0 +$EndNodes +$Elements +208 +1 1 2 1 1 4 5 +2 1 2 1 1 5 6 +3 1 2 1 1 6 7 +4 1 2 1 1 7 1 +5 1 2 2 2 1 8 +6 1 2 2 2 8 9 +7 1 2 2 2 9 10 +8 1 2 2 2 10 11 +9 1 2 2 2 11 12 +10 1 2 2 2 12 13 +11 1 2 2 2 13 14 +12 1 2 2 2 14 15 +13 1 2 2 2 15 16 +14 1 2 2 2 16 17 +15 1 2 2 2 17 18 +16 1 2 2 2 18 19 +17 1 2 2 2 19 20 +18 1 2 2 2 20 21 +19 1 2 2 2 21 22 +20 1 2 2 2 22 23 +21 1 2 2 2 23 24 +22 1 2 2 2 24 25 +23 1 2 2 2 25 26 +24 1 2 2 2 26 2 +25 1 2 3 3 2 27 +26 1 2 3 3 27 28 +27 1 2 3 3 28 29 +28 1 2 3 3 29 3 +29 1 2 4 4 3 30 +30 1 2 4 4 30 31 +31 1 2 4 4 31 32 +32 1 2 4 4 32 33 +33 1 2 4 4 33 34 +34 1 2 4 4 34 35 +35 1 2 4 4 35 36 +36 1 2 4 4 36 37 +37 1 2 4 4 37 38 +38 1 2 4 4 38 39 +39 1 2 4 4 39 40 +40 1 2 4 4 40 41 +41 1 2 4 4 41 42 +42 1 2 4 4 42 43 +43 1 2 4 4 43 44 +44 1 2 4 4 44 45 +45 1 2 4 4 45 46 +46 1 2 4 4 46 47 +47 1 2 4 4 47 48 +48 1 2 4 4 48 4 +49 2 2 5 1 1 8 7 +50 2 2 5 1 7 8 49 +51 2 2 5 1 7 49 6 +52 2 2 5 1 6 49 50 +53 2 2 5 1 6 50 5 +54 2 2 5 1 5 50 51 +55 2 2 5 1 5 51 4 +56 2 2 5 1 4 51 48 +57 2 2 5 1 8 9 49 +58 2 2 5 1 49 9 52 +59 2 2 5 1 49 52 50 +60 2 2 5 1 50 52 53 +61 2 2 5 1 50 53 51 +62 2 2 5 1 51 53 54 +63 2 2 5 1 51 54 48 +64 2 2 5 1 48 54 47 +65 2 2 5 1 9 10 52 +66 2 2 5 1 52 10 55 +67 2 2 5 1 52 55 53 +68 2 2 5 1 53 55 56 +69 2 2 5 1 53 56 54 +70 2 2 5 1 54 56 57 +71 2 2 5 1 54 57 47 +72 2 2 5 1 47 57 46 +73 2 2 5 1 10 11 55 +74 2 2 5 1 55 11 58 +75 2 2 5 1 55 58 56 +76 2 2 5 1 56 58 59 +77 2 2 5 1 56 59 57 +78 2 2 5 1 57 59 60 +79 2 2 5 1 57 60 46 +80 2 2 5 1 46 60 45 +81 2 2 5 1 11 12 58 +82 2 2 5 1 58 12 61 +83 2 2 5 1 58 61 59 +84 2 2 5 1 59 61 62 +85 2 2 5 1 59 62 60 +86 2 2 5 1 60 62 63 +87 2 2 5 1 60 63 45 +88 2 2 5 1 45 63 44 +89 2 2 5 1 12 13 61 +90 2 2 5 1 61 13 64 +91 2 2 5 1 61 64 62 +92 2 2 5 1 62 64 65 +93 2 2 5 1 62 65 63 +94 2 2 5 1 63 65 66 +95 2 2 5 1 63 66 44 +96 2 2 5 1 44 66 43 +97 2 2 5 1 13 14 64 +98 2 2 5 1 64 14 67 +99 2 2 5 1 64 67 65 +100 2 2 5 1 65 67 68 +101 2 2 5 1 65 68 66 +102 2 2 5 1 66 68 69 +103 2 2 5 1 66 69 43 +104 2 2 5 1 43 69 42 +105 2 2 5 1 14 15 67 +106 2 2 5 1 67 15 70 +107 2 2 5 1 67 70 68 +108 2 2 5 1 68 70 71 +109 2 2 5 1 68 71 69 +110 2 2 5 1 69 71 72 +111 2 2 5 1 69 72 42 +112 2 2 5 1 42 72 41 +113 2 2 5 1 15 16 70 +114 2 2 5 1 70 16 73 +115 2 2 5 1 70 73 71 +116 2 2 5 1 71 73 74 +117 2 2 5 1 71 74 72 +118 2 2 5 1 72 74 75 +119 2 2 5 1 72 75 41 +120 2 2 5 1 41 75 40 +121 2 2 5 1 16 17 73 +122 2 2 5 1 73 17 76 +123 2 2 5 1 73 76 74 +124 2 2 5 1 74 76 77 +125 2 2 5 1 74 77 75 +126 2 2 5 1 75 77 78 +127 2 2 5 1 75 78 40 +128 2 2 5 1 40 78 39 +129 2 2 5 1 17 18 76 +130 2 2 5 1 76 18 79 +131 2 2 5 1 76 79 77 +132 2 2 5 1 77 79 80 +133 2 2 5 1 77 80 78 +134 2 2 5 1 78 80 81 +135 2 2 5 1 78 81 39 +136 2 2 5 1 39 81 38 +137 2 2 5 1 18 19 79 +138 2 2 5 1 79 19 82 +139 2 2 5 1 79 82 80 +140 2 2 5 1 80 82 83 +141 2 2 5 1 80 83 81 +142 2 2 5 1 81 83 84 +143 2 2 5 1 81 84 38 +144 2 2 5 1 38 84 37 +145 2 2 5 1 19 20 82 +146 2 2 5 1 82 20 85 +147 2 2 5 1 82 85 83 +148 2 2 5 1 83 85 86 +149 2 2 5 1 83 86 84 +150 2 2 5 1 84 86 87 +151 2 2 5 1 84 87 37 +152 2 2 5 1 37 87 36 +153 2 2 5 1 20 21 85 +154 2 2 5 1 85 21 88 +155 2 2 5 1 85 88 86 +156 2 2 5 1 86 88 89 +157 2 2 5 1 86 89 87 +158 2 2 5 1 87 89 90 +159 2 2 5 1 87 90 36 +160 2 2 5 1 36 90 35 +161 2 2 5 1 21 22 88 +162 2 2 5 1 88 22 91 +163 2 2 5 1 88 91 89 +164 2 2 5 1 89 91 92 +165 2 2 5 1 89 92 90 +166 2 2 5 1 90 92 93 +167 2 2 5 1 90 93 35 +168 2 2 5 1 35 93 34 +169 2 2 5 1 22 23 91 +170 2 2 5 1 91 23 94 +171 2 2 5 1 91 94 92 +172 2 2 5 1 92 94 95 +173 2 2 5 1 92 95 93 +174 2 2 5 1 93 95 96 +175 2 2 5 1 93 96 34 +176 2 2 5 1 34 96 33 +177 2 2 5 1 23 24 94 +178 2 2 5 1 94 24 97 +179 2 2 5 1 94 97 95 +180 2 2 5 1 95 97 98 +181 2 2 5 1 95 98 96 +182 2 2 5 1 96 98 99 +183 2 2 5 1 96 99 33 +184 2 2 5 1 33 99 32 +185 2 2 5 1 24 25 97 +186 2 2 5 1 97 25 100 +187 2 2 5 1 97 100 98 +188 2 2 5 1 98 100 101 +189 2 2 5 1 98 101 99 +190 2 2 5 1 99 101 102 +191 2 2 5 1 99 102 32 +192 2 2 5 1 32 102 31 +193 2 2 5 1 25 26 100 +194 2 2 5 1 100 26 103 +195 2 2 5 1 100 103 101 +196 2 2 5 1 101 103 104 +197 2 2 5 1 101 104 102 +198 2 2 5 1 102 104 105 +199 2 2 5 1 102 105 31 +200 2 2 5 1 31 105 30 +201 2 2 5 1 26 2 103 +202 2 2 5 1 103 2 27 +203 2 2 5 1 103 27 104 +204 2 2 5 1 104 27 28 +205 2 2 5 1 104 28 105 +206 2 2 5 1 105 28 29 +207 2 2 5 1 105 29 30 +208 2 2 5 1 30 29 3 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/freefem_beam2d_distributed.edp b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/freefem_beam2d_distributed.edp new file mode 100644 index 00000000..0510802d --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/freefem_beam2d_distributed.edp @@ -0,0 +1,52 @@ +IMPORT "io.edp" +load "gmsh" + +DEFAULT (q, 1000.0) +DEFAULT (youngModulus, 1000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam2d_tri.msh") +DEFAULT (planeStrain, 1) + +real Q = $q; +real E = $youngModulus; +real nu = $poissonRatio; +int isPlaneStrain = $planeStrain; // 1 = plane strain, 0 = plane stress + +mesh Th = gmshload("$meshFile"); + +fespace Vh(Th, P1); +Vh ux, uy, vx, vy; + +// Lame coefficients +real lambda; +if (isPlaneStrain == 1) { + lambda = E*nu / ((1.+nu)*(1.-2.*nu)); // plane strain +} else { + lambda = E*nu / (1. - nu*nu); // plane stress +} +real mu = E / (2.*(1.+nu)); + + +problem Elasticity([ux, uy], [vx, vy]) = + int2d(Th)( + lambda*(dx(ux)+dy(uy))*(dx(vx)+dy(vy)) + + 2.*mu*(dx(ux)*dx(vx) + dy(uy)*dy(vy)) + + mu*(dy(ux)+dx(uy))*(dy(vx)+dx(vy)) + ) + - int2d(Th)( -Q*vy ) + + on(1, ux=0, uy=0); + +Elasticity; + +exportArray(ux[]); +exportArray(uy[]); + +// Node coordinates, in the same vertex order as ux[]/uy[], for coordinate-based pairing +real[int] xcoords(Th.nv); +real[int] ycoords(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; +} +exportArray(xcoords); +exportArray(ycoords); diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/params_beam2d_distributed.json b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/params_beam2d_distributed.json new file mode 100644 index 00000000..817dc50d --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/params_beam2d_distributed.json @@ -0,0 +1,7 @@ +{ + +"q": 1000, +"youngModulus": 1000, +"poissonRatio": 0.3 + +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/run.py b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/run.py new file mode 100644 index 00000000..2c243702 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/run.py @@ -0,0 +1,114 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .sofa_scene import sofaRun, read_gmsh_2d + +HERE = os.path.dirname(os.path.abspath(__file__)) + +MATH_DESCRIPTION = """ +Poutre 2D encastree en x=0 (bord "Fixed"), soumise a un chargement +volumique uniformement distribue (0, -q) sur tout le domaine. + + -div(sigma) = (0, -q) dans Omega + sigma = lambda*tr(eps)*I + 2*mu*eps + u = 0 sur le bord Fixed (x=0) + +mu = E / (2(1+nu)) (identique dans les deux modes) + plane strain : lambda = E*nu / ((1+nu)(1-2nu)) + plane stress : lambda = E*nu / (1-nu^2) + +Mode choisi a l'appel de run_case(mode=...) : "plane_strain" (defaut) ou +"plane_stress". Pas de solution analytique connue pour ce cas -> comparaison +SOFA vs FreeFem uniquement (cross-validation par RMS separement sur ux et uy). +""" + +_LAMBDA_STRAIN = "lambda = E*nu / ((1+nu)(1-2nu)) [plane strain]" +_LAMBDA_STRESS = "lambda = E*nu / (1-nu^2) [plane stress]" + +_VALID_MODES = ("plane_strain", "plane_stress") + + +def _load_params(): + with open(os.path.join(HERE, "params_beam2d_distributed.json")) as f: + return json.load(f) + + +def _mesh_path(): + return os.path.join(HERE, "beam2d_tri.msh") + + +def _pair_by_coordinates(x_a, y_a, x_b, y_b, tol=1e-6): + """Retourne perm tel que (x_b[perm], y_b[perm]) correspond noeud a + noeud a (x_a, y_a). Les deux maillages doivent partager le meme + ensemble de noeuds (ici : meme beam2d_tri.msh des deux cotes).""" + order_a = np.lexsort((y_a, x_a)) + order_b = np.lexsort((y_b, x_b)) + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def run_case(mode="plane_strain"): + """ + Execute le cas 2D charge distribuee. + + mode : "plane_strain" (par defaut, template SOFA Vec3d, z=0 impose) + ou "plane_stress" (template SOFA Vec2d, elasticite 2D genuine). + """ + if mode not in _VALID_MODES: + raise ValueError(f"mode doit etre parmi {_VALID_MODES}, recu {mode!r}") + + cfg = _load_params() + q = float(cfg["q"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + mesh_file = _mesh_path() + + # --- FreeFem++ --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam2d_distributed.edp")) + exports = runner.execute({ + 'q': q, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': mesh_file, + 'planeStrain': 1 if mode == "plane_strain" else 0, + }, verbosity=0) + x_ff = np.asarray(exports['xcoords']) + y_ff = np.asarray(exports['ycoords']) + ux_ff = np.asarray(exports['ux[]']) + uy_ff = np.asarray(exports['uy[]']) + + # --- SOFA (meme E, nu physiques ; seul le template Vec3d/Vec2d change) --- + pos0_sofa, u_sofa = sofaRun(mesh_file=mesh_file, q=q, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio, + mode=mode) + x_sofa, y_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, x_ff, y_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm]]) + + # Connectivite du maillage (utile pour le trace 2D : tripcolor) + _, triangles, _ = read_gmsh_2d(mesh_file) + + lambda_formula = _LAMBDA_STRAIN if mode == "plane_strain" else _LAMBDA_STRESS + + return { + "label": f"2D — Distributed load ({mode.replace('_', ' ')})", + "mode": mode, + "dim": 2, + "coords_ff": np.column_stack([x_sofa, y_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa]), + "u_sofa": u_sofa, + "u_ana": None, + "triangles": triangles, # connectivite, utilisee par plot_fields_2d + "component_names": ["ux", "uy"], + "lambda_formula": lambda_formula, + } diff --git a/examples/Freefem/projet_validation/cases/case_2d/distributed_load/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/sofa_scene.py new file mode 100644 index 00000000..91920c77 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/distributed_load/sofa_scene.py @@ -0,0 +1,241 @@ +""" +2D Beam Simulation - Distributed Load - P1 Triangles +Cross-validation SOFA vs FreeFEM (no analytical solution available for this case). + +Physical labels in beam2d_tri.msh (Gmsh 2.2 format): + 1 = Fixed (x=0, boundary edges) -> Dirichlet + 2 = Bottom (y=0) + 3 = Right (x=L) + 4 = Top (y=H) + 5 = Beam (2D domain, triangles) + +Two regimes, selected via `mode` : + - "plane_strain" : template="Vec3d" (z kept at 0), matches the validated + MMS pattern. + - "plane_stress" : template="Vec2d" (genuine 2D elasticity, no z dof), + matches the incompressibility MMS study convention + (dim="2d" -> Vec2d -> plane stress, dim="3d" -> Vec3d -> plane strain). + +Both use the same LinearSmallStrainFEMForceField; only the template and the +resulting position/force array shapes change. +""" +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + +_VALID_MODES = ("plane_strain", "plane_stress") + + +def read_gmsh_2d(path): + """Minimal Gmsh 2.2 ASCII reader. + + Returns: + nodes : (N,2) array of x,y coordinates, in file node-id order + (node id 1 -> row 0, etc.) + triangles : (M,3) int array of 0-based node indices, region 5 (Beam) + fixed_idx : sorted list of 0-based node indices on boundary label 1 (Fixed) + """ + with open(path) as f: + lines = f.read().splitlines() + + i = 0 + nodes = None + triangles = [] + fixed_nodes = set() + + while i < len(lines): + line = lines[i].strip() + if line == "$Nodes": + n = int(lines[i + 1]) + nodes = np.zeros((n, 2)) + for k in range(n): + parts = lines[i + 2 + k].split() + node_id = int(parts[0]) + nodes[node_id - 1, 0] = float(parts[1]) + nodes[node_id - 1, 1] = float(parts[2]) + i += 2 + n + elif line == "$Elements": + m = int(lines[i + 1]) + for k in range(m): + parts = lines[i + 2 + k].split() + elm_type = int(parts[1]) + n_tags = int(parts[2]) + physical = int(parts[3]) + node_ids = [int(x) - 1 for x in parts[3 + n_tags:]] + if elm_type == 2: # 3-node triangle + if physical == 5: + triangles.append(node_ids) + elif elm_type == 1: # 2-node line + if physical == 1: # Fixed + fixed_nodes.update(node_ids) + i += 2 + m + else: + i += 1 + + triangles = np.array(triangles, dtype=int) + fixed_idx = sorted(fixed_nodes) + return nodes, triangles, fixed_idx + + +def consistent_nodal_forces(nodes, triangles, q): + """Consistent (lumped, 1/3 per node) nodal forces for a constant body + force (0, -q) per unit volume, integrated over each triangle.""" + N = len(nodes) + F = np.zeros((N, 2)) + for tri in triangles: + pts = nodes[tri, :] + v1 = pts[1] - pts[0] + v2 = pts[2] - pts[0] + area = 0.5 * abs(v1[0] * v2[1] - v1[1] * v2[0]) + for nid in tri: + F[nid, 1] += -q * area / 3.0 + return F + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "beam2d_tri.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam2d_distributed.json") + + +def create_scene_args(rootNode, mesh_file, q, young_modulus, poisson_ratio, mode="plane_strain"): + if mode not in _VALID_MODES: + raise ValueError(f"mode doit etre parmi {_VALID_MODES}, recu {mode!r}") + + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + nodes, triangles, fixed_idx = read_gmsh_2d(mesh_file) + N = len(nodes) + tris_list = triangles.tolist() + F_nodal = consistent_nodal_forces(nodes, triangles, q) + + if mode == "plane_strain": + # z kept at 0 -> eps_zz = 0 imposed -> plane strain + template = "Vec3d" + positions = np.column_stack([nodes, np.zeros(N)]).tolist() + forces_list = [[F_nodal[i, 0], F_nodal[i, 1], 0.0] for i in range(N)] + else: + # genuine 2D elasticity, no z dof -> plane stress + template = "Vec2d" + positions = nodes.tolist() + forces_list = F_nodal.tolist() + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position=positions + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TriangleSetTopologyContainer' + , name="topology" + , position="@dofs.position" + , triangles=tris_list) + Beam.addObject('TriangleSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + Beam.addObject('ConstantForceField' + , name="DistributedLoad" + , indices=list(range(N)) + , forces=forces_list) + + return rootNode, dofs, np.array(positions) + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , mode=cfg.get("mode", "plane_strain")) + return rootNode + + +def sofaRun(mesh_file, q, young_modulus, poisson_ratio, mode="plane_strain"): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio + , mode=mode) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + if mode == "plane_strain": + u = pos_final[:, :2] - pos0[:, :2] # keep only ux, uy (drop the z=0 dof) + x0 = pos0[:, :2] + else: + u = pos_final - pos0 # already (N,2): ux, uy directly + x0 = pos0 + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, f"sofa_beam2d_distributed_{mode}_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'ux':>12} {'uy':>12}\n") + f.write("-" * 54 + "\n") + for (xi, yi), (uxi, uyi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {uxi:12.6f} {uyi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , mode=cfg.get("mode", "plane_strain")) diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/__init__.py b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/beam2d_tri.msh b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/beam2d_tri.msh new file mode 100644 index 00000000..69c0bf53 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/beam2d_tri.msh @@ -0,0 +1,330 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +5 +1 1 "Fixed" +1 2 "Bottom" +1 3 "Right" +1 4 "Top" +2 5 "Beam" +$EndPhysicalNames +$Nodes +105 +1 0 0 0 +2 1 0 0 +3 1 0.2 0 +4 0 0.2 0 +5 0 0.1500000000001384 0 +6 0 0.100000000000274 0 +7 0 0.05000000000013835 0 +8 0.04999999999989938 0 0 +9 0.09999999999981413 0 0 +10 0.1499999999997028 0 0 +11 0.1999999999995569 0 0 +12 0.2499999999994109 0 0 +13 0.299999999999265 0 0 +14 0.3499999999991191 0 0 +15 0.3999999999989731 0 0 +16 0.4499999999988272 0 0 +17 0.4999999999986921 0 0 +18 0.5499999999988131 0 0 +19 0.599999999998945 0 0 +20 0.6499999999990769 0 0 +21 0.6999999999992088 0 0 +22 0.7499999999993406 0 0 +23 0.7999999999994725 0 0 +24 0.8499999999996044 0 0 +25 0.8999999999997362 0 0 +26 0.9499999999998682 0 0 +27 1 0.04999999999988333 0 +28 1 0.0999999999997371 0 +29 1 0.1499999999998672 0 +30 0.9499999999997918 0.2 0 +31 0.8999999999995836 0.2 0 +32 0.849999999999653 0.2 0 +33 0.8 0.2 0 +34 0.7500000000003471 0.2 0 +35 0.7000000000006938 0.2 0 +36 0.6500000000010406 0.2 0 +37 0.6000000000013874 0.2 0 +38 0.5500000000017343 0.2 0 +39 0.5000000000020595 0.2 0 +40 0.450000000001873 0.2 0 +41 0.400000000001665 0.2 0 +42 0.3500000000014568 0.2 0 +43 0.3000000000012487 0.2 0 +44 0.2500000000010406 0.2 0 +45 0.2000000000008325 0.2 0 +46 0.1500000000006244 0.2 0 +47 0.1000000000004162 0.2 0 +48 0.0500000000002081 0.2 0 +49 0.05000000000013093 0.1500000000001248 0 +50 0.1000000000002657 0.1500000000001113 0 +51 0.150000000000394 0.1500000000000977 0 +52 0.2000000000005136 0.1500000000000841 0 +53 0.2500000000006332 0.1500000000000705 0 +54 0.3000000000007528 0.1500000000000571 0 +55 0.3500000000008724 0.1500000000000435 0 +56 0.4000000000009921 0.1500000000000299 0 +57 0.4500000000011116 0.1500000000000164 0 +58 0.5000000000012177 0.1500000000000028 0 +59 0.5500000000010041 0.1499999999999892 0 +60 0.6000000000007768 0.1499999999999757 0 +61 0.6500000000005497 0.1499999999999621 0 +62 0.7000000000003226 0.1499999999999486 0 +63 0.7500000000000955 0.149999999999935 0 +64 0.7999999999998681 0.1499999999999214 0 +65 0.849999999999641 0.1499999999999079 0 +66 0.8999999999996218 0.1499999999998944 0 +67 0.949999999999811 0.1499999999998808 0 +68 0.05000000000005374 0.1000000000002471 0 +69 0.1000000000001152 0.1000000000002203 0 +70 0.1500000000001636 0.1000000000001934 0 +71 0.2000000000001947 0.1000000000001666 0 +72 0.2500000000002258 0.1000000000001398 0 +73 0.3000000000002568 0.1000000000001129 0 +74 0.350000000000288 0.1000000000000861 0 +75 0.4000000000003191 0.1000000000000592 0 +76 0.4500000000003501 0.1000000000000324 0 +77 0.5000000000003757 0.1000000000000056 0 +78 0.5500000000002736 0.09999999999997869 0 +79 0.6000000000001662 0.09999999999995186 0 +80 0.6500000000000588 0.09999999999992504 0 +81 0.6999999999999513 0.09999999999989816 0 +82 0.7499999999998439 0.09999999999987133 0 +83 0.7999999999997363 0.09999999999984448 0 +84 0.8499999999996287 0.09999999999981764 0 +85 0.89999999999966 0.09999999999979081 0 +86 0.9499999999998299 0.09999999999976396 0 +87 0.04999999999997656 0.0500000000001256 0 +88 0.09999999999996464 0.05000000000011284 0 +89 0.1499999999999332 0.0500000000001001 0 +90 0.1999999999998758 0.05000000000008736 0 +91 0.2499999999998184 0.0500000000000746 0 +92 0.299999999999761 0.05000000000006185 0 +93 0.3499999999997035 0.0500000000000491 0 +94 0.3999999999996461 0.05000000000003635 0 +95 0.4499999999995887 0.0500000000000236 0 +96 0.4999999999995339 0.05000000000001084 0 +97 0.5499999999995435 0.04999999999999809 0 +98 0.5999999999995556 0.04999999999998535 0 +99 0.6499999999995678 0.04999999999997258 0 +100 0.6999999999995801 0.04999999999995983 0 +101 0.7499999999995923 0.04999999999994709 0 +102 0.7999999999996044 0.04999999999993435 0 +103 0.8499999999996166 0.04999999999992158 0 +104 0.8999999999996982 0.04999999999990884 0 +105 0.9499999999998492 0.04999999999989609 0 +$EndNodes +$Elements +208 +1 1 2 1 1 4 5 +2 1 2 1 1 5 6 +3 1 2 1 1 6 7 +4 1 2 1 1 7 1 +5 1 2 2 2 1 8 +6 1 2 2 2 8 9 +7 1 2 2 2 9 10 +8 1 2 2 2 10 11 +9 1 2 2 2 11 12 +10 1 2 2 2 12 13 +11 1 2 2 2 13 14 +12 1 2 2 2 14 15 +13 1 2 2 2 15 16 +14 1 2 2 2 16 17 +15 1 2 2 2 17 18 +16 1 2 2 2 18 19 +17 1 2 2 2 19 20 +18 1 2 2 2 20 21 +19 1 2 2 2 21 22 +20 1 2 2 2 22 23 +21 1 2 2 2 23 24 +22 1 2 2 2 24 25 +23 1 2 2 2 25 26 +24 1 2 2 2 26 2 +25 1 2 3 3 2 27 +26 1 2 3 3 27 28 +27 1 2 3 3 28 29 +28 1 2 3 3 29 3 +29 1 2 4 4 3 30 +30 1 2 4 4 30 31 +31 1 2 4 4 31 32 +32 1 2 4 4 32 33 +33 1 2 4 4 33 34 +34 1 2 4 4 34 35 +35 1 2 4 4 35 36 +36 1 2 4 4 36 37 +37 1 2 4 4 37 38 +38 1 2 4 4 38 39 +39 1 2 4 4 39 40 +40 1 2 4 4 40 41 +41 1 2 4 4 41 42 +42 1 2 4 4 42 43 +43 1 2 4 4 43 44 +44 1 2 4 4 44 45 +45 1 2 4 4 45 46 +46 1 2 4 4 46 47 +47 1 2 4 4 47 48 +48 1 2 4 4 48 4 +49 2 2 5 1 4 5 48 +50 2 2 5 1 48 5 49 +51 2 2 5 1 48 49 47 +52 2 2 5 1 47 49 50 +53 2 2 5 1 47 50 46 +54 2 2 5 1 46 50 51 +55 2 2 5 1 46 51 45 +56 2 2 5 1 45 51 52 +57 2 2 5 1 45 52 44 +58 2 2 5 1 44 52 53 +59 2 2 5 1 44 53 43 +60 2 2 5 1 43 53 54 +61 2 2 5 1 43 54 42 +62 2 2 5 1 42 54 55 +63 2 2 5 1 42 55 41 +64 2 2 5 1 41 55 56 +65 2 2 5 1 41 56 40 +66 2 2 5 1 40 56 57 +67 2 2 5 1 40 57 39 +68 2 2 5 1 39 57 58 +69 2 2 5 1 39 58 38 +70 2 2 5 1 38 58 59 +71 2 2 5 1 38 59 37 +72 2 2 5 1 37 59 60 +73 2 2 5 1 37 60 36 +74 2 2 5 1 36 60 61 +75 2 2 5 1 36 61 35 +76 2 2 5 1 35 61 62 +77 2 2 5 1 35 62 34 +78 2 2 5 1 34 62 63 +79 2 2 5 1 34 63 33 +80 2 2 5 1 33 63 64 +81 2 2 5 1 33 64 32 +82 2 2 5 1 32 64 65 +83 2 2 5 1 32 65 31 +84 2 2 5 1 31 65 66 +85 2 2 5 1 31 66 30 +86 2 2 5 1 30 66 67 +87 2 2 5 1 30 67 3 +88 2 2 5 1 3 67 29 +89 2 2 5 1 5 6 49 +90 2 2 5 1 49 6 68 +91 2 2 5 1 49 68 50 +92 2 2 5 1 50 68 69 +93 2 2 5 1 50 69 51 +94 2 2 5 1 51 69 70 +95 2 2 5 1 51 70 52 +96 2 2 5 1 52 70 71 +97 2 2 5 1 52 71 53 +98 2 2 5 1 53 71 72 +99 2 2 5 1 53 72 54 +100 2 2 5 1 54 72 73 +101 2 2 5 1 54 73 55 +102 2 2 5 1 55 73 74 +103 2 2 5 1 55 74 56 +104 2 2 5 1 56 74 75 +105 2 2 5 1 56 75 57 +106 2 2 5 1 57 75 76 +107 2 2 5 1 57 76 58 +108 2 2 5 1 58 76 77 +109 2 2 5 1 58 77 59 +110 2 2 5 1 59 77 78 +111 2 2 5 1 59 78 60 +112 2 2 5 1 60 78 79 +113 2 2 5 1 60 79 61 +114 2 2 5 1 61 79 80 +115 2 2 5 1 61 80 62 +116 2 2 5 1 62 80 81 +117 2 2 5 1 62 81 63 +118 2 2 5 1 63 81 82 +119 2 2 5 1 63 82 64 +120 2 2 5 1 64 82 83 +121 2 2 5 1 64 83 65 +122 2 2 5 1 65 83 84 +123 2 2 5 1 65 84 66 +124 2 2 5 1 66 84 85 +125 2 2 5 1 66 85 67 +126 2 2 5 1 67 85 86 +127 2 2 5 1 67 86 29 +128 2 2 5 1 29 86 28 +129 2 2 5 1 6 7 68 +130 2 2 5 1 68 7 87 +131 2 2 5 1 68 87 69 +132 2 2 5 1 69 87 88 +133 2 2 5 1 69 88 70 +134 2 2 5 1 70 88 89 +135 2 2 5 1 70 89 71 +136 2 2 5 1 71 89 90 +137 2 2 5 1 71 90 72 +138 2 2 5 1 72 90 91 +139 2 2 5 1 72 91 73 +140 2 2 5 1 73 91 92 +141 2 2 5 1 73 92 74 +142 2 2 5 1 74 92 93 +143 2 2 5 1 74 93 75 +144 2 2 5 1 75 93 94 +145 2 2 5 1 75 94 76 +146 2 2 5 1 76 94 95 +147 2 2 5 1 76 95 77 +148 2 2 5 1 77 95 96 +149 2 2 5 1 77 96 78 +150 2 2 5 1 78 96 97 +151 2 2 5 1 78 97 79 +152 2 2 5 1 79 97 98 +153 2 2 5 1 79 98 80 +154 2 2 5 1 80 98 99 +155 2 2 5 1 80 99 81 +156 2 2 5 1 81 99 100 +157 2 2 5 1 81 100 82 +158 2 2 5 1 82 100 101 +159 2 2 5 1 82 101 83 +160 2 2 5 1 83 101 102 +161 2 2 5 1 83 102 84 +162 2 2 5 1 84 102 103 +163 2 2 5 1 84 103 85 +164 2 2 5 1 85 103 104 +165 2 2 5 1 85 104 86 +166 2 2 5 1 86 104 105 +167 2 2 5 1 86 105 28 +168 2 2 5 1 28 105 27 +169 2 2 5 1 7 1 87 +170 2 2 5 1 87 1 8 +171 2 2 5 1 87 8 88 +172 2 2 5 1 88 8 9 +173 2 2 5 1 88 9 89 +174 2 2 5 1 89 9 10 +175 2 2 5 1 89 10 90 +176 2 2 5 1 90 10 11 +177 2 2 5 1 90 11 91 +178 2 2 5 1 91 11 12 +179 2 2 5 1 91 12 92 +180 2 2 5 1 92 12 13 +181 2 2 5 1 92 13 93 +182 2 2 5 1 93 13 14 +183 2 2 5 1 93 14 94 +184 2 2 5 1 94 14 15 +185 2 2 5 1 94 15 95 +186 2 2 5 1 95 15 16 +187 2 2 5 1 95 16 96 +188 2 2 5 1 96 16 17 +189 2 2 5 1 96 17 97 +190 2 2 5 1 97 17 18 +191 2 2 5 1 97 18 98 +192 2 2 5 1 98 18 19 +193 2 2 5 1 98 19 99 +194 2 2 5 1 99 19 20 +195 2 2 5 1 99 20 100 +196 2 2 5 1 100 20 21 +197 2 2 5 1 100 21 101 +198 2 2 5 1 101 21 22 +199 2 2 5 1 101 22 102 +200 2 2 5 1 102 22 23 +201 2 2 5 1 102 23 103 +202 2 2 5 1 103 23 24 +203 2 2 5 1 103 24 104 +204 2 2 5 1 104 24 25 +205 2 2 5 1 104 25 105 +206 2 2 5 1 105 25 26 +207 2 2 5 1 105 26 27 +208 2 2 5 1 27 26 2 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/freefem_beam3pt.edp b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/freefem_beam3pt.edp new file mode 100644 index 00000000..11fdb26e --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/freefem_beam3pt.edp @@ -0,0 +1,89 @@ +IMPORT "io.edp" +load "gmsh" + +DEFAULT (P, 100.0) +DEFAULT (youngModulus, 1000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam2d_tri.msh") +DEFAULT (planeStress, 0.0) // 0.0 = plane strain, 1.0 = plane stress + + +real Pload = $P; +real E = $youngModulus; +real nu = $poissonRatio; +real isPlaneStress = $planeStress; + +real mu = E / (2.*(1.+nu)); +// plane strain: lambda = E*nu / ((1+nu)*(1-2nu)) +// plane stress: lambda = E*nu / (1-nu^2) +real lambda = (isPlaneStress > 0.5) + ? E*nu / (1.-nu^2) + : E*nu / ((1.+nu)*(1.-2.*nu)); + +mesh Th = gmshload("$meshFile"); + +real Lbeam = 1.0; +real Hbeam = 0.2; +real tol = 1e-6; + +// =============== Locate the 3 nodes =============== +int iLeft = -1, iRight = -1, iLoad = -1; +for (int i = 0; i < Th.nv; i++) { + real xi = Th(i).x, yi = Th(i).y; + if (abs(xi - 0.0) < tol && abs(yi - 0.0) < tol) iLeft = i; + if (abs(xi - Lbeam) < tol && abs(yi - 0.0) < tol) iRight = i; + if (abs(xi - Lbeam/2.) < tol && abs(yi - Hbeam) < tol) iLoad = i; +} +if (iLeft < 0 || iRight < 0 || iLoad < 0) { + cout << "ERROR: could not locate one of the special nodes " + << "(iLeft=" << iLeft << ", iRight=" << iRight << ", iLoad=" << iLoad << ")" << endl; +} + + +fespace Wh(Th, [P1, P1]); +Wh [ux, uy], [vx, vy]; + +varf vElasticity([ux, uy], [vx, vy]) = + int2d(Th)( + lambda*(dx(ux)+dy(uy))*(dx(vx)+dy(vy)) + + 2.*mu*( dx(ux)*dx(vx) + dy(uy)*dy(vy) ) + + mu*( dy(ux)+dx(uy) )*( dy(vx)+dx(vy) ) + ); + +matrix A = vElasticity(Wh, Wh); +real[int] b(Wh.ndof); +b = 0.0; + + +b[2*iLoad + 1] -= Pload; + + +real tgv = 1e30; +// Left : (ux=0, uy=0) +A(2*iLeft, 2*iLeft) = tgv; b[2*iLeft] = 0.0; +A(2*iLeft + 1, 2*iLeft + 1) = tgv; b[2*iLeft + 1] = 0.0; +// Right: (uy=0 ) +A(2*iRight + 1, 2*iRight + 1) = tgv; b[2*iRight + 1] = 0.0; + +set(A, solver=sparsesolver); +real[int] sol = A^-1 * b; +ux[] = sol; + + +cout << "[sanity check] midspan deflection uy = " << uy(Lbeam/2., Hbeam) + << " (expected: negative)" << endl; + + +real[int] xcoords(Th.nv), ycoords(Th.nv); +real[int] uxOut(Th.nv), uyOut(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; + uxOut[i] = sol[2*i]; + uyOut[i] = sol[2*i + 1]; +} + +exportArray(uxOut); +exportArray(uyOut); +exportArray(xcoords); +exportArray(ycoords); diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/params_beam3pt.json b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/params_beam3pt.json new file mode 100644 index 00000000..45c095a5 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/params_beam3pt.json @@ -0,0 +1,8 @@ +{ + +"P": 10, +"youngModulus": 1000, +"poissonRatio": 0.3, +"planeType": "stress" + +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/run.py b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/run.py new file mode 100644 index 00000000..730d069f --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/run.py @@ -0,0 +1,132 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .sofa_scene import sofaRun, L, H + +HERE = os.path.dirname(os.path.abspath(__file__)) + +_VALID_MODES = ("plane_strain", "plane_stress") + +LABEL_TEMPLATE = "2D — 3-point bending ({mode})" + +MATH_DESCRIPTION = """ +Poutre 2D simplement appuyee (appui simple a gauche : ux=uy=0, appui a +rouleau a droite : uy=0), soumise a une charge ponctuelle P au milieu de +la face superieure (flexion 3 points). + +Mode choisi a l'appel de run_case(mode=...) : "plane_strain" (SOFA Vec3d, +FreeFem lambda=E*nu/((1+nu)(1-2nu))) ou "plane_stress" (SOFA Vec2d, +FreeFem lambda=E*nu/(1-nu^2)). + +Pas de solution analytique exacte 2D disponible -> comparaison SOFA vs +FreeFem par RMS (global + par composante), sur tout le domaine. + +Une verification Euler-Bernoulli de la fleche a mi-portee est aussi +fournie, a TITRE INDICATIF SEULEMENT : + w_EB = -P*L^3 / (48*E_eff*I), I = H^3/12 +Ce n'est PAS une cible de validation stricte : la poutre est courte et +epaisse (L/H = 5), donc les effets de cisaillement (non captes par +Euler-Bernoulli) et les concentrations de contrainte pres de l'appui/du +point de charge (non captees par une theorie de poutre 1D) creent un +ecart attendu avec la solution FEM 2D. Un ecart SOFA/EB n'est donc pas +un signe d'erreur. +""" + + +def _load_params(): + with open(os.path.join(HERE, "params_beam3pt.json")) as f: + return json.load(f) + + +def _pair_by_coordinates(x_a, y_a, x_b, y_b, tol=1e-6): + """Retourne perm tel que (x_b[perm], y_b[perm]) correspond noeud a + noeud a (x_a, y_a). Les deux maillages doivent partager le meme + ensemble de noeuds (ici : meme beam2d_tri.msh des deux cotes).""" + order_a = np.lexsort((y_a, x_a)) + order_b = np.lexsort((y_b, x_b)) + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def _eb_midspan_deflection(P, E, nu, mode): + """Fleche Euler-Bernoulli a mi-portee, indicative uniquement (voir + MATH_DESCRIPTION). Meme formule que comparaison_script2d_3pt.py.""" + I = H**3 / 12.0 + E_eff = E / (1.0 - nu**2) if mode == "plane_strain" else E + return -P * L**3 / (48.0 * E_eff * I) + + +def run_case(mode="plane_strain"): + """ + Execute le cas 2D flexion 3 points. + + mode : "plane_strain" (par defaut, template SOFA Vec3d, z=0 verrouille) + ou "plane_stress" (template SOFA Vec2d, elasticite 2D genuine). + """ + if mode not in _VALID_MODES: + raise ValueError(f"mode doit etre parmi {_VALID_MODES}, recu {mode!r}") + + plane_type = "strain" if mode == "plane_strain" else "stress" + + cfg = _load_params() + P = float(cfg["P"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + mesh_file = os.path.join(HERE, "beam2d_tri.msh") + + # --- FreeFem++ --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3pt.edp")) + exports = runner.execute({ + 'P': P, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': mesh_file, + 'planeStress': 1.0 if mode == "plane_stress" else 0.0, + }, verbosity=0) + x_ff = np.asarray(exports['xcoords']) + y_ff = np.asarray(exports['ycoords']) + ux_ff = np.asarray(exports['uxOut']) + uy_ff = np.asarray(exports['uyOut']) + + # --- SOFA --- + pos0_sofa, u_sofa, triangles = sofaRun(mesh_file=mesh_file, P=P, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio, + plane_type=plane_type) + x_sofa, y_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, x_ff, y_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm]]) + + # --- Verification Euler-Bernoulli (indicative) a mi-portee --- + mid_idx = np.argmin(np.abs(x_sofa - L / 2) + np.abs(y_sofa - H)) + w_sofa = u_sofa[mid_idx, 1] + w_ff = u_ff[mid_idx, 1] + w_eb = _eb_midspan_deflection(P, young_modulus, poisson_ratio, mode) + + return { + "label": LABEL_TEMPLATE.format(mode=mode.replace("_", " ")), + "mode": mode, + "dim": 2, + "coords_ff": np.column_stack([x_sofa, y_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa]), + "u_sofa": u_sofa, + "u_ana": None, # pas de solution 2D exacte, cf MATH_DESCRIPTION + "triangles": triangles, + "component_names": ["ux", "uy"], + # Specifique a ce cas : verification Euler-Bernoulli indicative + "eb_check": { + "w_sofa": w_sofa, + "w_ff": w_ff, + "w_eb": w_eb, + "ratio_sofa_eb": w_sofa / w_eb, + }, + } diff --git a/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/sofa_scene.py new file mode 100644 index 00000000..5b0ff899 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_2d/three_point_bending/sofa_scene.py @@ -0,0 +1,196 @@ +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + +L = 1.0 +H = 0.2 +TOL = 1e-3 + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "beam2d_tri.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3pt.json") + + +def create_scene_args(rootNode, mesh_file, P, young_modulus, poisson_ratio, plane_type="strain"): + assert plane_type in ("strain", "stress"), "plane_type must be 'strain' or 'stress'" + + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.Engine.Select", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" if plane_type == "strain" else "Vec2d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + loader = Beam.addObject('MeshGmshLoader' + , name="loader" + , filename=mesh_file) + + if template == "Vec2d": + # MeshGmshLoader always returns 3D positions (x, y, 0) - drop the + # redundant z column for the plane stress (Vec2d) formulation. + positions_3d = np.array(loader.position.toList()) + position_arg = positions_3d[:, :2].tolist() + else: + position_arg = "@loader.position" + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position=position_arg + , showObject=True + , showObjectScale=0.01) + + topology = Beam.addObject('TriangleSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TriangleSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + if template == "Vec3d": + # Plane strain: lock every node's z displacement to 0. + Beam.addObject('BoxROI' + , name="allNodesROI" + , box=[-TOL, -TOL, -TOL, L + TOL, H + TOL, TOL] + , drawBoxes=False) + Beam.addObject('PartialFixedProjectiveConstraint' + , name="zLock" + , fixedDirections=[0, 0, 1] + , indices="@allNodesROI.indices") + + # --- Left support: pin (ux=0, uy=0) --- + Beam.addObject('BoxROI' + , name="leftSupportROI" + , box=[-TOL, -TOL, -TOL, TOL, TOL, TOL] + , drawBoxes=True) + Beam.addObject('FixedProjectiveConstraint' + , name="leftSupport" + , indices="@leftSupportROI.indices") + + # --- Right support: roller (uy=0 only, ux free) --- + right_fixed_dirs = [0, 1, 0] if template == "Vec3d" else [0, 1] + Beam.addObject('BoxROI' + , name="rightSupportROI" + , box=[L - TOL, -TOL, -TOL, L + TOL, TOL, TOL] + , drawBoxes=True) + Beam.addObject('PartialFixedProjectiveConstraint' + , name="rightSupport" + , fixedDirections=right_fixed_dirs + , indices="@rightSupportROI.indices") + + # --- Load point: concentrated force (0, -P[, 0]) at midspan/top --- + force_vec = [0.0, -P, 0.0] if template == "Vec3d" else [0.0, -P] + Beam.addObject('BoxROI' + , name="loadROI" + , box=[L / 2 - TOL, H - TOL, -TOL, L / 2 + TOL, H + TOL, TOL] + , drawBoxes=True) + Beam.addObject('ConstantForceField' + , name="PointLoad" + , indices="@loadROI.indices" + , forces=[force_vec]) + + return rootNode, dofs, topology + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , P=float(cfg["P"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , plane_type=cfg.get("planeType", "strain")) + return rootNode + + +def sofaRun(mesh_file, P, young_modulus, poisson_ratio, plane_type="strain"): + root = Sofa.Core.Node("root") + _, dofs, topology = create_scene_args(root + , mesh_file=mesh_file + , P=P + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio + , plane_type=plane_type) + + Sofa.Simulation.init(root) + pos0 = np.array(dofs.position.toList()) + Sofa.Simulation.animate(root, root.dt.value) + pos_final = np.array(dofs.position.toList()) + + if plane_type == "strain": + u3 = pos_final - pos0 + u = u3[:, :2] + x0 = pos0[:, :2] + else: + u = pos_final - pos0 # (N,2): ux, uy directly, no z dof to drop + x0 = pos0 + + triangles = np.array(topology.triangles.toList()) + + mid_idx = np.argmin(np.abs(x0[:, 0] - L / 2) + np.abs(x0[:, 1] - H)) + print(f"[sanity check] midspan deflection uy = {u[mid_idx, 1]:.6e} " + f"(plane_type={plane_type}, expected: negative)") + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, f"sofa_beam3pt_{plane_type}_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'ux':>12} {'uy':>12}\n") + f.write("-" * 54 + "\n") + for (xi, yi), (uxi, uyi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {uxi:12.6f} {uyi:12.6f}\n") + + return x0, u, triangles + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , P=float(cfg["P"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"]) + , plane_type=cfg.get("planeType", "strain")) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/freefem_beam3d_circle_bending.edp b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/freefem_beam3d_circle_bending.edp new file mode 100644 index 00000000..7c9a6e12 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/freefem_beam3d_circle_bending.edp @@ -0,0 +1,56 @@ +IMPORT "io.edp" +load "msh3" +load "gmsh" + +DEFAULT (meshfile, "beam3d_circle_tet.msh") +DEFAULT (E, 210000.0) +DEFAULT (nu, 0.3) +DEFAULT (F, 1000.0) +DEFAULT (radius, 0.1) +DEFAULT (length, 1.0) + +real E = $E; +real nu = $nu; +real F = $F; +real radius = $radius; +real length = $length; + +real A = pi*radius^2; +real q = F/A; + +real lambda = E*nu/((1.+nu)*(1.-2.*nu)); +real mu = E/(2.*(1.+nu)); + + +mesh3 Th = gmshload3("$meshfile"); + + +fespace Vh(Th, P1); +Vh ux, uy, uz, vx, vy, vz; + +solve Elasticity([ux, uy, uz], [vx, vy, vz]) = + int3d(Th)( + lambda*(dx(ux)+dy(uy)+dz(uz))*(dx(vx)+dy(vy)+dz(vz)) + + mu*( 2.*dx(ux)*dx(vx) + 2.*dy(uy)*dy(vy) + 2.*dz(uz)*dz(vz) + + (dy(ux)+dx(uy))*(dy(vx)+dx(vy)) + + (dz(ux)+dx(uz))*(dz(vx)+dx(vz)) + + (dz(uy)+dy(uz))*(dz(vy)+dy(vz)) ) + ) + + int2d(Th, 2)( q*vy ) + + on(1, ux=0, uy=0, uz=0); + +exportArray(ux[]); +exportArray(uy[]); +exportArray(uz[]); + +real[int] xcoords(Th.nv); +real[int] ycoords(Th.nv); +real[int] zcoords(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; + zcoords[i] = Th(i).z; +} +exportArray(xcoords); +exportArray(ycoords); +exportArray(zcoords); diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/mesh_gen.py b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/mesh_gen.py new file mode 100644 index 00000000..0c0223d1 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/mesh_gen.py @@ -0,0 +1,70 @@ +import json +import os +import sys +import gmsh + +RESULTS_DIR = "results" + + +def generate_beam3D_circular_tet(length, radius, mesh_size, filename): + + gmsh.initialize() + gmsh.model.add("beam3d_circular_tet") + + disk_fixed = gmsh.model.occ.addDisk(0, 0, 0, radius, radius, + zAxis=[1, 0, 0], xAxis=[0, 1, 0]) + gmsh.model.occ.synchronize() + + + out = gmsh.model.occ.extrude([(2, disk_fixed)], length, 0, 0) + gmsh.model.occ.synchronize() + + vol_tag = [e[1] for e in out if e[0] == 3][0] + surf_tags = [e[1] for e in out if e[0] == 2] + + disk_loaded = None + lateral = None + for s in surf_tags: + xmin, ymin, zmin, xmax, ymax, zmax = gmsh.model.occ.getBoundingBox(2, s) + if abs(xmax - xmin) < 1e-6: + disk_loaded = s + else: + lateral = s + + assert disk_loaded is not None and lateral is not None, \ + "Could not identify end cap" + + gmsh.model.addPhysicalGroup(2, [disk_fixed], tag=1, name="Fixed") + gmsh.model.addPhysicalGroup(2, [disk_loaded], tag=2, name="Loaded") + gmsh.model.addPhysicalGroup(2, [lateral], tag=3, name="Lateral") + gmsh.model.addPhysicalGroup(3, [vol_tag], tag=4, name="Beam") + + gmsh.model.mesh.setSize(gmsh.model.getEntities(0), mesh_size) + + gmsh.model.mesh.generate(3) + gmsh.model.mesh.setOrder(1) + _, node_coords, _ = gmsh.model.mesh.getNodes() + + os.makedirs(RESULTS_DIR, exist_ok=True) + msh_path = os.path.join(RESULTS_DIR, filename) + gmsh.option.setNumber("Mesh.MshFileVersion", 2.2) + gmsh.write(msh_path) + gmsh.finalize() + + return msh_path, len(node_coords) // 3 + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else "params.json" + with open(config_file) as f: + all_cfg = json.load(f) + cfg = all_cfg["beam3d_circle_tet"] + + msh_path, n_nodes = generate_beam3D_circular_tet( + length=float(cfg["length"]), + radius=float(cfg["radius"]), + mesh_size=float(cfg["mesh_size"]), + filename=cfg.get("meshfile"), + ) + print("Wrote:", msh_path) + print("Number of nodes:", n_nodes) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_beam3d_circle_bending.json b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_beam3d_circle_bending.json new file mode 100644 index 00000000..fba09028 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_beam3d_circle_bending.json @@ -0,0 +1,8 @@ +{ + "length": 1.0, + "radius": 0.1, + "youngModulus": 210000.0, + "poissonRatio": 0.3, + "q": 150.9154943, + "exclusionFactor": 2.0 +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_mesh.json b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_mesh.json new file mode 100644 index 00000000..2e2cae32 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/params_mesh.json @@ -0,0 +1,8 @@ +{ + "beam3d_circle_tet": { + "length": 1.0, + "radius": 0.1, + "mesh_size": 0.05, + "meshfile": "beam3d_circle_tet.msh" +} +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/results/beam3d_circle_tet.msh b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/results/beam3d_circle_tet.msh new file mode 100644 index 00000000..6adc84a8 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/results/beam3d_circle_tet.msh @@ -0,0 +1,2668 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +4 +2 1 "Fixed" +2 2 "Loaded" +2 3 "Lateral" +3 4 "Beam" +$EndPhysicalNames +$Nodes +453 +1 0 0.1 0 +2 1 0.1 0 +3 0 0.088545602565321 0.04647231720437685 +4 0 0.05680647467311559 0.08229838658936564 +5 0 0.01205366802553232 0.0992708874098054 +6 0 -0.03546048870425355 0.09350162426854149 +7 0 -0.07485107481711009 0.06631226582407955 +8 0 -0.0970941817426052 0.02393156642875581 +9 0 -0.09709418174260522 -0.02393156642875574 +10 0 -0.07485107481711013 -0.06631226582407949 +11 0 -0.03546048870425359 -0.09350162426854147 +12 0 0.01205366802553223 -0.09927088740980541 +13 0 0.05680647467311556 -0.08229838658936567 +14 0 0.08854560256532096 -0.04647231720437692 +15 0.05 0.1 0 +16 0.1 0.1 0 +17 0.15 0.1 0 +18 0.2 0.1 0 +19 0.25 0.1 0 +20 0.3 0.1 0 +21 0.35 0.1 0 +22 0.4 0.1 0 +23 0.45 0.1 0 +24 0.5 0.1 0 +25 0.55 0.1 0 +26 0.6 0.1 0 +27 0.65 0.1 0 +28 0.7 0.1 0 +29 0.75 0.1 0 +30 0.8 0.1 0 +31 0.85 0.1 0 +32 0.9 0.1 0 +33 0.95 0.1 0 +34 1 0.088545602565321 0.04647231720437685 +35 1 0.05680647467311559 0.08229838658936564 +36 1 0.01205366802553232 0.0992708874098054 +37 1 -0.03546048870425355 0.09350162426854149 +38 1 -0.07485107481711009 0.06631226582407955 +39 1 -0.0970941817426052 0.02393156642875581 +40 1 -0.09709418174260522 -0.02393156642875574 +41 1 -0.07485107481711013 -0.06631226582407949 +42 1 -0.03546048870425359 -0.09350162426854147 +43 1 0.01205366802553223 -0.09927088740980541 +44 1 0.05680647467311556 -0.08229838658936567 +45 1 0.08854560256532096 -0.04647231720437692 +46 0 0.05903474758501662 -0.01508958080940203 +47 0 -0.0492698659733555 0.02585882046984534 +48 0 -0.006707081897908891 -0.05523778907178359 +49 0 0.02248904019415254 0.05242633510007481 +50 0 -0.04926986597335551 -0.0258588204698453 +51 0 -0.04157212784815703 -0.06022762490856246 +52 0 -0.01118075978364661 -0.007009767007613534 +53 0 -0.004613279163841614 0.03040663489853741 +54 0 0.02382287111292555 -0.03041862635662273 +55 0 0.02540110428852566 0.0086268742639045 +56 0 0.05871282821768856 0.02912238872471996 +57 0 -0.02160866673981265 0.06129609466181399 +58 0 0.05297152495156948 -0.04790590352414643 +59 0 -0.07318202385798035 2.575175938670205e-17 +60 0 0.02647850445689395 -0.06531239184665578 +61 0.525 0.09062500000002606 -0.04227421643265879 +62 0.325 0.09062500000002606 -0.04227421643265879 +63 0.7247321929054121 0.0906014768281314 -0.04232460745903702 +64 0.2249088558909533 0.0906489382497534 0.04222286103750427 +65 0.3749610379574955 0.09047909499018243 0.04258560049779204 +66 0.5246955176948944 0.09051631449690881 0.0425064325708086 +67 0.675 0.09062499999998612 0.04227421643274441 +68 0.03666694290009229 -0.08891669253546225 -0.04575829748312402 +69 0.9609644721730408 -0.08854944395130865 0.04646499731963891 +70 0.9586512897969375 -0.05680647467311559 -0.08229838658936564 +71 0.04544577857965489 -0.05560921000961699 0.08311206748785832 +72 0.175 0.09062499999999643 -0.04227421643272229 +73 0.825 0.09062500000000127 0.04227421643271193 +74 0.8248931136068336 0.09059133196679657 -0.0423463171064694 +75 0.625 0.09062499999999224 -0.04227421643273131 +76 0.425 0.09062500000002155 -0.04227421643266845 +77 0.1250009001578968 0.09070593679524616 0.0421002735157007 +78 0.9586512897969832 0.03546048870425347 -0.09350162426854153 +79 0.04164187172384426 0.03191073153718672 -0.09477185875966344 +80 0.9658904809486353 0.03481410377083859 0.09374421677433378 +81 0.03827501585519767 0.03080415301980048 0.09513729109414834 +82 0.925 0.09062499999911637 -0.04227421643460893 +83 0.07500000000000001 0.09062499999911637 -0.04227421643460893 +84 0.925 0.09062500000013259 0.04227421643243041 +85 0.6752320498676275 0.09068291833657185 -0.04214983181416791 +86 0.7000624132814768 0.06466582215711908 -0.0762779879437302 +87 0.7498988332380633 0.06456123959783609 -0.07636652631612101 +88 0.7245421674008413 0.02693135541666405 -0.09630525476536221 +89 0.7737433283748976 0.02668491551283694 -0.09637383090898044 +90 0.7489053100394862 -0.01566799335109586 -0.09876494309394411 +91 0.6996276966443704 -0.01543037628960932 -0.09880234555698091 +92 0.7978687571129536 -0.01599341965472191 -0.09871276780512213 +93 0.7731820383046505 -0.05534604550484238 -0.08328754556940622 +94 0.8219497588039285 -0.05546759337657525 -0.08320664687998734 +95 0.7974721447078672 -0.0849173709008768 -0.05281136354311375 +96 0.7484732708638802 -0.08479806616815706 -0.0530027166675526 +97 0.7726817758717098 -0.09915825531423005 -0.01294760221191441 +98 0.723603664743387 -0.0991347233870216 -0.01312656158248281 +99 0.748037999754442 -0.09555798350608255 0.02947323850972701 +100 0.6987582308766007 -0.09561984135551542 0.02927193090908189 +101 0.7972300695270704 -0.09548572355816019 0.02970650764688798 +102 0.7724706792186732 -0.07458083013967907 0.0666160624450015 +103 0.8216014995405123 -0.07439996384557944 0.06681800191397878 +104 0.8463572140533971 -0.08507202158464294 -0.05256187918541388 +105 0.7969374523856195 -0.03998649918829657 0.09165740495270613 +106 0.747656015441033 -0.04010951759187911 0.0916036385660894 +107 0.8460065238346298 -0.03987458816960292 0.09170614602252437 +108 0.8468668197836117 -0.01633624148899725 -0.09865661262182665 +109 0.6742960383492299 -0.09909733869241022 -0.01340587423787565 +110 0.6493989625512538 -0.09568123809520412 0.02907061534554882 +111 0.6248877393899903 -0.09905869030996697 -0.01368853074928267 +112 0.6000089224118225 -0.09574425161895329 0.02886240256677464 +113 0.5753855130989914 -0.09901889312999121 -0.01397350361617946 +114 0.550573609813195 -0.09596093641822531 0.02813358636465177 +115 0.5258216682620488 -0.09897904773116778 -0.01425300355122426 +116 0.5006958271755022 -0.09606902327249559 0.02776225436575175 +117 0.4762459976751384 -0.09893412377097968 -0.01456156425898242 +118 0.4512708480514874 -0.09617122963647042 0.02740610498062934 +119 0.4267028039134228 -0.09888914180390823 -0.0148639709797392 +120 0.4013884415242719 -0.09623494179536446 0.0271815374407486 +121 0.3771162807477543 -0.09884511279475673 -0.01515399869974323 +122 0.352014732682948 -0.09632756704543945 0.02685143994474727 +123 0.3275273708654057 -0.09880860296755857 -0.01539025599525153 +124 0.302576677150529 -0.09629414647479811 0.0269710465998286 +125 0.2782127946004221 -0.09878183414901842 -0.01556114527134232 +126 0.253409221529746 -0.096345761825942 0.0267860817996746 +127 0.2289172588985519 -0.09875851994739632 -0.01570842887750794 +128 0.2044180140992862 -0.09644522694681602 0.02642571094932269 +129 0.2537171581342478 -0.08332970073002993 -0.05528255580419242 +130 0.2046702979030801 -0.0832344981037863 -0.05542579115728341 +131 0.2776077874154967 -0.07618728704380684 0.06477265852892394 +132 0.4240569955268227 -0.07699436747042367 0.06381118536612031 +133 0.6002183681181599 -0.08427335189967741 -0.05383309539301208 +134 0.6294270633228001 -0.07540663365380589 0.06567982643857026 +135 0.3526692694488349 -0.08339122563532846 -0.05518970453841676 +136 0.4516568605179293 -0.08365503178598344 -0.05478901036600407 +137 0.2292773109461138 -0.0528929332046538 -0.08486658716484381 +138 0.1803495240305886 -0.05276705530766342 -0.08494491081964822 +139 0.5234245126049405 -0.0767614566080424 0.06409117551903402 +140 0.1558352619409007 -0.08308694493319645 -0.05564673918270488 +141 0.131576980445584 -0.05267925330461507 -0.08499938982879938 +142 0.7721829027016203 0.001902972432155912 0.09998189184008499 +143 0.2049582842160574 -0.01281596285367196 -0.09917535528614607 +144 0.2541131259752866 -0.01295335803967707 -0.09915750357636044 +145 0.722723305071527 0.001775964381053817 0.0999842285088865 +146 0.2296409253779692 0.02953987309665257 -0.09553740574996614 +147 0.7473590501439606 0.04357796970494957 0.09000533626621535 +148 0.8703053954109863 -0.07414235675426961 0.06710373264523078 +149 0.8947588444202585 -0.0397014198956771 0.09178124676788356 +150 0.8703066061185374 0.001296205695217692 0.09999159890108611 +151 0.2789672212037499 0.02936778057740318 -0.09559044650987619 +152 0.3034188721787029 -0.01318774803595798 -0.0991266023917903 +153 0.6984923938029713 -0.04039727276896418 0.09147710288826327 +154 0.6731578479774077 0.001598013646085534 0.09998723094669101 +155 0.328259286727802 0.0290991827147477 -0.0956725538769282 +156 0.3528409357716168 -0.0134439178665752 -0.09909218471906239 +157 0.3774832308994978 0.0289057384805023 -0.09573117717283544 +158 0.402296027414197 -0.01369189586101478 -0.09905822524016432 +159 0.4269566404967688 0.02875624228642785 -0.09577618978412254 +160 0.4517812488109106 -0.01399210086594966 -0.0990162669128517 +161 0.4764849461597911 0.02845342168412643 -0.09586658852001194 +162 0.5012831885587484 -0.01419683775280103 -0.09898711935307869 +163 0.52598312885278 0.02831592942135774 -0.09590728930068187 +164 0.5507429643292465 -0.01444894809045619 -0.09895063364667911 +165 0.5755715787931375 0.02807899699600199 -0.0959769239333003 +166 0.600232769058864 -0.01469971307616794 -0.09891369185041239 +167 0.625161221771425 0.02780215099729346 -0.09605748487194371 +168 0.180357708111076 0.02974196587615833 -0.09547468494748457 +169 0.5258217444268484 -0.05445515199553377 -0.08387273943984014 +170 0.2542892890625685 0.06576713275512143 -0.07533050012558151 +171 0.792194306504495 0.04288275405199386 0.09033863738686899 +172 0.1118391256429288 -0.08272182357873575 -0.05618807617109274 +173 0.1311475248033561 -0.09859844232565002 -0.01668373971732563 +174 0.08549152706759754 -0.05285725499598931 -0.08488881312804981 +175 0.1074539593955709 -0.01326051613915361 -0.09911689417916225 +176 0.7720458362426075 0.07737175716454675 0.06335306774948164 +177 0.08265394967134061 -0.09855651823025352 -0.01692964011223233 +178 0.1066979998314181 -0.09680112063822501 0.02509069634712856 +179 0.05468438740794547 -0.09693980049595211 0.02454944153753816 +180 0.7258171343268301 0.07691628590269689 0.06390528118187569 +181 0.9171042791674254 0.002073358924080724 0.09997850360338434 +182 0.8858000321707828 0.04212842747081245 0.09069286410096715 +183 0.9410832598426677 -0.03801335331510997 0.09249316174583189 +184 0.08229263481356194 -0.07814178422857621 0.06240081375731121 +185 0.1305463366779104 -0.07800186384096727 0.06257562814175503 +186 0.1062268649603983 -0.04549973859886018 0.08904927729878213 +187 0.1547981211774539 -0.04520894145258858 0.08919726236122059 +188 0.1277643166088349 -0.00390202595352298 0.09992384196706026 +189 0.1782568541798167 -0.004278196657176173 0.09990844325362361 +190 0.2031096337593761 -0.04482932585208761 0.08938865444589347 +191 0.2232412751332632 -0.004715701937994187 0.09988874889211496 +192 0.1519408955049489 0.03686856959622076 0.09295541176246075 +193 0.1138358334183953 0.03830260098107234 0.09237375578639616 +194 0.06561370415662733 -0.01234698153707487 0.09923483283063027 +195 0.7743358382262885 0.09045935202594169 -0.04262752199045541 +196 0.06609593995459039 -0.01311700179329851 -0.09913598874250766 +197 0.6496350314302461 -0.0149244305400869 -0.0988800352601784 +198 0.5752180010786554 0.09067941719048145 -0.04215736350858077 +199 0.8752357336050889 0.09068383625908605 -0.0421478569008588 +200 0.8497517649437336 0.06451604707712674 -0.07640470973403385 +201 0.7996112490675489 0.0645335082611674 -0.07638996211221628 +202 0.8892488815233911 0.06383114162050996 -0.07697782381583934 +203 0.8749183607220022 0.02708740268814036 -0.0962614804353773 +204 0.4748051161967255 0.09067365455518096 -0.04216975657515361 +205 0.3748141847208678 0.09067139345883567 -0.04217461805675321 +206 0.1247688085207812 0.09068270443447932 -0.0421502920090581 +207 0.1107099651872024 0.06392444116388561 -0.07690036295028085 +208 0.1554132169399485 0.06465291690042398 -0.07628892669494619 +209 0.8749473706797958 0.09084143004524312 0.04180711168372198 +210 0.8557948979976452 0.07008063157824826 0.07133516017781016 +211 0.8462780245282533 -0.09537260004577927 0.03006770959863461 +212 0.8907561183038731 -0.09540127364950975 0.02997660731389325 +213 0.174875907596821 0.09081879899554073 0.04185625101472386 +214 0.2028197549433827 0.06444837540995195 0.07646180031242988 +215 0.2515105979437889 0.06474217659866309 0.07621319156988193 +216 0.823970716775739 0.02683370852825769 -0.09633250794316793 +217 0.8900327364104292 -0.01790072755320826 -0.09838477500642978 +218 0.1551671736588479 -0.09672463011316022 0.02538396993128419 +219 0.1797185123863067 -0.09863233514212588 -0.01648218627522947 +220 0.3031169538710634 -0.08336841721874559 -0.05522415241940039 +221 0.07513637735263529 0.09065906182150785 0.0422011197676557 +222 0.275 0.09062500000002828 0.04227421643265401 +223 0.3002211267147768 0.0642304028527295 0.07664499559251131 +224 0.2741363190049307 0.02612598596324274 0.09652685044819626 +225 0.3237726326305602 0.02578199996148754 0.09661929661297404 +226 0.2986533989505137 -0.01695894431565721 0.09855147998735705 +227 0.3490056771495798 -0.01677857276567286 0.09858234880518429 +228 0.3734756709863143 0.02547228516730384 0.0967014099605355 +229 0.3979282262300922 -0.01773142033551271 0.09841542934360124 +230 0.4231462329924285 0.02509853977116485 0.09679908729608588 +231 0.4475237976689056 -0.01767083509504732 0.09842632568090533 +232 0.4728821523231145 0.02474413071179501 0.09689028844686966 +233 0.4483182783090968 0.06337563730400941 0.07735327140018483 +234 0.4977956407834336 -0.01785397447145672 0.09839327007256427 +235 0.52266936461721 0.02439106048457763 0.0969797719549684 +236 0.5475853688843231 -0.01815443764858781 0.09833827532382057 +237 0.5724469404413105 0.02402266062896407 0.09707168369975676 +238 0.596972387812323 -0.01929711918993835 0.09812044226851668 +239 0.3739721874881208 -0.05674421844180901 0.08234132421468739 +240 0.6221735457173504 0.02359101995170563 0.09717748596068036 +241 0.5976350671510985 0.06246262350478224 0.07809238544762112 +242 0.4734948890588048 -0.05501386512023957 0.08350733287880825 +243 0.6474351460529207 0.06215432017785976 0.07833798876169912 +244 0.5663722131482889 -0.05548811430485592 0.08319296346982265 +245 0.3248788707268807 0.09040114570469242 0.04275082286084061 +246 0.2248814579325742 0.09065461094848191 -0.04221068009141032 +247 0.6752866912429786 0.02713334613483909 -0.09624854039167043 +248 0.6745365215990767 -0.05496131776549656 -0.08354192689590129 +249 0.4020850981980664 -0.08355409638540079 -0.05494281551958505 +250 0.8210696069975196 0.001291905294989635 0.09999165455531166 +251 0.4248198384748114 0.09054526678751265 0.04244472478857837 +252 0.4745831291382883 0.09050973116045632 0.04252044878951682 +253 0.6251813367651564 0.09038000694781968 0.04279549443705572 +254 0.5750142610370313 0.09027457439763786 0.04301745247368036 +255 0.3269431628907761 -0.07590354641226338 0.06510492793976029 +256 0.1561508423063196 -0.01307875037164717 -0.09914104240281187 +257 0.6990484657645646 -0.08462921302037221 -0.05327190914123939 +258 0.3985680555958067 0.06363060442425023 0.07714367233029931 +259 0.5479397956903685 0.06279462019249718 0.07782567490796355 +260 0.4980848001500697 0.06306865803992286 0.07760376519888243 +261 0.7231904385259066 -0.0747078271254733 0.06647360804251862 +262 0.7239635678908372 -0.05515016747497944 -0.08341737845006711 +263 0.8215907657798855 -0.09916879962923715 -0.01286659162700884 +264 0.8710701290177836 -0.09929985837187764 -0.01181262575912071 +265 0.9196835844894277 -0.09935509001449794 -0.01133869870007203 +266 0.895425754847758 -0.08655723710702276 -0.05007838560096205 +267 0.6977900532596697 0.04344563043778987 0.09006929108116143 +268 0.3490869471358209 0.06382003422919341 0.07698703287557317 +269 0.6762795666283116 -0.07502013299478474 0.0661209471003313 +270 0.6504715363509287 0.06495922891932127 -0.07602827486012829 +271 0.8684869014708732 -0.0559165282817311 -0.08290562022515946 +272 0.2785877450790024 -0.05305904068786566 -0.08476283502386772 +273 0.6543923213838043 -0.04143167265351554 0.0910132765102539 +274 0.1788908683817996 -0.07758999523324264 0.06308559772012455 +275 0.9185220733774295 -0.07365441144425043 0.06763895087005026 +276 0.5754136126237446 -0.05457746897964573 -0.08379319709723343 +277 0.6496651976491155 -0.08446956245783493 -0.05352469540484955 +278 0.6252745541384392 -0.05470452996528903 -0.08371030044908928 +279 0.3279653718709938 -0.05324759037460799 -0.08464451617971452 +280 0.600624905463449 0.06516135069840485 -0.07585511436389437 +281 0.3774301402055493 -0.05341849094607594 -0.08453676611418255 +282 0.948402202131462 -0.08813635905015187 -0.04724385900180801 +283 0.9631254982043859 -0.01025657366463381 -0.09947262285001809 +284 0.5009028216641521 -0.08403288127069136 -0.05420770116271202 +285 0.476484861148284 -0.05374689814530066 -0.08432835193313502 +286 0.5505536839584981 -0.08428725486424489 -0.05381132471376102 +287 0.4269831137584812 -0.05357427776009077 -0.08443812386881085 +288 0.550230372293343 0.06536296898967305 -0.0756814527136936 +289 0.2282247595386515 -0.07705983498560229 0.0637321098975371 +290 0.2518480247539022 -0.04415719952999245 0.08972258204971832 +291 0.5003662592346333 0.0654474913494195 -0.07560837173268353 +292 0.4508092118418056 0.06560936407693238 -0.07546794912690112 +293 0.4007400863717974 0.06573414883222869 -0.07535928394897611 +294 0.3519650700780498 0.06531252226235558 -0.07572499214743643 +295 0.03364619669421869 0.07441066279173963 0.06680608701977699 +296 0.9665975116140474 0.07487785962560076 -0.06628201971793579 +297 0.03342664072238798 0.0745926036306542 -0.06660287894378225 +298 0.9644902674001012 0.07464387006054654 0.0665454180419978 +299 0.3034782362519676 0.06535504133610616 -0.07568829877831748 +300 0.2773145027301543 0.09119428627707182 -0.04103172127044478 +301 0.0379914345031872 -0.05680647467311559 -0.08229838658936564 +302 0.1315103335664333 0.02697105307224849 -0.09629414466193652 +303 0.2039815111281687 0.06530050246572666 -0.07573535751367143 +304 0.9606120935550899 -0.0999999110731674 -0.0001333617584379002 +305 0.9144741865159695 -0.05902480153744941 -0.08072219523442553 +306 0.08655002157616598 0.02439406793783185 -0.09697901551080236 +307 0.917922925026908 0.02036046151971678 -0.09790531960370762 +308 0.9627123460477456 -0.004727563765038709 0.09988818819483861 +309 0.107533216107368 0.07150281393547574 0.06990956729453228 +310 0.1499852469597218 0.07159595915112855 0.06981417215171953 +311 0.03672165179235776 -0.09965033704379245 -0.008355257450166858 +312 0.2034359475138506 0.0288007894523449 0.09576280346210475 +313 0.03628599168476299 -0.08393357826729327 0.05436133220634091 +314 0.9278804746813119 0.05757820037494099 0.0817603255961175 +315 0.3020095920074386 -0.05304205159443916 0.08477346732706441 +316 0.8365750148867069 0.04004861419255848 0.09163028157359118 +317 0.02820795054535954 -0.01205366802553229 0.0992708874098054 +318 0.9648184485537352 -0.06557500532236936 0.0754978057758716 +319 0.8972594023591645 0.07353798629797619 0.06776551166514326 +320 0.7305143542789625 0.09525206112945547 0.03044741122970029 +321 0.775 0.09555553107405332 0.02948118859808117 +322 0.3756548665193917 -0.08366948344515611 0.05476693838458335 +323 0.9647469923900245 0.0940553148216251 -0.03396465447792735 +324 0.03525300760997525 0.09405531482162499 -0.03396465447792769 +325 0.9647469923899695 0.09405531482160584 0.03396465447798067 +326 0.03525881628188438 0.09405322632483197 0.03397043741093036 +327 0.4225554465150777 -0.04557140380803633 0.08901262357084468 +328 0.9313436162450445 -0.09724270904309106 0.02332071049433826 +329 0.4749779843536133 -0.08383305861152773 0.05451622037372139 +330 0.07071452720440169 0.05787287046560883 0.08155201324351756 +331 0.5220983604839006 -0.04560043930794519 0.08899775241500434 +332 0.5753674673570632 -0.08196309046552187 0.05728919445533057 +333 0.07201829620539299 -0.07821204998063978 -0.0623127213161639 +334 0.8139284997976983 0.07034799831552553 0.07107150718113989 +335 0.239162162618001 0.03448253763007807 0.09386668524343582 +336 0.9341572062584494 0.05781662234254856 -0.08159190021625379 +337 0.260136890146918 -0.007402104351760944 0.09972566796550246 +338 0.9257597748674049 -0.02606904340161778 -0.09654224451567599 +339 0.0812910045554722 0.0239518667362444 0.09708917591497618 +340 0.06583515632582791 0.05777593981397317 -0.08162071292638989 +341 0.6841961890775969 0.07025398364048206 0.07116444184171532 +342 0.02445289620900777 -0.01201727016199908 -0.09927530013983099 +343 0.3377399498473421 -0.04942064630721379 0.08693445645184238 +344 0.6311307733985565 -0.01381360041992372 0.09904132694708145 +345 0.6048981546438468 -0.05105223378578955 0.08598644908054459 +346 1 0.05903474758501662 -0.01508958080940203 +347 1 -0.0492698659733555 0.02585882046984534 +348 1 -0.006707081897908891 -0.05523778907178359 +349 1 0.02248904019415254 0.05242633510007481 +350 1 -0.04926986597335551 -0.0258588204698453 +351 1 -0.04157212784815703 -0.06022762490856246 +352 1 -0.01118075978364661 -0.007009767007613534 +353 1 -0.004613279163841614 0.03040663489853741 +354 1 0.02382287111292555 -0.03041862635662273 +355 1 0.02540110428852566 0.0086268742639045 +356 1 0.05871282821768856 0.02912238872471996 +357 1 -0.02160866673981265 0.06129609466181399 +358 1 0.05297152495156948 -0.04790590352414643 +359 1 -0.07318202385798035 2.575175938670205e-17 +360 1 0.02647850445689395 -0.06531239184665578 +361 0.8097442979127593 -0.0002538220636328914 -0.0002190724419874404 +362 0.6919943088333138 4.985491467739307e-05 -1.765495114762483e-05 +363 0.2661225984761846 -0.0002345009512542684 -0.0002659731745668775 +364 0.1434609246194812 -0.000347968407252694 -0.0001578347581655155 +365 0.5917600396074824 -7.27120839916183e-05 -0.0001149220786268446 +366 0.9056369980894834 0.004166506266690477 0.001910386627615918 +367 0.4887868891536019 5.252040016875265e-05 -2.262249490066204e-05 +368 0.3882625271117123 -1.544633814109728e-05 -6.234524122779306e-05 +369 0.07072180072935581 0.01189339837702686 -0.01038178609236985 +370 0.7507713059074741 -0.01809603037091218 -0.03027871727728182 +371 0.7509399843971718 0.004622499109199152 0.03407912911233445 +372 0.2048127944455869 -0.01830450085692758 -0.02902887991368125 +373 0.3272558462914928 -0.003926628895856845 -0.03403314584716364 +374 0.3252661952183864 -0.004984575553836603 0.03490469916065429 +375 0.2046298982999326 0.0005302558387481111 0.04393452275189724 +376 0.8598006988872438 -0.0368884659397513 -0.01353906245731697 +377 0.6419338845532857 -0.03776454536308895 -0.01093360399964313 +378 0.6418375859791138 0.001685343610644846 0.03859148063194598 +379 0.6418582028482743 0.03273465085097027 -0.0217797605613903 +380 0.8556916694533818 0.03641814988857875 0.01932685066192455 +381 0.5403131380590794 0.00426293295252185 0.03839512446053304 +382 0.5402238594059806 -0.01462125056967047 -0.03558560967030561 +383 0.4385549194868565 -0.03635414626424641 -0.01426215678577366 +384 0.4385070867084823 0.003290064397895573 0.03895349506735941 +385 0.4385126262683935 0.03143028466374422 -0.02321390122806663 +386 0.7366233455912645 0.03845229129473127 -0.0140143763223288 +387 0.8531480241058584 0.01789724397332794 -0.0381248658978995 +388 0.9491219301592703 0.03647523129170174 -0.01137539261825475 +389 0.2175151974888435 0.03916883931522169 -0.006811522033994398 +390 0.09661375065149289 -0.03592267809151975 0.01935117131817035 +391 0.9445372257406316 0.005697044415833365 0.04540537559031475 +392 0.94285836848714 -0.0152036011382565 -0.04045876464010048 +393 0.8673535000929513 -0.01704227541175079 0.04158290410188616 +394 0.5396717887260073 0.0408399470396652 -0.01034127320472924 +395 0.7261640990524291 -0.04402667871348675 0.01512838196973669 +396 0.325 0.04506700301951457 0.001159374608041785 +397 0.1076438339483907 -0.02103573890108096 -0.04129877626633474 +398 0.3014737291427959 -0.04657885150170261 -0.003622048363858548 +399 0.1041999217598357 0.0234161060193528 0.03642640720558003 +400 0.9406045018621955 -0.04118836570849152 0.01140264484181875 +401 0.05534635425113341 -0.004385324508291634 0.04141679918393604 +402 0.5256461514330444 -0.04567390355330087 0.01175901602630076 +403 0.7809836800821299 -0.04750204347949779 0.006076480269965388 +404 0.04747181645710714 -0.04732362603282369 -7.366360577403669e-05 +405 0.2327732292633964 -0.04469398778012831 0.01335105558627647 +406 0.782959195555848 0.02545325608013942 -0.04110257716306683 +407 0.357442223506528 -0.04600243727439472 -0.01140902901739073 +408 0.176633159426807 -0.04693193960634534 0.01036656375652196 +409 0.6675721548463689 -0.007366452929078637 -0.04807026305792333 +410 0.7954338489107714 0.03299132435853947 0.03842482175425001 +411 0.04235121909087061 0.04429337963326432 -0.02933421939553563 +412 0.8003809522115908 -0.03274972827073072 -0.04073475329232642 +413 0.7012193827485377 0.04644879232182852 0.02586949887753818 +414 0.7014957770489088 0.0005938100035964857 0.05179041099006949 +415 0.8156560393748963 -0.01401133118622601 0.05007761103876692 +416 0.1720394784612087 0.02525878618541143 -0.04056073382013108 +417 0.1147865120332441 0.04485922780420802 -0.0132184087869404 +418 0.25428907057385 0.01152144336659399 -0.05133377946257717 +419 0.6142132538458003 -0.01037340359242246 -0.04750982772114612 +420 0.4765159126311785 -0.01123785819904922 -0.05124349444085305 +421 0.377589299115111 -0.003054777515063873 -0.05262301213112017 +422 0.3685434482612364 0.02661122338475763 0.04277924711682188 +423 0.2769447850141633 -0.02592871701979426 0.04569958936466267 +424 0.2759272342775064 0.03713820763982899 0.03709298374268958 +425 0.8134640658480627 0.0507219891921122 -0.006423859249217065 +426 0.7041030925032823 -0.03900333743919324 -0.03073361312312459 +427 0.6761735463601064 -0.04060314030927173 0.02762046142737952 +428 0.1659986654285851 0.0485571555881805 0.00835592586576327 +429 0.3774814435950348 0.05194969164282277 -0.005563362224740954 +430 0.5800948252536829 -0.04685651771461988 -0.022135560169152 +431 0.8999487940670268 0.05152396068502595 -0.01863373560946169 +432 0.579466829168978 0.02928965970327264 -0.04323089876401044 +433 0.05373284214593916 0.04566421355081217 0.02592770408534403 +434 0.6133802972150876 0.04315103291985688 0.02173777534139584 +435 0.4996402538736603 0.04630142209100169 0.02507418536676692 +436 0.6089834909343274 -0.0399270385221904 0.03119970208639706 +437 0.5913004176980696 0.004991160054803545 0.05203750071138363 +438 0.8984079487330503 0.0296861698138235 0.04410669311186817 +439 0.05553102201879556 -0.02340671837352426 -0.04596689608315931 +440 0.6904681105005237 0.03605478508836452 -0.03560362727116519 +441 0.1576142356972987 -0.03320207819734568 -0.04312718404156363 +442 0.8918654051223267 -0.01473803443572818 -0.04709037028137126 +443 0.2525260077673315 -0.03670862756988921 -0.03376985780662313 +444 0.3939568711986839 -0.04486137128097641 0.02550520337497304 +445 0.135577774667834 -0.01688203818318414 0.04919944489258739 +446 0.4912902502823541 0.04290333695702901 -0.02953452832414168 +447 0.4683129043965774 -0.03862598902552317 0.02883182787539095 +448 0.4885139127929301 0.003701125220790278 0.05226956182335596 +449 0.2758552607778448 0.04844644105144878 -0.01285981843115505 +450 0.4868407360569572 -0.0495863450538804 -0.02018699102277531 +451 0.827625338684292 -0.05113480699549148 0.02049514157432552 +452 0.4490014668928631 0.0503533509058885 0.02280517180580901 +453 0.4267846430130182 -0.01100968230100716 -0.05563423131048706 +$EndNodes +$Elements +2199 +1 2 2 1 1 3 56 1 +2 2 2 1 1 1 46 14 +3 2 2 1 1 1 56 46 +4 2 2 1 1 4 56 3 +5 2 2 1 1 5 49 4 +6 2 2 1 1 49 56 4 +7 2 2 1 1 6 57 5 +8 2 2 1 1 5 57 49 +9 2 2 1 1 7 57 6 +10 2 2 1 1 8 47 7 +11 2 2 1 1 47 57 7 +12 2 2 1 1 9 59 8 +13 2 2 1 1 8 59 47 +14 2 2 1 1 10 50 9 +15 2 2 1 1 50 59 9 +16 2 2 1 1 11 51 10 +17 2 2 1 1 10 51 50 +18 2 2 1 1 12 48 11 +19 2 2 1 1 48 51 11 +20 2 2 1 1 13 60 12 +21 2 2 1 1 12 60 48 +22 2 2 1 1 14 58 13 +23 2 2 1 1 58 60 13 +24 2 2 1 1 46 58 14 +25 2 2 1 1 46 55 54 +26 2 2 1 1 54 58 46 +27 2 2 1 1 46 56 55 +28 2 2 1 1 50 52 47 +29 2 2 1 1 47 59 50 +30 2 2 1 1 52 53 47 +31 2 2 1 1 53 57 47 +32 2 2 1 1 50 51 48 +33 2 2 1 1 48 52 50 +34 2 2 1 1 48 54 52 +35 2 2 1 1 48 60 54 +36 2 2 1 1 53 55 49 +37 2 2 1 1 49 57 53 +38 2 2 1 1 55 56 49 +39 2 2 1 1 52 55 53 +40 2 2 1 1 54 55 52 +41 2 2 1 1 54 60 58 +42 2 2 3 2 1 3 326 +43 2 2 3 2 14 1 324 +44 2 2 3 2 1 15 324 +45 2 2 3 2 15 1 326 +46 2 2 3 2 33 2 323 +47 2 2 3 2 2 33 325 +48 2 2 3 2 34 2 325 +49 2 2 3 2 2 45 323 +50 2 2 3 2 3 4 295 +51 2 2 3 2 3 295 326 +52 2 2 3 2 4 5 81 +53 2 2 3 2 4 81 295 +54 2 2 3 2 5 6 317 +55 2 2 3 2 81 5 317 +56 2 2 3 2 6 7 71 +57 2 2 3 2 6 71 317 +58 2 2 3 2 7 8 313 +59 2 2 3 2 71 7 313 +60 2 2 3 2 8 9 311 +61 2 2 3 2 179 8 311 +62 2 2 3 2 8 179 313 +63 2 2 3 2 9 10 68 +64 2 2 3 2 9 68 311 +65 2 2 3 2 10 11 301 +66 2 2 3 2 68 10 301 +67 2 2 3 2 11 12 342 +68 2 2 3 2 301 11 342 +69 2 2 3 2 12 13 79 +70 2 2 3 2 12 79 342 +71 2 2 3 2 13 14 297 +72 2 2 3 2 79 13 297 +73 2 2 3 2 297 14 324 +74 2 2 3 2 15 16 83 +75 2 2 3 2 16 15 221 +76 2 2 3 2 15 83 324 +77 2 2 3 2 221 15 326 +78 2 2 3 2 17 16 77 +79 2 2 3 2 16 17 206 +80 2 2 3 2 77 16 221 +81 2 2 3 2 83 16 206 +82 2 2 3 2 17 18 72 +83 2 2 3 2 18 17 213 +84 2 2 3 2 17 72 206 +85 2 2 3 2 17 77 213 +86 2 2 3 2 19 18 64 +87 2 2 3 2 18 19 246 +88 2 2 3 2 64 18 213 +89 2 2 3 2 72 18 246 +90 2 2 3 2 20 19 222 +91 2 2 3 2 19 20 300 +92 2 2 3 2 19 64 222 +93 2 2 3 2 246 19 300 +94 2 2 3 2 20 21 62 +95 2 2 3 2 21 20 245 +96 2 2 3 2 20 62 300 +97 2 2 3 2 20 222 245 +98 2 2 3 2 22 21 65 +99 2 2 3 2 21 22 205 +100 2 2 3 2 62 21 205 +101 2 2 3 2 65 21 245 +102 2 2 3 2 22 23 76 +103 2 2 3 2 23 22 251 +104 2 2 3 2 22 65 251 +105 2 2 3 2 22 76 205 +106 2 2 3 2 23 24 204 +107 2 2 3 2 24 23 252 +108 2 2 3 2 76 23 204 +109 2 2 3 2 23 251 252 +110 2 2 3 2 24 25 61 +111 2 2 3 2 25 24 66 +112 2 2 3 2 24 61 204 +113 2 2 3 2 66 24 252 +114 2 2 3 2 25 26 198 +115 2 2 3 2 26 25 254 +116 2 2 3 2 61 25 198 +117 2 2 3 2 25 66 254 +118 2 2 3 2 26 27 75 +119 2 2 3 2 27 26 253 +120 2 2 3 2 26 75 198 +121 2 2 3 2 253 26 254 +122 2 2 3 2 28 27 67 +123 2 2 3 2 27 28 85 +124 2 2 3 2 67 27 253 +125 2 2 3 2 75 27 85 +126 2 2 3 2 28 29 63 +127 2 2 3 2 29 28 320 +128 2 2 3 2 28 63 85 +129 2 2 3 2 28 67 320 +130 2 2 3 2 29 30 195 +131 2 2 3 2 30 29 321 +132 2 2 3 2 63 29 195 +133 2 2 3 2 29 320 321 +134 2 2 3 2 31 30 73 +135 2 2 3 2 30 31 74 +136 2 2 3 2 73 30 321 +137 2 2 3 2 30 74 195 +138 2 2 3 2 31 32 199 +139 2 2 3 2 32 31 209 +140 2 2 3 2 31 73 209 +141 2 2 3 2 74 31 199 +142 2 2 3 2 32 33 82 +143 2 2 3 2 33 32 84 +144 2 2 3 2 32 82 199 +145 2 2 3 2 84 32 209 +146 2 2 3 2 82 33 323 +147 2 2 3 2 33 84 325 +148 2 2 3 2 35 34 298 +149 2 2 3 2 298 34 325 +150 2 2 3 2 36 35 80 +151 2 2 3 2 80 35 298 +152 2 2 3 2 37 36 308 +153 2 2 3 2 36 80 308 +154 2 2 3 2 38 37 318 +155 2 2 3 2 183 37 308 +156 2 2 3 2 37 183 318 +157 2 2 3 2 39 38 69 +158 2 2 3 2 69 38 318 +159 2 2 3 2 40 39 304 +160 2 2 3 2 39 69 304 +161 2 2 3 2 41 40 282 +162 2 2 3 2 282 40 304 +163 2 2 3 2 42 41 70 +164 2 2 3 2 70 41 282 +165 2 2 3 2 43 42 283 +166 2 2 3 2 42 70 283 +167 2 2 3 2 44 43 78 +168 2 2 3 2 78 43 283 +169 2 2 3 2 45 44 296 +170 2 2 3 2 44 78 296 +171 2 2 3 2 45 296 323 +172 2 2 3 2 61 198 288 +173 2 2 3 2 204 61 291 +174 2 2 3 2 61 288 291 +175 2 2 3 2 62 205 294 +176 2 2 3 2 62 294 299 +177 2 2 3 2 62 299 300 +178 2 2 3 2 85 63 86 +179 2 2 3 2 86 63 87 +180 2 2 3 2 87 63 195 +181 2 2 3 2 64 213 214 +182 2 2 3 2 64 214 215 +183 2 2 3 2 64 215 222 +184 2 2 3 2 65 245 268 +185 2 2 3 2 251 65 258 +186 2 2 3 2 258 65 268 +187 2 2 3 2 66 252 260 +188 2 2 3 2 254 66 259 +189 2 2 3 2 259 66 260 +190 2 2 3 2 67 180 320 +191 2 2 3 2 180 67 341 +192 2 2 3 2 243 67 253 +193 2 2 3 2 67 243 341 +194 2 2 3 2 68 177 311 +195 2 2 3 2 177 68 333 +196 2 2 3 2 68 301 333 +197 2 2 3 2 275 69 318 +198 2 2 3 2 69 275 328 +199 2 2 3 2 304 69 328 +200 2 2 3 2 70 282 305 +201 2 2 3 2 283 70 338 +202 2 2 3 2 70 305 338 +203 2 2 3 2 71 184 186 +204 2 2 3 2 184 71 313 +205 2 2 3 2 71 186 194 +206 2 2 3 2 71 194 317 +207 2 2 3 2 206 72 208 +208 2 2 3 2 208 72 303 +209 2 2 3 2 72 246 303 +210 2 2 3 2 176 73 321 +211 2 2 3 2 73 176 334 +212 2 2 3 2 209 73 210 +213 2 2 3 2 210 73 334 +214 2 2 3 2 195 74 201 +215 2 2 3 2 74 199 200 +216 2 2 3 2 74 200 201 +217 2 2 3 2 75 85 270 +218 2 2 3 2 198 75 280 +219 2 2 3 2 75 270 280 +220 2 2 3 2 76 204 292 +221 2 2 3 2 205 76 293 +222 2 2 3 2 76 292 293 +223 2 2 3 2 213 77 310 +224 2 2 3 2 77 221 309 +225 2 2 3 2 77 309 310 +226 2 2 3 2 78 283 307 +227 2 2 3 2 296 78 336 +228 2 2 3 2 78 307 336 +229 2 2 3 2 196 79 306 +230 2 2 3 2 79 196 342 +231 2 2 3 2 79 297 340 +232 2 2 3 2 306 79 340 +233 2 2 3 2 80 181 308 +234 2 2 3 2 181 80 314 +235 2 2 3 2 80 298 314 +236 2 2 3 2 194 81 317 +237 2 2 3 2 81 194 339 +238 2 2 3 2 295 81 330 +239 2 2 3 2 330 81 339 +240 2 2 3 2 199 82 202 +241 2 2 3 2 202 82 336 +242 2 2 3 2 296 82 323 +243 2 2 3 2 82 296 336 +244 2 2 3 2 83 206 207 +245 2 2 3 2 83 207 340 +246 2 2 3 2 83 297 324 +247 2 2 3 2 297 83 340 +248 2 2 3 2 84 209 319 +249 2 2 3 2 298 84 314 +250 2 2 3 2 84 298 325 +251 2 2 3 2 314 84 319 +252 2 2 3 2 85 86 270 +253 2 2 3 2 86 87 88 +254 2 2 3 2 86 88 247 +255 2 2 3 2 86 247 270 +256 2 2 3 2 88 87 89 +257 2 2 3 2 89 87 201 +258 2 2 3 2 87 195 201 +259 2 2 3 2 88 89 90 +260 2 2 3 2 88 90 91 +261 2 2 3 2 88 91 247 +262 2 2 3 2 90 89 92 +263 2 2 3 2 92 89 216 +264 2 2 3 2 89 201 216 +265 2 2 3 2 91 90 262 +266 2 2 3 2 90 92 93 +267 2 2 3 2 90 93 262 +268 2 2 3 2 91 197 247 +269 2 2 3 2 197 91 248 +270 2 2 3 2 248 91 262 +271 2 2 3 2 93 92 94 +272 2 2 3 2 94 92 108 +273 2 2 3 2 108 92 216 +274 2 2 3 2 93 94 95 +275 2 2 3 2 93 95 96 +276 2 2 3 2 93 96 262 +277 2 2 3 2 95 94 104 +278 2 2 3 2 104 94 271 +279 2 2 3 2 94 108 271 +280 2 2 3 2 96 95 97 +281 2 2 3 2 97 95 263 +282 2 2 3 2 95 104 263 +283 2 2 3 2 96 97 98 +284 2 2 3 2 96 98 257 +285 2 2 3 2 96 257 262 +286 2 2 3 2 98 97 99 +287 2 2 3 2 99 97 101 +288 2 2 3 2 101 97 263 +289 2 2 3 2 98 99 100 +290 2 2 3 2 98 100 109 +291 2 2 3 2 98 109 257 +292 2 2 3 2 100 99 261 +293 2 2 3 2 99 101 102 +294 2 2 3 2 99 102 261 +295 2 2 3 2 109 100 110 +296 2 2 3 2 110 100 269 +297 2 2 3 2 100 261 269 +298 2 2 3 2 102 101 103 +299 2 2 3 2 103 101 211 +300 2 2 3 2 211 101 263 +301 2 2 3 2 102 103 105 +302 2 2 3 2 102 105 106 +303 2 2 3 2 102 106 261 +304 2 2 3 2 105 103 107 +305 2 2 3 2 107 103 148 +306 2 2 3 2 148 103 211 +307 2 2 3 2 263 104 264 +308 2 2 3 2 264 104 266 +309 2 2 3 2 266 104 271 +310 2 2 3 2 106 105 142 +311 2 2 3 2 105 107 250 +312 2 2 3 2 142 105 250 +313 2 2 3 2 106 142 145 +314 2 2 3 2 106 145 153 +315 2 2 3 2 106 153 261 +316 2 2 3 2 107 148 149 +317 2 2 3 2 107 149 150 +318 2 2 3 2 107 150 250 +319 2 2 3 2 203 108 216 +320 2 2 3 2 108 203 217 +321 2 2 3 2 108 217 271 +322 2 2 3 2 109 110 111 +323 2 2 3 2 109 111 277 +324 2 2 3 2 257 109 277 +325 2 2 3 2 111 110 112 +326 2 2 3 2 112 110 134 +327 2 2 3 2 134 110 269 +328 2 2 3 2 111 112 113 +329 2 2 3 2 111 113 133 +330 2 2 3 2 111 133 277 +331 2 2 3 2 113 112 114 +332 2 2 3 2 114 112 332 +333 2 2 3 2 112 134 332 +334 2 2 3 2 113 114 115 +335 2 2 3 2 113 115 286 +336 2 2 3 2 133 113 286 +337 2 2 3 2 115 114 116 +338 2 2 3 2 116 114 139 +339 2 2 3 2 139 114 332 +340 2 2 3 2 115 116 117 +341 2 2 3 2 115 117 284 +342 2 2 3 2 115 284 286 +343 2 2 3 2 117 116 118 +344 2 2 3 2 118 116 329 +345 2 2 3 2 116 139 329 +346 2 2 3 2 117 118 119 +347 2 2 3 2 117 119 136 +348 2 2 3 2 117 136 284 +349 2 2 3 2 119 118 120 +350 2 2 3 2 120 118 132 +351 2 2 3 2 132 118 329 +352 2 2 3 2 119 120 121 +353 2 2 3 2 119 121 249 +354 2 2 3 2 136 119 249 +355 2 2 3 2 121 120 122 +356 2 2 3 2 122 120 322 +357 2 2 3 2 120 132 322 +358 2 2 3 2 121 122 123 +359 2 2 3 2 121 123 135 +360 2 2 3 2 121 135 249 +361 2 2 3 2 123 122 124 +362 2 2 3 2 124 122 255 +363 2 2 3 2 255 122 322 +364 2 2 3 2 123 124 125 +365 2 2 3 2 123 125 220 +366 2 2 3 2 135 123 220 +367 2 2 3 2 125 124 126 +368 2 2 3 2 126 124 131 +369 2 2 3 2 131 124 255 +370 2 2 3 2 125 126 127 +371 2 2 3 2 125 127 129 +372 2 2 3 2 125 129 220 +373 2 2 3 2 127 126 128 +374 2 2 3 2 128 126 289 +375 2 2 3 2 126 131 289 +376 2 2 3 2 127 128 219 +377 2 2 3 2 129 127 130 +378 2 2 3 2 130 127 219 +379 2 2 3 2 128 218 219 +380 2 2 3 2 218 128 274 +381 2 2 3 2 274 128 289 +382 2 2 3 2 129 130 137 +383 2 2 3 2 129 137 272 +384 2 2 3 2 220 129 272 +385 2 2 3 2 137 130 138 +386 2 2 3 2 138 130 140 +387 2 2 3 2 140 130 219 +388 2 2 3 2 131 255 315 +389 2 2 3 2 289 131 290 +390 2 2 3 2 290 131 315 +391 2 2 3 2 132 239 322 +392 2 2 3 2 239 132 327 +393 2 2 3 2 132 242 327 +394 2 2 3 2 242 132 329 +395 2 2 3 2 133 276 278 +396 2 2 3 2 276 133 286 +397 2 2 3 2 277 133 278 +398 2 2 3 2 134 269 273 +399 2 2 3 2 134 273 345 +400 2 2 3 2 332 134 345 +401 2 2 3 2 135 220 279 +402 2 2 3 2 249 135 281 +403 2 2 3 2 135 279 281 +404 2 2 3 2 136 249 287 +405 2 2 3 2 284 136 285 +406 2 2 3 2 285 136 287 +407 2 2 3 2 137 138 143 +408 2 2 3 2 137 143 144 +409 2 2 3 2 137 144 272 +410 2 2 3 2 138 140 141 +411 2 2 3 2 138 141 256 +412 2 2 3 2 143 138 256 +413 2 2 3 2 139 242 329 +414 2 2 3 2 242 139 331 +415 2 2 3 2 139 244 331 +416 2 2 3 2 244 139 332 +417 2 2 3 2 141 140 172 +418 2 2 3 2 172 140 173 +419 2 2 3 2 173 140 219 +420 2 2 3 2 141 172 174 +421 2 2 3 2 141 174 175 +422 2 2 3 2 141 175 256 +423 2 2 3 2 145 142 147 +424 2 2 3 2 147 142 171 +425 2 2 3 2 171 142 250 +426 2 2 3 2 144 143 146 +427 2 2 3 2 146 143 168 +428 2 2 3 2 168 143 256 +429 2 2 3 2 144 146 151 +430 2 2 3 2 144 151 152 +431 2 2 3 2 144 152 272 +432 2 2 3 2 145 147 267 +433 2 2 3 2 153 145 154 +434 2 2 3 2 154 145 267 +435 2 2 3 2 151 146 170 +436 2 2 3 2 146 168 303 +437 2 2 3 2 170 146 303 +438 2 2 3 2 147 171 176 +439 2 2 3 2 147 176 180 +440 2 2 3 2 147 180 267 +441 2 2 3 2 149 148 275 +442 2 2 3 2 148 211 212 +443 2 2 3 2 148 212 275 +444 2 2 3 2 150 149 181 +445 2 2 3 2 181 149 183 +446 2 2 3 2 183 149 275 +447 2 2 3 2 150 181 182 +448 2 2 3 2 150 182 316 +449 2 2 3 2 250 150 316 +450 2 2 3 2 152 151 155 +451 2 2 3 2 155 151 299 +452 2 2 3 2 151 170 299 +453 2 2 3 2 152 155 156 +454 2 2 3 2 152 156 279 +455 2 2 3 2 272 152 279 +456 2 2 3 2 153 154 273 +457 2 2 3 2 261 153 269 +458 2 2 3 2 269 153 273 +459 2 2 3 2 240 154 243 +460 2 2 3 2 154 240 344 +461 2 2 3 2 243 154 267 +462 2 2 3 2 273 154 344 +463 2 2 3 2 156 155 157 +464 2 2 3 2 157 155 294 +465 2 2 3 2 294 155 299 +466 2 2 3 2 156 157 158 +467 2 2 3 2 156 158 281 +468 2 2 3 2 279 156 281 +469 2 2 3 2 158 157 159 +470 2 2 3 2 159 157 293 +471 2 2 3 2 293 157 294 +472 2 2 3 2 158 159 160 +473 2 2 3 2 158 160 287 +474 2 2 3 2 281 158 287 +475 2 2 3 2 160 159 161 +476 2 2 3 2 161 159 292 +477 2 2 3 2 292 159 293 +478 2 2 3 2 160 161 162 +479 2 2 3 2 160 162 285 +480 2 2 3 2 160 285 287 +481 2 2 3 2 162 161 163 +482 2 2 3 2 163 161 291 +483 2 2 3 2 291 161 292 +484 2 2 3 2 162 163 164 +485 2 2 3 2 162 164 169 +486 2 2 3 2 162 169 285 +487 2 2 3 2 164 163 165 +488 2 2 3 2 165 163 288 +489 2 2 3 2 288 163 291 +490 2 2 3 2 164 165 166 +491 2 2 3 2 164 166 276 +492 2 2 3 2 169 164 276 +493 2 2 3 2 166 165 167 +494 2 2 3 2 167 165 280 +495 2 2 3 2 280 165 288 +496 2 2 3 2 166 167 197 +497 2 2 3 2 166 197 278 +498 2 2 3 2 276 166 278 +499 2 2 3 2 197 167 247 +500 2 2 3 2 247 167 270 +501 2 2 3 2 270 167 280 +502 2 2 3 2 208 168 302 +503 2 2 3 2 168 208 303 +504 2 2 3 2 168 256 302 +505 2 2 3 2 169 276 286 +506 2 2 3 2 169 284 285 +507 2 2 3 2 284 169 286 +508 2 2 3 2 170 246 300 +509 2 2 3 2 246 170 303 +510 2 2 3 2 299 170 300 +511 2 2 3 2 176 171 334 +512 2 2 3 2 171 250 316 +513 2 2 3 2 171 316 334 +514 2 2 3 2 172 173 177 +515 2 2 3 2 174 172 333 +516 2 2 3 2 172 177 333 +517 2 2 3 2 177 173 178 +518 2 2 3 2 178 173 218 +519 2 2 3 2 218 173 219 +520 2 2 3 2 175 174 196 +521 2 2 3 2 196 174 301 +522 2 2 3 2 301 174 333 +523 2 2 3 2 175 196 306 +524 2 2 3 2 256 175 302 +525 2 2 3 2 302 175 306 +526 2 2 3 2 180 176 320 +527 2 2 3 2 320 176 321 +528 2 2 3 2 177 178 179 +529 2 2 3 2 177 179 311 +530 2 2 3 2 179 178 184 +531 2 2 3 2 184 178 185 +532 2 2 3 2 185 178 218 +533 2 2 3 2 179 184 313 +534 2 2 3 2 267 180 341 +535 2 2 3 2 182 181 314 +536 2 2 3 2 181 183 308 +537 2 2 3 2 182 210 316 +538 2 2 3 2 210 182 319 +539 2 2 3 2 182 314 319 +540 2 2 3 2 183 275 318 +541 2 2 3 2 184 185 186 +542 2 2 3 2 186 185 187 +543 2 2 3 2 187 185 274 +544 2 2 3 2 185 218 274 +545 2 2 3 2 186 187 188 +546 2 2 3 2 186 188 194 +547 2 2 3 2 188 187 189 +548 2 2 3 2 189 187 190 +549 2 2 3 2 190 187 274 +550 2 2 3 2 188 189 192 +551 2 2 3 2 188 192 193 +552 2 2 3 2 188 193 339 +553 2 2 3 2 194 188 339 +554 2 2 3 2 189 190 191 +555 2 2 3 2 189 191 312 +556 2 2 3 2 192 189 312 +557 2 2 3 2 191 190 290 +558 2 2 3 2 190 274 289 +559 2 2 3 2 190 289 290 +560 2 2 3 2 191 290 337 +561 2 2 3 2 312 191 335 +562 2 2 3 2 335 191 337 +563 2 2 3 2 193 192 310 +564 2 2 3 2 192 214 310 +565 2 2 3 2 214 192 312 +566 2 2 3 2 309 193 310 +567 2 2 3 2 193 309 330 +568 2 2 3 2 193 330 339 +569 2 2 3 2 196 301 342 +570 2 2 3 2 197 248 278 +571 2 2 3 2 198 280 288 +572 2 2 3 2 200 199 202 +573 2 2 3 2 201 200 216 +574 2 2 3 2 200 202 203 +575 2 2 3 2 200 203 216 +576 2 2 3 2 203 202 307 +577 2 2 3 2 307 202 336 +578 2 2 3 2 217 203 307 +579 2 2 3 2 204 291 292 +580 2 2 3 2 205 293 294 +581 2 2 3 2 207 206 208 +582 2 2 3 2 207 208 302 +583 2 2 3 2 207 302 306 +584 2 2 3 2 207 306 340 +585 2 2 3 2 209 210 319 +586 2 2 3 2 316 210 334 +587 2 2 3 2 212 211 264 +588 2 2 3 2 211 263 264 +589 2 2 3 2 212 264 265 +590 2 2 3 2 212 265 328 +591 2 2 3 2 275 212 328 +592 2 2 3 2 214 213 310 +593 2 2 3 2 215 214 335 +594 2 2 3 2 214 312 335 +595 2 2 3 2 222 215 223 +596 2 2 3 2 223 215 224 +597 2 2 3 2 224 215 335 +598 2 2 3 2 271 217 305 +599 2 2 3 2 305 217 338 +600 2 2 3 2 217 307 338 +601 2 2 3 2 220 272 279 +602 2 2 3 2 295 221 326 +603 2 2 3 2 221 295 330 +604 2 2 3 2 309 221 330 +605 2 2 3 2 222 223 245 +606 2 2 3 2 223 224 225 +607 2 2 3 2 223 225 268 +608 2 2 3 2 245 223 268 +609 2 2 3 2 225 224 226 +610 2 2 3 2 226 224 337 +611 2 2 3 2 224 335 337 +612 2 2 3 2 225 226 227 +613 2 2 3 2 225 227 228 +614 2 2 3 2 225 228 268 +615 2 2 3 2 227 226 343 +616 2 2 3 2 226 290 315 +617 2 2 3 2 290 226 337 +618 2 2 3 2 226 315 343 +619 2 2 3 2 228 227 229 +620 2 2 3 2 229 227 239 +621 2 2 3 2 239 227 343 +622 2 2 3 2 228 229 230 +623 2 2 3 2 228 230 258 +624 2 2 3 2 228 258 268 +625 2 2 3 2 230 229 231 +626 2 2 3 2 231 229 327 +627 2 2 3 2 229 239 327 +628 2 2 3 2 230 231 232 +629 2 2 3 2 230 232 233 +630 2 2 3 2 230 233 258 +631 2 2 3 2 232 231 234 +632 2 2 3 2 234 231 242 +633 2 2 3 2 242 231 327 +634 2 2 3 2 233 232 260 +635 2 2 3 2 232 234 235 +636 2 2 3 2 232 235 260 +637 2 2 3 2 251 233 252 +638 2 2 3 2 233 251 258 +639 2 2 3 2 252 233 260 +640 2 2 3 2 235 234 236 +641 2 2 3 2 236 234 331 +642 2 2 3 2 234 242 331 +643 2 2 3 2 235 236 237 +644 2 2 3 2 235 237 259 +645 2 2 3 2 235 259 260 +646 2 2 3 2 237 236 238 +647 2 2 3 2 238 236 244 +648 2 2 3 2 244 236 331 +649 2 2 3 2 237 238 240 +650 2 2 3 2 237 240 241 +651 2 2 3 2 237 241 259 +652 2 2 3 2 240 238 344 +653 2 2 3 2 238 244 345 +654 2 2 3 2 344 238 345 +655 2 2 3 2 239 255 322 +656 2 2 3 2 255 239 343 +657 2 2 3 2 241 240 243 +658 2 2 3 2 241 243 253 +659 2 2 3 2 241 253 254 +660 2 2 3 2 241 254 259 +661 2 2 3 2 243 267 341 +662 2 2 3 2 244 332 345 +663 2 2 3 2 257 248 262 +664 2 2 3 2 248 257 277 +665 2 2 3 2 248 277 278 +666 2 2 3 2 249 281 287 +667 2 2 3 2 315 255 343 +668 2 2 3 2 265 264 266 +669 2 2 3 2 265 266 282 +670 2 2 3 2 265 282 304 +671 2 2 3 2 265 304 328 +672 2 2 3 2 266 271 305 +673 2 2 3 2 282 266 305 +674 2 2 3 2 273 344 345 +675 2 2 3 2 307 283 338 +676 2 2 2 3 34 356 2 +677 2 2 2 3 2 346 45 +678 2 2 2 3 2 356 346 +679 2 2 2 3 35 356 34 +680 2 2 2 3 36 349 35 +681 2 2 2 3 349 356 35 +682 2 2 2 3 37 357 36 +683 2 2 2 3 36 357 349 +684 2 2 2 3 38 357 37 +685 2 2 2 3 39 347 38 +686 2 2 2 3 347 357 38 +687 2 2 2 3 40 359 39 +688 2 2 2 3 39 359 347 +689 2 2 2 3 41 350 40 +690 2 2 2 3 350 359 40 +691 2 2 2 3 42 351 41 +692 2 2 2 3 41 351 350 +693 2 2 2 3 43 348 42 +694 2 2 2 3 348 351 42 +695 2 2 2 3 44 360 43 +696 2 2 2 3 43 360 348 +697 2 2 2 3 45 358 44 +698 2 2 2 3 358 360 44 +699 2 2 2 3 346 358 45 +700 2 2 2 3 346 355 354 +701 2 2 2 3 354 358 346 +702 2 2 2 3 346 356 355 +703 2 2 2 3 350 352 347 +704 2 2 2 3 347 359 350 +705 2 2 2 3 352 353 347 +706 2 2 2 3 353 357 347 +707 2 2 2 3 350 351 348 +708 2 2 2 3 348 352 350 +709 2 2 2 3 348 354 352 +710 2 2 2 3 348 360 354 +711 2 2 2 3 353 355 349 +712 2 2 2 3 349 357 353 +713 2 2 2 3 355 356 349 +714 2 2 2 3 352 355 353 +715 2 2 2 3 354 355 352 +716 2 2 2 3 354 360 358 +717 4 2 4 1 91 426 370 440 +718 4 2 4 1 296 360 358 388 +719 4 2 4 1 91 370 88 440 +720 4 2 4 1 91 409 426 440 +721 4 2 4 1 358 360 354 388 +722 4 2 4 1 149 393 391 400 +723 4 2 4 1 212 376 393 400 +724 4 2 4 1 173 390 408 441 +725 4 2 4 1 369 397 306 417 +726 4 2 4 1 275 393 149 400 +727 4 2 4 1 275 149 391 400 +728 4 2 4 1 360 354 388 392 +729 4 2 4 1 78 360 388 392 +730 4 2 4 1 266 376 400 442 +731 4 2 4 1 381 394 254 434 +732 4 2 4 1 173 397 390 441 +733 4 2 4 1 335 423 375 424 +734 4 2 4 1 102 403 371 415 +735 4 2 4 1 381 434 254 437 +736 4 2 4 1 370 386 88 440 +737 4 2 4 1 265 266 376 400 +738 4 2 4 1 84 388 298 391 +739 4 2 4 1 379 413 27 434 +740 4 2 4 1 105 102 371 415 +741 4 2 4 1 249 407 383 421 +742 4 2 4 1 336 392 388 431 +743 4 2 4 1 265 376 212 400 +744 4 2 4 1 320 386 371 413 +745 4 2 4 1 152 373 418 443 +746 4 2 4 1 294 373 421 429 +747 4 2 4 1 249 421 383 453 +748 4 2 4 1 152 272 373 443 +749 4 2 4 1 176 371 386 410 +750 4 2 4 1 375 389 214 424 +751 4 2 4 1 294 396 373 429 +752 4 2 4 1 152 418 272 443 +753 4 2 4 1 259 381 254 437 +754 4 2 4 1 266 400 392 442 +755 4 2 4 1 84 388 391 438 +756 4 2 4 1 88 386 370 406 +757 4 2 4 1 105 102 106 371 +758 4 2 4 1 244 402 381 436 +759 4 2 4 1 373 299 418 449 +760 4 2 4 1 369 411 306 439 +761 4 2 4 1 108 376 387 412 +762 4 2 4 1 366 393 376 400 +763 4 2 4 1 275 212 393 400 +764 4 2 4 1 299 151 373 418 +765 4 2 4 1 294 299 373 396 +766 4 2 4 1 102 395 371 403 +767 4 2 4 1 255 407 374 444 +768 4 2 4 1 302 397 416 417 +769 4 2 4 1 337 423 335 424 +770 4 2 4 1 259 254 381 394 +771 4 2 4 1 108 94 376 412 +772 4 2 4 1 272 398 373 443 +773 4 2 4 1 173 390 218 408 +774 4 2 4 1 84 325 298 388 +775 4 2 4 1 392 431 307 442 +776 4 2 4 1 374 396 223 422 +777 4 2 4 1 360 296 78 388 +778 4 2 4 1 27 413 379 440 +779 4 2 4 1 229 422 384 444 +780 4 2 4 1 106 371 102 395 +781 4 2 4 1 321 410 386 425 +782 4 2 4 1 176 386 321 410 +783 4 2 4 1 91 90 88 370 +784 4 2 4 1 390 364 408 441 +785 4 2 4 1 356 298 388 391 +786 4 2 4 1 378 413 379 434 +787 4 2 4 1 336 307 392 431 +788 4 2 4 1 394 432 26 434 +789 4 2 4 1 265 264 212 376 +790 4 2 4 1 255 398 374 407 +791 4 2 4 1 172 390 173 397 +792 4 2 4 1 306 397 369 439 +793 4 2 4 1 198 26 394 432 +794 4 2 4 1 199 387 380 425 +795 4 2 4 1 382 394 163 446 +796 4 2 4 1 391 393 366 400 +797 4 2 4 1 67 27 413 434 +798 4 2 4 1 383 407 249 444 +799 4 2 4 1 223 396 374 424 +800 4 2 4 1 373 396 299 449 +801 4 2 4 1 121 249 407 444 +802 4 2 4 1 27 28 413 440 +803 4 2 4 1 199 380 387 431 +804 4 2 4 1 302 207 397 417 +805 4 2 4 1 293 421 385 429 +806 4 2 4 1 216 387 406 412 +807 4 2 4 1 192 428 375 445 +808 4 2 4 1 207 306 397 417 +809 4 2 4 1 88 370 90 406 +810 4 2 4 1 259 394 381 435 +811 4 2 4 1 108 387 376 442 +812 4 2 4 1 180 320 371 413 +813 4 2 4 1 122 407 255 444 +814 4 2 4 1 255 374 343 444 +815 4 2 4 1 251 422 429 452 +816 4 2 4 1 185 218 390 408 +817 4 2 4 1 302 207 306 397 +818 4 2 4 1 375 423 363 424 +819 4 2 4 1 207 340 306 417 +820 4 2 4 1 229 239 422 444 +821 4 2 4 1 227 229 239 422 +822 4 2 4 1 376 366 400 442 +823 4 2 4 1 163 394 382 432 +824 4 2 4 1 75 432 379 434 +825 4 2 4 1 382 163 420 446 +826 4 2 4 1 155 299 151 373 +827 4 2 4 1 176 371 320 386 +828 4 2 4 1 271 108 94 376 +829 4 2 4 1 79 411 60 439 +830 4 2 4 1 259 66 254 394 +831 4 2 4 1 325 356 298 388 +832 4 2 4 1 368 429 422 452 +833 4 2 4 1 199 380 31 425 +834 4 2 4 1 173 178 218 390 +835 4 2 4 1 294 62 299 396 +836 4 2 4 1 370 371 361 406 +837 4 2 4 1 362 379 378 413 +838 4 2 4 1 244 332 402 436 +839 4 2 4 1 381 402 365 436 +840 4 2 4 1 294 299 155 373 +841 4 2 4 1 373 398 279 407 +842 4 2 4 1 26 432 75 434 +843 4 2 4 1 87 386 88 406 +844 4 2 4 1 384 368 422 452 +845 4 2 4 1 259 66 394 435 +846 4 2 4 1 370 395 96 403 +847 4 2 4 1 279 398 220 407 +848 4 2 4 1 79 306 411 439 +849 4 2 4 1 212 393 376 451 +850 4 2 4 1 390 397 364 441 +851 4 2 4 1 244 436 381 437 +852 4 2 4 1 84 431 388 438 +853 4 2 4 1 254 394 26 434 +854 4 2 4 1 114 430 402 436 +855 4 2 4 1 254 25 26 394 +856 4 2 4 1 383 407 368 421 +857 4 2 4 1 352 391 388 400 +858 4 2 4 1 321 386 29 425 +859 4 2 4 1 365 394 381 434 +860 4 2 4 1 255 122 398 407 +861 4 2 4 1 146 416 372 418 +862 4 2 4 1 216 108 387 412 +863 4 2 4 1 251 258 422 452 +864 4 2 4 1 282 392 266 400 +865 4 2 4 1 293 294 421 429 +866 4 2 4 1 185 408 390 445 +867 4 2 4 1 146 143 372 416 +868 4 2 4 1 386 410 406 425 +869 4 2 4 1 130 127 405 408 +870 4 2 4 1 302 416 397 441 +871 4 2 4 1 78 388 336 392 +872 4 2 4 1 148 275 212 393 +873 4 2 4 1 163 288 394 432 +874 4 2 4 1 130 405 372 408 +875 4 2 4 1 105 371 142 415 +876 4 2 4 1 256 302 397 441 +877 4 2 4 1 362 370 426 440 +878 4 2 4 1 399 428 192 445 +879 4 2 4 1 88 90 89 406 +880 4 2 4 1 172 177 173 390 +881 4 2 4 1 91 262 370 426 +882 4 2 4 1 384 422 258 452 +883 4 2 4 1 316 393 380 438 +884 4 2 4 1 355 352 353 391 +885 4 2 4 1 108 376 271 442 +886 4 2 4 1 163 394 288 446 +887 4 2 4 1 152 373 151 418 +888 4 2 4 1 98 96 395 403 +889 4 2 4 1 122 255 322 444 +890 4 2 4 1 281 407 249 421 +891 4 2 4 1 316 380 393 415 +892 4 2 4 1 370 386 371 406 +893 4 2 4 1 402 430 365 436 +894 4 2 4 1 406 410 361 425 +895 4 2 4 1 105 106 142 371 +896 4 2 4 1 26 198 75 432 +897 4 2 4 1 363 389 375 424 +898 4 2 4 1 355 388 352 391 +899 4 2 4 1 29 386 195 425 +900 4 2 4 1 385 421 293 453 +901 4 2 4 1 230 384 229 422 +902 4 2 4 1 31 380 199 431 +903 4 2 4 1 340 79 306 411 +904 4 2 4 1 146 303 416 418 +905 4 2 4 1 177 390 172 397 +906 4 2 4 1 27 85 28 440 +907 4 2 4 1 212 148 393 451 +908 4 2 4 1 216 406 92 412 +909 4 2 4 1 256 416 302 441 +910 4 2 4 1 48 60 411 439 +911 4 2 4 1 146 372 143 418 +912 4 2 4 1 251 422 65 429 +913 4 2 4 1 275 149 183 391 +914 4 2 4 1 164 382 276 419 +915 4 2 4 1 91 262 90 370 +916 4 2 4 1 216 92 108 412 +917 4 2 4 1 265 266 264 376 +918 4 2 4 1 382 419 164 432 +919 4 2 4 1 365 434 381 437 +920 4 2 4 1 98 97 96 403 +921 4 2 4 1 220 398 272 443 +922 4 2 4 1 259 254 241 437 +923 4 2 4 1 96 395 370 426 +924 4 2 4 1 352 388 392 400 +925 4 2 4 1 389 416 303 418 +926 4 2 4 1 294 373 155 421 +927 4 2 4 1 281 421 249 453 +928 4 2 4 1 176 320 321 386 +929 4 2 4 1 244 331 381 402 +930 4 2 4 1 282 266 265 400 +931 4 2 4 1 254 434 241 437 +932 4 2 4 1 184 401 390 404 +933 4 2 4 1 279 152 272 373 +934 4 2 4 1 286 402 382 450 +935 4 2 4 1 172 397 173 441 +936 4 2 4 1 27 379 85 440 +937 4 2 4 1 373 407 279 421 +938 4 2 4 1 402 447 331 448 +939 4 2 4 1 281 279 407 421 +940 4 2 4 1 130 219 127 408 +941 4 2 4 1 316 410 380 415 +942 4 2 4 1 135 279 220 407 +943 4 2 4 1 371 395 106 414 +944 4 2 4 1 225 374 224 424 +945 4 2 4 1 376 380 361 393 +946 4 2 4 1 159 293 421 453 +947 4 2 4 1 114 402 332 436 +948 4 2 4 1 374 423 224 424 +949 4 2 4 1 214 389 375 428 +950 4 2 4 1 155 151 152 373 +951 4 2 4 1 356 388 355 391 +952 4 2 4 1 190 375 290 405 +953 4 2 4 1 159 385 293 453 +954 4 2 4 1 164 276 166 419 +955 4 2 4 1 360 348 354 392 +956 4 2 4 1 164 419 166 432 +957 4 2 4 1 19 64 389 424 +958 4 2 4 1 251 258 65 422 +959 4 2 4 1 366 431 392 442 +960 4 2 4 1 364 375 372 389 +961 4 2 4 1 185 218 178 390 +962 4 2 4 1 146 168 143 416 +963 4 2 4 1 388 392 366 431 +964 4 2 4 1 411 417 83 433 +965 4 2 4 1 88 386 87 440 +966 4 2 4 1 127 130 405 443 +967 4 2 4 1 372 405 130 443 +968 4 2 4 1 261 106 395 414 +969 4 2 4 1 361 380 376 387 +970 4 2 4 1 350 351 70 392 +971 4 2 4 1 191 290 375 423 +972 4 2 4 1 150 393 316 438 +973 4 2 4 1 149 181 391 393 +974 4 2 4 1 25 198 26 394 +975 4 2 4 1 62 396 294 429 +976 4 2 4 1 201 406 387 425 +977 4 2 4 1 115 402 286 450 +978 4 2 4 1 180 320 176 371 +979 4 2 4 1 381 402 331 448 +980 4 2 4 1 290 405 375 423 +981 4 2 4 1 362 386 370 440 +982 4 2 4 1 190 290 289 405 +983 4 2 4 1 109 395 426 427 +984 4 2 4 1 310 192 399 428 +985 4 2 4 1 364 389 372 416 +986 4 2 4 1 284 286 382 450 +987 4 2 4 1 375 428 364 445 +988 4 2 4 1 373 363 418 443 +989 4 2 4 1 391 393 181 438 +990 4 2 4 1 147 413 371 414 +991 4 2 4 1 214 375 192 428 +992 4 2 4 1 15 411 83 433 +993 4 2 4 1 48 79 60 439 +994 4 2 4 1 163 162 382 420 +995 4 2 4 1 376 380 366 387 +996 4 2 4 1 224 337 335 424 +997 4 2 4 1 373 374 368 396 +998 4 2 4 1 48 60 54 411 +999 4 2 4 1 212 211 148 451 +1000 4 2 4 1 263 376 412 451 +1001 4 2 4 1 98 395 96 426 +1002 4 2 4 1 55 52 369 401 +1003 4 2 4 1 201 387 200 425 +1004 4 2 4 1 384 422 368 444 +1005 4 2 4 1 96 370 403 412 +1006 4 2 4 1 239 255 343 444 +1007 4 2 4 1 291 163 288 446 +1008 4 2 4 1 16 83 417 433 +1009 4 2 4 1 366 380 376 393 +1010 4 2 4 1 19 424 389 449 +1011 4 2 4 1 386 406 195 425 +1012 4 2 4 1 16 15 83 433 +1013 4 2 4 1 52 54 55 411 +1014 4 2 4 1 161 385 159 453 +1015 4 2 4 1 223 374 225 424 +1016 4 2 4 1 161 420 385 453 +1017 4 2 4 1 104 263 376 412 +1018 4 2 4 1 388 391 366 400 +1019 4 2 4 1 302 416 207 417 +1020 4 2 4 1 277 409 377 426 +1021 4 2 4 1 243 413 378 434 +1022 4 2 4 1 375 389 364 428 +1023 4 2 4 1 385 429 368 452 +1024 4 2 4 1 202 307 431 442 +1025 4 2 4 1 281 279 135 407 +1026 4 2 4 1 230 258 384 422 +1027 4 2 4 1 353 391 352 400 +1028 4 2 4 1 314 84 391 438 +1029 4 2 4 1 106 102 261 395 +1030 4 2 4 1 84 298 314 391 +1031 4 2 4 1 318 391 357 400 +1032 4 2 4 1 266 392 305 442 +1033 4 2 4 1 334 380 316 410 +1034 4 2 4 1 360 78 283 392 +1035 4 2 4 1 100 395 109 427 +1036 4 2 4 1 202 431 387 442 +1037 4 2 4 1 170 389 303 418 +1038 4 2 4 1 366 393 391 438 +1039 4 2 4 1 112 430 114 436 +1040 4 2 4 1 239 322 255 444 +1041 4 2 4 1 209 431 32 438 +1042 4 2 4 1 84 33 388 431 +1043 4 2 4 1 102 403 415 451 +1044 4 2 4 1 389 416 364 428 +1045 4 2 4 1 137 143 372 418 +1046 4 2 4 1 277 248 409 426 +1047 4 2 4 1 64 389 214 428 +1048 4 2 4 1 374 398 255 423 +1049 4 2 4 1 163 161 420 446 +1050 4 2 4 1 276 419 382 430 +1051 4 2 4 1 226 224 374 423 +1052 4 2 4 1 225 226 224 374 +1053 4 2 4 1 316 380 210 438 +1054 4 2 4 1 230 229 228 422 +1055 4 2 4 1 275 391 183 400 +1056 4 2 4 1 278 377 277 409 +1057 4 2 4 1 364 428 399 445 +1058 4 2 4 1 327 444 384 447 +1059 4 2 4 1 229 384 327 444 +1060 4 2 4 1 388 366 392 400 +1061 4 2 4 1 368 422 374 444 +1062 4 2 4 1 201 200 74 425 +1063 4 2 4 1 293 294 157 421 +1064 4 2 4 1 83 411 340 417 +1065 4 2 4 1 247 409 91 440 +1066 4 2 4 1 130 408 372 441 +1067 4 2 4 1 74 199 31 425 +1068 4 2 4 1 284 115 286 450 +1069 4 2 4 1 32 431 84 438 +1070 4 2 4 1 361 371 370 403 +1071 4 2 4 1 109 395 98 426 +1072 4 2 4 1 368 383 421 453 +1073 4 2 4 1 363 374 373 396 +1074 4 2 4 1 104 376 94 412 +1075 4 2 4 1 143 372 416 441 +1076 4 2 4 1 22 429 385 452 +1077 4 2 4 1 161 292 159 385 +1078 4 2 4 1 385 421 368 429 +1079 4 2 4 1 55 53 52 401 +1080 4 2 4 1 364 416 397 417 +1081 4 2 4 1 167 270 379 409 +1082 4 2 4 1 377 378 362 379 +1083 4 2 4 1 143 416 256 441 +1084 4 2 4 1 372 416 389 418 +1085 4 2 4 1 29 195 30 425 +1086 4 2 4 1 163 382 164 432 +1087 4 2 4 1 381 382 365 402 +1088 4 2 4 1 362 371 370 386 +1089 4 2 4 1 169 284 286 382 +1090 4 2 4 1 286 382 402 430 +1091 4 2 4 1 161 385 420 446 +1092 4 2 4 1 109 426 377 427 +1093 4 2 4 1 90 370 93 412 +1094 4 2 4 1 336 78 296 388 +1095 4 2 4 1 77 399 221 417 +1096 4 2 4 1 363 373 418 449 +1097 4 2 4 1 373 398 363 443 +1098 4 2 4 1 150 316 182 438 +1099 4 2 4 1 371 410 142 415 +1100 4 2 4 1 96 403 95 412 +1101 4 2 4 1 247 91 88 440 +1102 4 2 4 1 77 221 16 417 +1103 4 2 4 1 126 398 405 423 +1104 4 2 4 1 221 417 399 433 +1105 4 2 4 1 370 371 362 395 +1106 4 2 4 1 219 408 130 441 +1107 4 2 4 1 381 436 365 437 +1108 4 2 4 1 261 153 106 414 +1109 4 2 4 1 321 29 30 425 +1110 4 2 4 1 209 32 84 438 +1111 4 2 4 1 399 401 390 445 +1112 4 2 4 1 201 216 387 406 +1113 4 2 4 1 76 293 385 429 +1114 4 2 4 1 118 383 119 444 +1115 4 2 4 1 163 164 165 432 +1116 4 2 4 1 373 368 421 429 +1117 4 2 4 1 209 380 431 438 +1118 4 2 4 1 261 414 395 427 +1119 4 2 4 1 375 405 363 423 +1120 4 2 4 1 356 349 298 391 +1121 4 2 4 1 161 292 385 446 +1122 4 2 4 1 383 444 118 447 +1123 4 2 4 1 360 283 348 392 +1124 4 2 4 1 55 401 369 433 +1125 4 2 4 1 137 418 372 443 +1126 4 2 4 1 334 210 316 380 +1127 4 2 4 1 76 23 22 385 +1128 4 2 4 1 277 377 109 426 +1129 4 2 4 1 23 22 385 452 +1130 4 2 4 1 167 419 379 432 +1131 4 2 4 1 189 192 375 445 +1132 4 2 4 1 170 389 418 449 +1133 4 2 4 1 120 118 119 444 +1134 4 2 4 1 361 406 387 412 +1135 4 2 4 1 52 55 369 411 +1136 4 2 4 1 372 375 363 389 +1137 4 2 4 1 167 379 280 432 +1138 4 2 4 1 71 184 313 404 +1139 4 2 4 1 191 290 190 375 +1140 4 2 4 1 100 98 109 395 +1141 4 2 4 1 333 177 172 397 +1142 4 2 4 1 373 396 368 429 +1143 4 2 4 1 369 417 411 433 +1144 4 2 4 1 52 369 401 404 +1145 4 2 4 1 124 255 122 398 +1146 4 2 4 1 133 377 278 419 +1147 4 2 4 1 256 302 175 397 +1148 4 2 4 1 316 393 150 415 +1149 4 2 4 1 102 415 103 451 +1150 4 2 4 1 368 374 373 407 +1151 4 2 4 1 278 277 248 409 +1152 4 2 4 1 341 413 267 414 +1153 4 2 4 1 16 417 221 433 +1154 4 2 4 1 363 375 372 405 +1155 4 2 4 1 71 401 184 404 +1156 4 2 4 1 356 355 349 391 +1157 4 2 4 1 299 396 62 449 +1158 4 2 4 1 214 192 310 428 +1159 4 2 4 1 86 88 87 440 +1160 4 2 4 1 33 346 325 388 +1161 4 2 4 1 331 402 139 447 +1162 4 2 4 1 169 284 382 450 +1163 4 2 4 1 180 371 147 413 +1164 4 2 4 1 191 337 290 423 +1165 4 2 4 1 90 92 89 406 +1166 4 2 4 1 365 432 394 434 +1167 4 2 4 1 271 94 104 376 +1168 4 2 4 1 368 396 374 422 +1169 4 2 4 1 392 400 366 442 +1170 4 2 4 1 224 423 337 424 +1171 4 2 4 1 233 384 258 452 +1172 4 2 4 1 244 139 331 402 +1173 4 2 4 1 165 164 166 432 +1174 4 2 4 1 371 403 361 415 +1175 4 2 4 1 137 144 143 418 +1176 4 2 4 1 87 88 89 406 +1177 4 2 4 1 261 153 414 427 +1178 4 2 4 1 167 247 270 409 +1179 4 2 4 1 374 407 368 444 +1180 4 2 4 1 169 382 420 450 +1181 4 2 4 1 368 407 383 444 +1182 4 2 4 1 384 385 368 452 +1183 4 2 4 1 365 402 382 430 +1184 4 2 4 1 19 222 64 424 +1185 4 2 4 1 362 379 413 440 +1186 4 2 4 1 365 378 377 379 +1187 4 2 4 1 357 391 353 400 +1188 4 2 4 1 202 387 203 442 +1189 4 2 4 1 76 385 22 429 +1190 4 2 4 1 245 396 223 424 +1191 4 2 4 1 62 294 205 429 +1192 4 2 4 1 152 144 272 418 +1193 4 2 4 1 377 409 278 419 +1194 4 2 4 1 202 307 336 431 +1195 4 2 4 1 263 412 403 451 +1196 4 2 4 1 126 398 125 405 +1197 4 2 4 1 316 210 182 438 +1198 4 2 4 1 170 246 303 389 +1199 4 2 4 1 377 419 133 430 +1200 4 2 4 1 293 205 294 429 +1201 4 2 4 1 302 306 175 397 +1202 4 2 4 1 78 336 307 392 +1203 4 2 4 1 96 97 95 403 +1204 4 2 4 1 167 409 379 419 +1205 4 2 4 1 362 426 409 440 +1206 4 2 4 1 125 405 398 443 +1207 4 2 4 1 90 93 92 412 +1208 4 2 4 1 233 230 258 384 +1209 4 2 4 1 383 420 136 453 +1210 4 2 4 1 186 390 401 445 +1211 4 2 4 1 72 417 416 428 +1212 4 2 4 1 142 371 147 410 +1213 4 2 4 1 270 379 409 440 +1214 4 2 4 1 350 392 282 400 +1215 4 2 4 1 84 33 325 388 +1216 4 2 4 1 282 305 266 392 +1217 4 2 4 1 148 149 275 393 +1218 4 2 4 1 281 249 287 453 +1219 4 2 4 1 243 67 413 434 +1220 4 2 4 1 75 379 27 434 +1221 4 2 4 1 255 398 124 423 +1222 4 2 4 1 259 381 235 435 +1223 4 2 4 1 361 387 376 412 +1224 4 2 4 1 190 187 189 375 +1225 4 2 4 1 65 245 396 422 +1226 4 2 4 1 133 277 278 377 +1227 4 2 4 1 29 321 320 386 +1228 4 2 4 1 246 389 170 449 +1229 4 2 4 1 365 382 381 394 +1230 4 2 4 1 157 294 155 421 +1231 4 2 4 1 159 293 157 421 +1232 4 2 4 1 373 374 363 398 +1233 4 2 4 1 289 128 274 408 +1234 4 2 4 1 318 357 347 400 +1235 4 2 4 1 227 228 229 422 +1236 4 2 4 1 381 382 367 394 +1237 4 2 4 1 386 413 28 440 +1238 4 2 4 1 286 402 115 430 +1239 4 2 4 1 189 375 187 445 +1240 4 2 4 1 289 405 128 408 +1241 4 2 4 1 214 312 192 375 +1242 4 2 4 1 323 358 346 388 +1243 4 2 4 1 208 207 302 416 +1244 4 2 4 1 273 378 427 436 +1245 4 2 4 1 325 346 356 388 +1246 4 2 4 1 48 411 54 439 +1247 4 2 4 1 251 429 22 452 +1248 4 2 4 1 112 114 332 436 +1249 4 2 4 1 25 254 66 394 +1250 4 2 4 1 72 206 416 417 +1251 4 2 4 1 112 113 114 430 +1252 4 2 4 1 64 214 213 428 +1253 4 2 4 1 65 422 396 429 +1254 4 2 4 1 310 399 77 428 +1255 4 2 4 1 368 384 383 385 +1256 4 2 4 1 214 335 312 375 +1257 4 2 4 1 399 417 77 428 +1258 4 2 4 1 390 408 364 445 +1259 4 2 4 1 236 244 381 437 +1260 4 2 4 1 267 413 147 414 +1261 4 2 4 1 156 373 279 421 +1262 4 2 4 1 270 409 247 440 +1263 4 2 4 1 383 384 367 385 +1264 4 2 4 1 84 32 33 431 +1265 4 2 4 1 377 430 111 436 +1266 4 2 4 1 64 18 389 428 +1267 4 2 4 1 132 444 327 447 +1268 4 2 4 1 244 331 236 381 +1269 4 2 4 1 201 216 200 387 +1270 4 2 4 1 316 150 250 415 +1271 4 2 4 1 69 359 304 400 +1272 4 2 4 1 123 220 398 407 +1273 4 2 4 1 354 352 388 392 +1274 4 2 4 1 26 75 27 434 +1275 4 2 4 1 280 379 75 432 +1276 4 2 4 1 96 93 370 412 +1277 4 2 4 1 388 431 366 438 +1278 4 2 4 1 363 396 373 449 +1279 4 2 4 1 259 235 260 435 +1280 4 2 4 1 273 378 414 427 +1281 4 2 4 1 243 341 267 414 +1282 4 2 4 1 270 280 167 379 +1283 4 2 4 1 147 371 176 410 +1284 4 2 4 1 143 168 256 416 +1285 4 2 4 1 24 23 446 452 +1286 4 2 4 1 361 393 380 415 +1287 4 2 4 1 347 357 353 400 +1288 4 2 4 1 183 391 318 400 +1289 4 2 4 1 102 99 395 403 +1290 4 2 4 1 367 382 381 402 +1291 4 2 4 1 374 396 363 424 +1292 4 2 4 1 208 207 416 417 +1293 4 2 4 1 72 206 417 428 +1294 4 2 4 1 23 385 204 446 +1295 4 2 4 1 23 385 446 452 +1296 4 2 4 1 146 303 168 416 +1297 4 2 4 1 131 255 124 423 +1298 4 2 4 1 186 390 184 401 +1299 4 2 4 1 249 281 135 407 +1300 4 2 4 1 123 135 220 407 +1301 4 2 4 1 366 391 388 438 +1302 4 2 4 1 369 390 404 439 +1303 4 2 4 1 377 379 362 409 +1304 4 2 4 1 104 95 263 412 +1305 4 2 4 1 163 291 161 446 +1306 4 2 4 1 369 404 52 439 +1307 4 2 4 1 299 170 418 449 +1308 4 2 4 1 202 203 307 442 +1309 4 2 4 1 147 180 176 371 +1310 4 2 4 1 369 411 55 433 +1311 4 2 4 1 347 359 69 400 +1312 4 2 4 1 162 164 163 382 +1313 4 2 4 1 95 403 263 412 +1314 4 2 4 1 118 117 383 450 +1315 4 2 4 1 127 405 125 443 +1316 4 2 4 1 171 142 147 410 +1317 4 2 4 1 376 393 361 451 +1318 4 2 4 1 235 435 381 448 +1319 4 2 4 1 369 397 390 439 +1320 4 2 4 1 169 382 162 420 +1321 4 2 4 1 177 178 173 390 +1322 4 2 4 1 61 288 394 446 +1323 4 2 4 1 362 413 378 414 +1324 4 2 4 1 64 213 18 428 +1325 4 2 4 1 138 372 143 441 +1326 4 2 4 1 27 67 253 434 +1327 4 2 4 1 24 446 435 452 +1328 4 2 4 1 277 109 257 426 +1329 4 2 4 1 312 189 192 375 +1330 4 2 4 1 225 227 374 422 +1331 4 2 4 1 145 371 106 414 +1332 4 2 4 1 63 386 28 440 +1333 4 2 4 1 112 111 430 436 +1334 4 2 4 1 128 405 127 408 +1335 4 2 4 1 344 378 273 436 +1336 4 2 4 1 207 83 340 417 +1337 4 2 4 1 115 402 113 430 +1338 4 2 4 1 172 173 140 441 +1339 4 2 4 1 118 383 447 450 +1340 4 2 4 1 20 396 222 424 +1341 4 2 4 1 364 390 369 397 +1342 4 2 4 1 169 420 285 450 +1343 4 2 4 1 367 382 420 446 +1344 4 2 4 1 245 222 396 424 +1345 4 2 4 1 15 46 411 433 +1346 4 2 4 1 61 291 288 446 +1347 4 2 4 1 145 142 106 371 +1348 4 2 4 1 140 219 130 441 +1349 4 2 4 1 303 389 72 416 +1350 4 2 4 1 113 402 114 430 +1351 4 2 4 1 323 296 358 388 +1352 4 2 4 1 361 380 410 415 +1353 4 2 4 1 111 377 133 430 +1354 4 2 4 1 136 420 383 450 +1355 4 2 4 1 15 326 46 433 +1356 4 2 4 1 281 156 279 421 +1357 4 2 4 1 101 403 102 451 +1358 4 2 4 1 110 377 111 436 +1359 4 2 4 1 107 393 148 451 +1360 4 2 4 1 369 390 364 399 +1361 4 2 4 1 123 398 122 407 +1362 4 2 4 1 219 128 127 408 +1363 4 2 4 1 65 396 21 429 +1364 4 2 4 1 102 105 103 415 +1365 4 2 4 1 237 381 259 437 +1366 4 2 4 1 371 386 362 413 +1367 4 2 4 1 132 118 444 447 +1368 4 2 4 1 137 144 418 443 +1369 4 2 4 1 384 233 448 452 +1370 4 2 4 1 306 196 397 439 +1371 4 2 4 1 59 47 313 404 +1372 4 2 4 1 163 161 162 420 +1373 4 2 4 1 20 245 222 396 +1374 4 2 4 1 79 196 306 439 +1375 4 2 4 1 315 374 255 423 +1376 4 2 4 1 372 375 364 408 +1377 4 2 4 1 110 109 377 427 +1378 4 2 4 1 77 309 221 399 +1379 4 2 4 1 327 384 231 447 +1380 4 2 4 1 242 331 447 448 +1381 4 2 4 1 396 422 368 429 +1382 4 2 4 1 262 96 370 426 +1383 4 2 4 1 328 265 212 400 +1384 4 2 4 1 52 401 53 404 +1385 4 2 4 1 397 416 364 441 +1386 4 2 4 1 232 384 233 448 +1387 4 2 4 1 361 410 371 415 +1388 4 2 4 1 21 65 245 396 +1389 4 2 4 1 121 120 119 444 +1390 4 2 4 1 119 118 117 383 +1391 4 2 4 1 103 107 148 451 +1392 4 2 4 1 79 342 48 60 +1393 4 2 4 1 273 427 134 436 +1394 4 2 4 1 156 155 373 421 +1395 4 2 4 1 146 170 303 418 +1396 4 2 4 1 209 84 319 438 +1397 4 2 4 1 142 410 171 415 +1398 4 2 4 1 272 418 144 443 +1399 4 2 4 1 55 49 53 401 +1400 4 2 4 1 72 206 208 416 +1401 4 2 4 1 371 395 370 403 +1402 4 2 4 1 208 416 206 417 +1403 4 2 4 1 188 194 399 445 +1404 4 2 4 1 125 398 220 443 +1405 4 2 4 1 20 396 424 449 +1406 4 2 4 1 76 205 293 429 +1407 4 2 4 1 365 379 377 419 +1408 4 2 4 1 48 54 52 439 +1409 4 2 4 1 378 436 344 437 +1410 4 2 4 1 138 143 256 441 +1411 4 2 4 1 222 424 19 449 +1412 4 2 4 1 96 93 262 370 +1413 4 2 4 1 282 350 70 392 +1414 4 2 4 1 283 70 351 392 +1415 4 2 4 1 260 435 235 448 +1416 4 2 4 1 335 191 312 375 +1417 4 2 4 1 276 133 419 430 +1418 4 2 4 1 234 236 331 381 +1419 4 2 4 1 292 293 159 385 +1420 4 2 4 1 179 313 184 404 +1421 4 2 4 1 48 342 79 439 +1422 4 2 4 1 276 133 278 419 +1423 4 2 4 1 246 72 303 389 +1424 4 2 4 1 374 398 373 407 +1425 4 2 4 1 334 73 380 410 +1426 4 2 4 1 49 81 401 433 +1427 4 2 4 1 110 427 377 436 +1428 4 2 4 1 234 381 331 448 +1429 4 2 4 1 223 225 224 424 +1430 4 2 4 1 58 60 297 411 +1431 4 2 4 1 156 152 279 373 +1432 4 2 4 1 107 415 393 451 +1433 4 2 4 1 114 113 115 402 +1434 4 2 4 1 244 332 139 402 +1435 4 2 4 1 147 371 145 414 +1436 4 2 4 1 130 137 372 443 +1437 4 2 4 1 393 415 361 451 +1438 4 2 4 1 137 143 138 372 +1439 4 2 4 1 151 299 170 418 +1440 4 2 4 1 133 111 277 377 +1441 4 2 4 1 137 138 130 372 +1442 4 2 4 1 145 147 142 371 +1443 4 2 4 1 136 285 420 450 +1444 4 2 4 1 372 389 363 418 +1445 4 2 4 1 124 122 123 398 +1446 4 2 4 1 344 273 345 436 +1447 4 2 4 1 101 102 103 451 +1448 4 2 4 1 156 155 152 373 +1449 4 2 4 1 367 394 382 446 +1450 4 2 4 1 67 27 28 413 +1451 4 2 4 1 169 285 284 450 +1452 4 2 4 1 368 421 385 453 +1453 4 2 4 1 251 65 22 429 +1454 4 2 4 1 262 93 90 370 +1455 4 2 4 1 376 361 412 451 +1456 4 2 4 1 24 23 204 446 +1457 4 2 4 1 234 235 236 381 +1458 4 2 4 1 185 274 218 408 +1459 4 2 4 1 87 195 386 406 +1460 4 2 4 1 65 268 245 422 +1461 4 2 4 1 59 313 179 404 +1462 4 2 4 1 276 382 286 430 +1463 4 2 4 1 267 180 147 413 +1464 4 2 4 1 339 399 194 401 +1465 4 2 4 1 399 401 330 433 +1466 4 2 4 1 266 271 376 442 +1467 4 2 4 1 127 126 125 405 +1468 4 2 4 1 276 169 286 382 +1469 4 2 4 1 46 326 56 433 +1470 4 2 4 1 364 397 369 417 +1471 4 2 4 1 261 102 99 395 +1472 4 2 4 1 275 183 318 400 +1473 4 2 4 1 126 405 131 423 +1474 4 2 4 1 243 67 341 413 +1475 4 2 4 1 350 352 392 400 +1476 4 2 4 1 125 220 129 443 +1477 4 2 4 1 141 256 175 397 +1478 4 2 4 1 76 204 23 385 +1479 4 2 4 1 72 416 389 428 +1480 4 2 4 1 264 376 263 451 +1481 4 2 4 1 384 444 383 447 +1482 4 2 4 1 273 414 153 427 +1483 4 2 4 1 256 397 141 441 +1484 4 2 4 1 72 17 206 428 +1485 4 2 4 1 382 365 419 432 +1486 4 2 4 1 92 94 108 412 +1487 4 2 4 1 383 385 367 420 +1488 4 2 4 1 366 387 380 431 +1489 4 2 4 1 20 424 222 449 +1490 4 2 4 1 275 328 212 400 +1491 4 2 4 1 289 405 290 423 +1492 4 2 4 1 107 150 393 415 +1493 4 2 4 1 348 283 351 392 +1494 4 2 4 1 130 372 138 441 +1495 4 2 4 1 235 381 234 448 +1496 4 2 4 1 382 419 365 430 +1497 4 2 4 1 68 51 50 439 +1498 4 2 4 1 240 434 378 437 +1499 4 2 4 1 198 280 75 432 +1500 4 2 4 1 225 228 227 422 +1501 4 2 4 1 277 257 248 426 +1502 4 2 4 1 350 359 347 400 +1503 4 2 4 1 181 393 150 438 +1504 4 2 4 1 179 184 390 404 +1505 4 2 4 1 336 388 82 431 +1506 4 2 4 1 230 228 258 422 +1507 4 2 4 1 49 401 55 433 +1508 4 2 4 1 183 357 318 391 +1509 4 2 4 1 379 432 365 434 +1510 4 2 4 1 368 385 383 453 +1511 4 2 4 1 231 447 384 448 +1512 4 2 4 1 383 384 368 444 +1513 4 2 4 1 18 72 389 428 +1514 4 2 4 1 310 309 77 399 +1515 4 2 4 1 188 194 339 399 +1516 4 2 4 1 344 436 345 437 +1517 4 2 4 1 387 406 361 425 +1518 4 2 4 1 238 344 345 437 +1519 4 2 4 1 113 112 111 430 +1520 4 2 4 1 131 405 289 423 +1521 4 2 4 1 175 306 196 397 +1522 4 2 4 1 160 420 161 453 +1523 4 2 4 1 103 415 107 451 +1524 4 2 4 1 110 111 112 436 +1525 4 2 4 1 354 346 358 388 +1526 4 2 4 1 270 75 280 379 +1527 4 2 4 1 47 53 401 404 +1528 4 2 4 1 66 24 25 394 +1529 4 2 4 1 162 169 164 382 +1530 4 2 4 1 160 161 159 453 +1531 4 2 4 1 260 232 233 448 +1532 4 2 4 1 286 115 113 430 +1533 4 2 4 1 24 394 66 435 +1534 4 2 4 1 125 126 124 398 +1535 4 2 4 1 263 95 97 403 +1536 4 2 4 1 318 347 69 400 +1537 4 2 4 1 149 181 183 391 +1538 4 2 4 1 77 417 17 428 +1539 4 2 4 1 96 95 93 412 +1540 4 2 4 1 231 229 230 384 +1541 4 2 4 1 17 417 206 428 +1542 4 2 4 1 16 221 15 433 +1543 4 2 4 1 195 406 201 425 +1544 4 2 4 1 111 110 109 377 +1545 4 2 4 1 237 259 241 437 +1546 4 2 4 1 371 413 362 414 +1547 4 2 4 1 354 352 355 388 +1548 4 2 4 1 366 387 431 442 +1549 4 2 4 1 362 378 377 427 +1550 4 2 4 1 199 387 202 431 +1551 4 2 4 1 369 399 364 417 +1552 4 2 4 1 232 230 233 384 +1553 4 2 4 1 131 126 289 405 +1554 4 2 4 1 242 331 139 447 +1555 4 2 4 1 330 401 81 433 +1556 4 2 4 1 221 399 309 433 +1557 4 2 4 1 57 71 47 401 +1558 4 2 4 1 85 27 75 379 +1559 4 2 4 1 330 309 399 433 +1560 4 2 4 1 91 409 248 426 +1561 4 2 4 1 376 387 366 442 +1562 4 2 4 1 334 73 210 380 +1563 4 2 4 1 363 424 396 449 +1564 4 2 4 1 33 323 346 388 +1565 4 2 4 1 89 92 216 406 +1566 4 2 4 1 367 385 384 452 +1567 4 2 4 1 62 21 396 429 +1568 4 2 4 1 266 271 104 376 +1569 4 2 4 1 264 104 263 376 +1570 4 2 4 1 46 55 411 433 +1571 4 2 4 1 80 298 349 391 +1572 4 2 4 1 149 150 181 393 +1573 4 2 4 1 108 203 387 442 +1574 4 2 4 1 127 129 130 443 +1575 4 2 4 1 370 395 362 426 +1576 4 2 4 1 167 197 409 419 +1577 4 2 4 1 179 390 177 404 +1578 4 2 4 1 107 250 150 415 +1579 4 2 4 1 71 186 184 401 +1580 4 2 4 1 330 399 339 401 +1581 4 2 4 1 315 343 255 374 +1582 4 2 4 1 85 63 28 440 +1583 4 2 4 1 119 117 136 383 +1584 4 2 4 1 231 327 229 384 +1585 4 2 4 1 49 295 81 433 +1586 4 2 4 1 378 379 365 434 +1587 4 2 4 1 214 310 213 428 +1588 4 2 4 1 349 355 353 391 +1589 4 2 4 1 301 51 68 439 +1590 4 2 4 1 199 200 202 387 +1591 4 2 4 1 362 377 426 427 +1592 4 2 4 1 163 165 288 432 +1593 4 2 4 1 367 402 381 448 +1594 4 2 4 1 28 386 320 413 +1595 4 2 4 1 127 125 129 443 +1596 4 2 4 1 250 142 171 415 +1597 4 2 4 1 246 19 389 449 +1598 4 2 4 1 330 221 309 433 +1599 4 2 4 1 235 259 237 381 +1600 4 2 4 1 370 406 361 412 +1601 4 2 4 1 362 395 371 414 +1602 4 2 4 1 19 64 18 389 +1603 4 2 4 1 168 302 256 416 +1604 4 2 4 1 136 249 119 383 +1605 4 2 4 1 28 63 29 386 +1606 4 2 4 1 350 348 351 392 +1607 4 2 4 1 173 218 219 408 +1608 4 2 4 1 361 403 370 412 +1609 4 2 4 1 276 164 169 382 +1610 4 2 4 1 353 352 347 400 +1611 4 2 4 1 261 269 153 427 +1612 4 2 4 1 241 434 240 437 +1613 4 2 4 1 389 424 363 449 +1614 4 2 4 1 363 405 398 423 +1615 4 2 4 1 198 394 288 432 +1616 4 2 4 1 117 136 383 450 +1617 4 2 4 1 318 69 275 400 +1618 4 2 4 1 81 317 49 401 +1619 4 2 4 1 364 408 375 445 +1620 4 2 4 1 195 201 74 425 +1621 4 2 4 1 24 61 394 446 +1622 4 2 4 1 139 402 116 447 +1623 4 2 4 1 403 412 361 451 +1624 4 2 4 1 246 18 72 389 +1625 4 2 4 1 63 87 195 386 +1626 4 2 4 1 379 409 377 419 +1627 4 2 4 1 319 210 209 438 +1628 4 2 4 1 82 336 296 388 +1629 4 2 4 1 292 76 293 385 +1630 4 2 4 1 50 59 311 404 +1631 4 2 4 1 278 409 197 419 +1632 4 2 4 1 73 380 410 425 +1633 4 2 4 1 91 248 262 426 +1634 4 2 4 1 17 77 16 417 +1635 4 2 4 1 62 205 21 429 +1636 4 2 4 1 367 447 402 448 +1637 4 2 4 1 382 394 365 432 +1638 4 2 4 1 24 394 435 446 +1639 4 2 4 1 120 132 118 444 +1640 4 2 4 1 261 395 100 427 +1641 4 2 4 1 399 417 369 433 +1642 4 2 4 1 307 338 392 442 +1643 4 2 4 1 363 423 374 424 +1644 4 2 4 1 110 134 427 436 +1645 4 2 4 1 398 405 363 443 +1646 4 2 4 1 367 384 383 447 +1647 4 2 4 1 226 225 227 374 +1648 4 2 4 1 300 299 62 449 +1649 4 2 4 1 327 231 242 447 +1650 4 2 4 1 345 436 244 437 +1651 4 2 4 1 380 387 361 425 +1652 4 2 4 1 198 61 288 394 +1653 4 2 4 1 85 379 270 440 +1654 4 2 4 1 111 109 277 377 +1655 4 2 4 1 354 348 352 392 +1656 4 2 4 1 390 401 369 404 +1657 4 2 4 1 178 177 179 390 +1658 4 2 4 1 377 409 362 426 +1659 4 2 4 1 264 263 211 451 +1660 4 2 4 1 239 229 327 444 +1661 4 2 4 1 385 420 383 453 +1662 4 2 4 1 188 186 194 445 +1663 4 2 4 1 167 197 247 409 +1664 4 2 4 1 363 398 374 423 +1665 4 2 4 1 257 109 98 426 +1666 4 2 4 1 197 278 248 409 +1667 4 2 4 1 76 292 204 385 +1668 4 2 4 1 236 381 237 437 +1669 4 2 4 1 242 234 331 448 +1670 4 2 4 1 116 447 402 450 +1671 4 2 4 1 385 367 446 452 +1672 4 2 4 1 46 15 1 326 +1673 4 2 4 1 325 33 2 346 +1674 4 2 4 1 78 307 283 392 +1675 4 2 4 1 381 394 367 435 +1676 4 2 4 1 236 238 244 437 +1677 4 2 4 1 292 204 385 446 +1678 4 2 4 1 210 380 209 438 +1679 4 2 4 1 251 233 258 452 +1680 4 2 4 1 382 367 420 450 +1681 4 2 4 1 24 435 252 452 +1682 4 2 4 1 122 121 407 444 +1683 4 2 4 1 60 79 297 411 +1684 4 2 4 1 24 252 23 452 +1685 4 2 4 1 144 146 143 418 +1686 4 2 4 1 235 237 236 381 +1687 4 2 4 1 232 231 230 384 +1688 4 2 4 1 222 215 64 424 +1689 4 2 4 1 110 100 109 427 +1690 4 2 4 1 320 28 29 386 +1691 4 2 4 1 372 418 363 443 +1692 4 2 4 1 152 151 144 418 +1693 4 2 4 1 169 162 285 420 +1694 4 2 4 1 85 75 270 379 +1695 4 2 4 1 139 116 329 447 +1696 4 2 4 1 367 384 448 452 +1697 4 2 4 1 156 157 155 421 +1698 4 2 4 1 121 249 135 407 +1699 4 2 4 1 153 145 106 414 +1700 4 2 4 1 82 388 33 431 +1701 4 2 4 1 368 407 373 421 +1702 4 2 4 1 310 193 309 399 +1703 4 2 4 1 189 191 190 375 +1704 4 2 4 1 158 159 421 453 +1705 4 2 4 1 246 170 300 449 +1706 4 2 4 1 220 272 129 443 +1707 4 2 4 1 324 15 46 411 +1708 4 2 4 1 321 73 410 425 +1709 4 2 4 1 242 447 231 448 +1710 4 2 4 1 158 159 157 421 +1711 4 2 4 1 332 114 139 402 +1712 4 2 4 1 304 282 265 400 +1713 4 2 4 1 131 315 255 423 +1714 4 2 4 1 51 342 48 439 +1715 4 2 4 1 377 378 365 436 +1716 4 2 4 1 29 63 195 386 +1717 4 2 4 1 62 396 20 449 +1718 4 2 4 1 264 266 104 376 +1719 4 2 4 1 363 405 372 443 +1720 4 2 4 1 57 47 53 401 +1721 4 2 4 1 57 49 317 401 +1722 4 2 4 1 179 311 59 404 +1723 4 2 4 1 361 410 380 425 +1724 4 2 4 1 231 384 232 448 +1725 4 2 4 1 81 330 339 401 +1726 4 2 4 1 208 206 207 417 +1727 4 2 4 1 382 402 367 450 +1728 4 2 4 1 243 253 67 434 +1729 4 2 4 1 226 227 343 374 +1730 4 2 4 1 390 399 369 401 +1731 4 2 4 1 356 346 355 388 +1732 4 2 4 1 257 98 96 426 +1733 4 2 4 1 247 88 86 440 +1734 4 2 4 1 260 252 435 452 +1735 4 2 4 1 24 61 25 394 +1736 4 2 4 1 299 300 170 449 +1737 4 2 4 1 435 446 367 452 +1738 4 2 4 1 366 431 380 438 +1739 4 2 4 1 192 193 399 445 +1740 4 2 4 1 260 233 252 452 +1741 4 2 4 1 40 304 359 282 +1742 4 2 4 1 178 179 184 390 +1743 4 2 4 1 364 372 408 441 +1744 4 2 4 1 379 419 365 432 +1745 4 2 4 1 367 448 435 452 +1746 4 2 4 1 281 158 421 453 +1747 4 2 4 1 161 291 292 446 +1748 4 2 4 1 196 79 342 439 +1749 4 2 4 1 122 120 121 444 +1750 4 2 4 1 345 244 238 437 +1751 4 2 4 1 108 217 203 442 +1752 4 2 4 1 68 404 333 439 +1753 4 2 4 1 343 315 226 374 +1754 4 2 4 1 46 56 55 433 +1755 4 2 4 1 350 347 352 400 +1756 4 2 4 1 216 108 203 387 +1757 4 2 4 1 364 417 399 428 +1758 4 2 4 1 226 337 224 423 +1759 4 2 4 1 23 251 22 452 +1760 4 2 4 1 359 350 40 282 +1761 4 2 4 1 183 308 357 391 +1762 4 2 4 1 116 402 115 450 +1763 4 2 4 1 380 393 366 438 +1764 4 2 4 1 372 405 375 408 +1765 4 2 4 1 308 349 357 391 +1766 4 2 4 1 47 52 53 404 +1767 4 2 4 1 137 272 144 443 +1768 4 2 4 1 68 50 404 439 +1769 4 2 4 1 245 223 222 424 +1770 4 2 4 1 273 378 154 414 +1771 4 2 4 1 172 141 397 441 +1772 4 2 4 1 104 94 95 412 +1773 4 2 4 1 226 374 315 423 +1774 4 2 4 1 285 420 160 453 +1775 4 2 4 1 31 199 32 431 +1776 4 2 4 1 285 160 287 453 +1777 4 2 4 1 51 301 342 439 +1778 4 2 4 1 273 269 134 427 +1779 4 2 4 1 70 305 282 392 +1780 4 2 4 1 73 31 380 425 +1781 4 2 4 1 50 51 48 439 +1782 4 2 4 1 313 8 59 179 +1783 4 2 4 1 174 333 397 439 +1784 4 2 4 1 261 100 269 427 +1785 4 2 4 1 82 296 323 388 +1786 4 2 4 1 263 403 101 451 +1787 4 2 4 1 267 147 145 414 +1788 4 2 4 1 130 129 137 443 +1789 4 2 4 1 363 418 389 449 +1790 4 2 4 1 102 101 99 403 +1791 4 2 4 1 56 46 1 326 +1792 4 2 4 1 356 325 2 346 +1793 4 2 4 1 58 54 60 411 +1794 4 2 4 1 313 59 8 47 +1795 4 2 4 1 362 414 378 427 +1796 4 2 4 1 273 134 345 436 +1797 4 2 4 1 367 420 385 446 +1798 4 2 4 1 372 364 416 441 +1799 4 2 4 1 281 287 158 453 +1800 4 2 4 1 338 283 307 392 +1801 4 2 4 1 365 419 377 430 +1802 4 2 4 1 19 18 246 389 +1803 4 2 4 1 310 192 193 399 +1804 4 2 4 1 362 413 386 440 +1805 4 2 4 1 177 333 68 404 +1806 4 2 4 1 361 415 403 451 +1807 4 2 4 1 185 178 184 390 +1808 4 2 4 1 243 378 240 434 +1809 4 2 4 1 198 25 61 394 +1810 4 2 4 1 273 153 269 427 +1811 4 2 4 1 365 430 377 436 +1812 4 2 4 1 50 52 404 439 +1813 4 2 4 1 116 115 117 450 +1814 4 2 4 1 296 44 358 360 +1815 4 2 4 1 185 390 186 445 +1816 4 2 4 1 377 427 378 436 +1817 4 2 4 1 76 22 205 429 +1818 4 2 4 1 131 289 290 423 +1819 4 2 4 1 189 312 191 375 +1820 4 2 4 1 175 196 174 397 +1821 4 2 4 1 140 130 138 441 +1822 4 2 4 1 263 97 101 403 +1823 4 2 4 1 259 260 66 435 +1824 4 2 4 1 185 184 186 390 +1825 4 2 4 1 20 222 19 449 +1826 4 2 4 1 362 426 395 427 +1827 4 2 4 1 139 329 242 447 +1828 4 2 4 1 276 278 166 419 +1829 4 2 4 1 246 300 19 449 +1830 4 2 4 1 253 26 27 434 +1831 4 2 4 1 174 333 172 397 +1832 4 2 4 1 174 397 196 439 +1833 4 2 4 1 330 81 295 433 +1834 4 2 4 1 348 350 352 392 +1835 4 2 4 1 300 62 20 449 +1836 4 2 4 1 395 414 362 427 +1837 4 2 4 1 262 257 96 426 +1838 4 2 4 1 304 69 39 359 +1839 4 2 4 1 107 149 148 393 +1840 4 2 4 1 225 268 228 422 +1841 4 2 4 1 362 409 379 440 +1842 4 2 4 1 216 203 200 387 +1843 4 2 4 1 240 378 344 437 +1844 4 2 4 1 321 30 73 425 +1845 4 2 4 1 71 194 186 401 +1846 4 2 4 1 31 209 73 380 +1847 4 2 4 1 113 111 133 430 +1848 4 2 4 1 201 89 216 406 +1849 4 2 4 1 32 82 33 431 +1850 4 2 4 1 328 275 69 400 +1851 4 2 4 1 165 167 280 432 +1852 4 2 4 1 87 201 195 406 +1853 4 2 4 1 69 347 39 359 +1854 4 2 4 1 33 82 323 388 +1855 4 2 4 1 364 399 390 445 +1856 4 2 4 1 171 334 316 410 +1857 4 2 4 1 327 242 132 447 +1858 4 2 4 1 50 48 52 439 +1859 4 2 4 1 80 314 298 391 +1860 4 2 4 1 13 60 297 58 +1861 4 2 4 1 99 98 100 395 +1862 4 2 4 1 270 247 86 440 +1863 4 2 4 1 171 147 176 410 +1864 4 2 4 1 308 80 349 391 +1865 4 2 4 1 18 17 72 428 +1866 4 2 4 1 295 49 56 433 +1867 4 2 4 1 269 110 134 427 +1868 4 2 4 1 305 392 338 442 +1869 4 2 4 1 351 283 42 70 +1870 4 2 4 1 125 123 220 398 +1871 4 2 4 1 266 305 271 442 +1872 4 2 4 1 241 243 240 434 +1873 4 2 4 1 314 319 84 438 +1874 4 2 4 1 188 339 193 399 +1875 4 2 4 1 381 435 367 448 +1876 4 2 4 1 172 140 141 441 +1877 4 2 4 1 250 105 142 415 +1878 4 2 4 1 369 401 399 433 +1879 4 2 4 1 210 73 209 380 +1880 4 2 4 1 21 20 62 396 +1881 4 2 4 1 367 383 420 450 +1882 4 2 4 1 168 208 302 416 +1883 4 2 4 1 416 417 364 428 +1884 4 2 4 1 329 116 118 447 +1885 4 2 4 1 123 122 121 407 +1886 4 2 4 1 211 103 148 451 +1887 4 2 4 1 261 99 100 395 +1888 4 2 4 1 107 150 149 393 +1889 4 2 4 1 346 354 355 388 +1890 4 2 4 1 319 182 210 438 +1891 4 2 4 1 167 166 197 419 +1892 4 2 4 1 176 73 334 410 +1893 4 2 4 1 213 310 77 428 +1894 4 2 4 1 136 284 285 450 +1895 4 2 4 1 236 237 238 437 +1896 4 2 4 1 367 435 394 446 +1897 4 2 4 1 200 203 202 387 +1898 4 2 4 1 21 245 20 396 +1899 4 2 4 1 128 126 127 405 +1900 4 2 4 1 56 49 55 433 +1901 4 2 4 1 234 242 231 448 +1902 4 2 4 1 108 271 217 442 +1903 4 2 4 1 78 43 360 283 +1904 4 2 4 1 101 97 99 403 +1905 4 2 4 1 181 314 391 438 +1906 4 2 4 1 346 33 2 323 +1907 4 2 4 1 324 15 1 46 +1908 4 2 4 1 103 105 107 415 +1909 4 2 4 1 317 71 57 401 +1910 4 2 4 1 24 204 61 446 +1911 4 2 4 1 213 77 17 428 +1912 4 2 4 1 177 68 311 404 +1913 4 2 4 1 17 16 206 417 +1914 4 2 4 1 141 174 172 397 +1915 4 2 4 1 307 217 338 442 +1916 4 2 4 1 206 83 207 417 +1917 4 2 4 1 248 257 262 426 +1918 4 2 4 1 313 7 71 47 +1919 4 2 4 1 195 74 30 425 +1920 4 2 4 1 58 324 46 411 +1921 4 2 4 1 296 44 360 78 +1922 4 2 4 1 128 289 126 405 +1923 4 2 4 1 182 181 150 438 +1924 4 2 4 1 260 235 232 448 +1925 4 2 4 1 203 217 307 442 +1926 4 2 4 1 85 86 63 440 +1927 4 2 4 1 188 399 193 445 +1928 4 2 4 1 154 273 344 378 +1929 4 2 4 1 311 59 8 179 +1930 4 2 4 1 215 224 335 424 +1931 4 2 4 1 197 248 91 409 +1932 4 2 4 1 402 447 367 450 +1933 4 2 4 1 57 53 49 401 +1934 4 2 4 1 357 349 353 391 +1935 4 2 4 1 125 124 123 398 +1936 4 2 4 1 351 42 283 348 +1937 4 2 4 1 338 70 283 392 +1938 4 2 4 1 303 72 208 416 +1939 4 2 4 1 128 218 274 408 +1940 4 2 4 1 70 338 305 392 +1941 4 2 4 1 378 434 365 437 +1942 4 2 4 1 123 121 135 407 +1943 4 2 4 1 202 336 82 431 +1944 4 2 4 1 273 154 153 414 +1945 4 2 4 1 304 265 328 400 +1946 4 2 4 1 247 197 91 409 +1947 4 2 4 1 85 270 86 440 +1948 4 2 4 1 166 278 197 419 +1949 4 2 4 1 46 55 54 411 +1950 4 2 4 1 68 50 311 404 +1951 4 2 4 1 141 175 174 397 +1952 4 2 4 1 65 258 268 422 +1953 4 2 4 1 114 115 116 402 +1954 4 2 4 1 69 304 328 400 +1955 4 2 4 1 365 436 378 437 +1956 4 2 4 1 383 367 447 450 +1957 4 2 4 1 87 89 201 406 +1958 4 2 4 1 110 269 100 427 +1959 4 2 4 1 193 330 309 399 +1960 4 2 4 1 254 26 253 434 +1961 4 2 4 1 81 5 49 317 +1962 4 2 4 1 128 219 218 408 +1963 4 2 4 1 36 357 308 349 +1964 4 2 4 1 276 286 133 430 +1965 4 2 4 1 50 68 10 51 +1966 4 2 4 1 122 322 120 444 +1967 4 2 4 1 283 43 360 348 +1968 4 2 4 1 367 384 447 448 +1969 4 2 4 1 12 342 79 60 +1970 4 2 4 1 134 110 112 436 +1971 4 2 4 1 240 154 344 378 +1972 4 2 4 1 7 57 71 47 +1973 4 2 4 1 292 291 204 446 +1974 4 2 4 1 240 243 154 378 +1975 4 2 4 1 192 188 193 445 +1976 4 2 4 1 324 83 15 411 +1977 4 2 4 1 234 231 232 448 +1978 4 2 4 1 132 329 118 447 +1979 4 2 4 1 137 129 272 443 +1980 4 2 4 1 60 79 13 297 +1981 4 2 4 1 189 188 192 445 +1982 4 2 4 1 94 92 93 412 +1983 4 2 4 1 321 73 176 410 +1984 4 2 4 1 254 253 241 434 +1985 4 2 4 1 206 16 83 417 +1986 4 2 4 1 295 4 49 81 +1987 4 2 4 1 341 180 267 413 +1988 4 2 4 1 68 301 10 51 +1989 4 2 4 1 73 30 31 425 +1990 4 2 4 1 22 65 21 429 +1991 4 2 4 1 297 79 340 411 +1992 4 2 4 1 198 288 280 432 +1993 4 2 4 1 30 74 31 425 +1994 4 2 4 1 284 117 115 450 +1995 4 2 4 1 50 47 59 404 +1996 4 2 4 1 132 239 327 444 +1997 4 2 4 1 160 162 161 420 +1998 4 2 4 1 345 332 244 436 +1999 4 2 4 1 18 213 17 428 +2000 4 2 4 1 158 156 281 421 +2001 4 2 4 1 193 339 330 399 +2002 4 2 4 1 358 346 45 323 +2003 4 2 4 1 58 324 14 46 +2004 4 2 4 1 132 242 329 447 +2005 4 2 4 1 194 317 81 401 +2006 4 2 4 1 138 256 141 441 +2007 4 2 4 1 223 224 215 424 +2008 4 2 4 1 151 170 146 418 +2009 4 2 4 1 68 333 301 439 +2010 4 2 4 1 211 263 101 451 +2011 4 2 4 1 139 114 116 402 +2012 4 2 4 1 94 93 95 412 +2013 4 2 4 1 81 339 194 401 +2014 4 2 4 1 237 241 240 437 +2015 4 2 4 1 317 5 49 57 +2016 4 2 4 1 51 301 11 342 +2017 4 2 4 1 168 303 208 416 +2018 4 2 4 1 80 36 308 349 +2019 4 2 4 1 58 297 324 411 +2020 4 2 4 1 258 228 268 422 +2021 4 2 4 1 20 19 300 449 +2022 4 2 4 1 311 179 177 404 +2023 4 2 4 1 308 181 80 391 +2024 4 2 4 1 286 113 133 430 +2025 4 2 4 1 117 284 136 450 +2026 4 2 4 1 181 314 80 391 +2027 4 2 4 1 204 291 61 446 +2028 4 2 4 1 238 240 344 437 +2029 4 2 4 1 105 250 107 415 +2030 4 2 4 1 232 235 234 448 +2031 4 2 4 1 151 146 144 418 +2032 4 2 4 1 52 47 50 404 +2033 4 2 4 1 35 349 298 356 +2034 4 2 4 1 349 80 35 298 +2035 4 2 4 1 158 157 156 421 +2036 4 2 4 1 285 162 160 420 +2037 4 2 4 1 189 187 188 445 +2038 4 2 4 1 24 66 252 435 +2039 4 2 4 1 288 165 280 432 +2040 4 2 4 1 181 182 314 438 +2041 4 2 4 1 22 21 205 429 +2042 4 2 4 1 342 12 48 60 +2043 4 2 4 1 221 326 15 433 +2044 4 2 4 1 194 71 317 401 +2045 4 2 4 1 308 183 181 391 +2046 4 2 4 1 223 215 222 424 +2047 4 2 4 1 322 239 132 444 +2048 4 2 4 1 217 305 338 442 +2049 4 2 4 1 211 101 103 451 +2050 4 2 4 1 160 159 158 453 +2051 4 2 4 1 38 347 69 318 +2052 4 2 4 1 138 141 140 441 +2053 4 2 4 1 221 330 295 433 +2054 4 2 4 1 241 253 243 434 +2055 4 2 4 1 38 347 318 357 +2056 4 2 4 1 217 271 305 442 +2057 4 2 4 1 28 320 67 413 +2058 4 2 4 1 187 185 186 445 +2059 4 2 4 1 83 297 340 411 +2060 4 2 4 1 301 196 342 439 +2061 4 2 4 1 341 67 180 413 +2062 4 2 4 1 252 66 260 435 +2063 4 2 4 1 237 240 238 437 +2064 4 2 4 1 41 40 350 282 +2065 4 2 4 1 357 183 37 308 +2066 4 2 4 1 37 318 183 357 +2067 4 2 4 1 11 48 51 342 +2068 4 2 4 1 295 4 56 49 +2069 4 2 4 1 199 202 82 431 +2070 4 2 4 1 290 337 226 423 +2071 4 2 4 1 251 252 233 452 +2072 4 2 4 1 56 326 295 433 +2073 4 2 4 1 323 45 358 296 +2074 4 2 4 1 134 332 345 436 +2075 4 2 4 1 251 23 252 452 +2076 4 2 4 1 174 196 301 439 +2077 4 2 4 1 287 160 158 453 +2078 4 2 4 1 46 54 58 411 +2079 4 2 4 1 134 112 332 436 +2080 4 2 4 1 176 334 171 410 +2081 4 2 4 1 44 43 360 78 +2082 4 2 4 1 14 297 324 58 +2083 4 2 4 1 174 301 333 439 +2084 4 2 4 1 290 226 315 423 +2085 4 2 4 1 199 82 32 431 +2086 4 2 4 1 180 67 320 413 +2087 4 2 4 1 39 38 347 69 +2088 4 2 4 1 290 315 131 423 +2089 4 2 4 1 13 12 79 60 +2090 4 2 4 1 221 295 326 433 +2091 4 2 4 1 120 322 132 444 +2092 4 2 4 1 297 83 324 411 +2093 4 2 4 1 42 43 283 348 +2094 4 2 4 1 2 45 346 323 +2095 4 2 4 1 324 1 14 46 +2096 4 2 4 1 68 10 9 50 +2097 4 2 4 1 49 4 5 81 +2098 4 2 4 1 153 154 145 414 +2099 4 2 4 1 57 6 7 71 +2100 4 2 4 1 182 319 314 438 +2101 4 2 4 1 42 41 351 70 +2102 4 2 4 1 57 317 6 71 +2103 4 2 4 1 313 8 7 47 +2104 4 2 4 1 154 267 145 414 +2105 4 2 4 1 298 34 35 356 +2106 4 2 4 1 1 3 56 326 +2107 4 2 4 1 325 2 34 356 +2108 4 2 4 1 301 11 10 51 +2109 4 2 4 1 59 8 9 311 +2110 4 2 4 1 39 40 304 359 +2111 4 2 4 1 34 298 325 356 +2112 4 2 4 1 188 187 186 445 +2113 4 2 4 1 11 12 48 342 +2114 4 2 4 1 45 44 358 296 +2115 4 2 4 1 3 4 56 295 +2116 4 2 4 1 318 37 38 357 +2117 4 2 4 1 37 36 357 308 +2118 4 2 4 1 326 3 56 295 +2119 4 2 4 1 35 36 80 349 +2120 4 2 4 1 297 14 13 58 +2121 4 2 4 1 6 5 317 57 +2122 4 2 4 1 423 191 335 375 +2123 4 2 4 1 423 335 191 337 +2124 4 2 4 1 424 214 335 215 +2125 4 2 4 1 424 335 214 375 +2126 4 2 4 1 214 424 64 215 +2127 4 2 4 1 64 424 214 389 +2128 4 2 4 1 422 223 225 268 +2129 4 2 4 1 422 225 223 374 +2130 4 2 4 1 306 411 417 340 +2131 4 2 4 1 417 411 306 369 +2132 4 2 4 1 444 249 119 121 +2133 4 2 4 1 444 119 249 383 +2134 4 2 4 1 406 371 410 386 +2135 4 2 4 1 406 410 371 361 +2136 4 2 4 1 398 279 272 373 +2137 4 2 4 1 398 272 279 220 +2138 4 2 4 1 403 98 99 395 +2139 4 2 4 1 403 99 98 97 +2140 4 2 4 1 343 444 422 239 +2141 4 2 4 1 422 444 343 374 +2142 4 2 4 1 422 227 343 239 +2143 4 2 4 1 343 227 422 374 +2144 4 2 4 1 412 90 406 92 +2145 4 2 4 1 412 406 90 370 +2146 4 2 4 1 413 243 414 341 +2147 4 2 4 1 413 414 243 378 +2148 4 2 4 1 411 52 439 369 +2149 4 2 4 1 411 439 52 54 +2150 4 2 4 1 425 200 199 387 +2151 4 2 4 1 425 199 200 74 +2152 4 2 4 1 375 190 408 405 +2153 4 2 4 1 289 190 408 274 +2154 4 2 4 1 289 408 190 405 +2155 4 2 4 1 441 219 173 140 +2156 4 2 4 1 441 173 219 408 +2157 4 2 4 1 422 245 223 268 +2158 4 2 4 1 422 223 245 396 +2159 4 2 4 1 404 71 47 313 +2160 4 2 4 1 404 47 71 401 +2161 4 2 4 1 431 209 31 380 +2162 4 2 4 1 431 31 209 32 +2163 4 2 4 1 87 440 63 86 +2164 4 2 4 1 63 440 87 386 +2165 4 2 4 1 453 285 136 287 +2166 4 2 4 1 453 136 285 420 +2167 4 2 4 1 453 136 249 287 +2168 4 2 4 1 453 249 136 383 +2169 4 2 4 1 445 194 401 186 +2170 4 2 4 1 445 401 194 399 +2171 4 2 4 1 439 390 333 397 +2172 4 2 4 1 439 333 390 404 +2173 4 2 4 1 177 333 390 397 +2174 4 2 4 1 177 390 333 404 +2175 4 2 4 1 124 423 126 131 +2176 4 2 4 1 126 423 124 398 +2177 4 2 4 1 350 70 41 282 +2178 4 2 4 1 41 70 350 351 +2179 4 2 4 1 414 243 154 267 +2180 4 2 4 1 414 154 243 378 +2181 4 2 4 1 282 359 400 304 +2182 4 2 4 1 282 400 359 350 +2183 4 2 4 1 450 118 116 447 +2184 4 2 4 1 450 116 118 117 +2185 4 2 4 1 451 264 212 211 +2186 4 2 4 1 451 212 264 376 +2187 4 2 4 1 171 415 316 250 +2188 4 2 4 1 316 415 171 410 +2189 4 2 4 1 166 432 167 165 +2190 4 2 4 1 167 432 166 419 +2191 4 2 4 1 452 260 448 435 +2192 4 2 4 1 452 448 260 233 +2193 4 2 4 1 50 311 9 68 +2194 4 2 4 1 50 9 311 59 +2195 4 2 4 1 190 408 187 375 +2196 4 2 4 1 190 187 408 274 +2197 4 2 4 1 445 187 408 375 +2198 4 2 4 1 187 408 185 445 +2199 4 2 4 1 187 185 408 274 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/run.py b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/run.py new file mode 100644 index 00000000..2698abbc --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/run.py @@ -0,0 +1,118 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .mesh_gen import generate_beam3D_circular_tet +from .sofa_scene import sofaRun + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "3D — Circular beam, bending (transverse load)" + +MATH_DESCRIPTION = """ +Poutre 3D a section circulaire (rayon r, longueur L), encastree sur la +face x=0 (label 1, Fixed), soumise a une traction transverse uniforme +vers le bas (-y) sur la face x=L (label 2, Loaded) : contrainte +q = F/A avec A = pi*r^2 -> flexion (pas de traction axiale ici). + + -div(sigma) = 0 dans Omega + sigma.n = (0, -q, 0) sur la face Loaded (x=L) + u = 0 sur la face Fixed (x=0) + +Elasticite 3D complete : + lambda = E*nu / ((1+nu)(1-2nu)), mu = E / (2(1+nu)) + +Pas de reference analytique ici : les formules de Saint-Venant du cas +traction axiale ne s'appliquent pas a de la flexion. Une reference +Euler-Bernoulli/Timoshenko pourrait etre ajoutee separement si besoin, +mais n'est pas fournie dans le script de base -> comparaison SOFA vs +FreeFem uniquement (RMS separement sur ux, uy, uz). +""" + + +def _load_mesh_cfg(): + with open(os.path.join(HERE, "params_mesh.json")) as f: + return json.load(f)["beam3d_circle_tet"] + + +def _load_phys_cfg(): + with open(os.path.join(HERE, "params_beam3d_circle_bending.json")) as f: + return json.load(f) + + +def _mesh_path(meshfile): + return os.path.join(HERE, "results", meshfile) + + +def _match_by_coordinates(coords_a, vals_a, coords_b, vals_b, tol=1e-6): + """Appariement par plus proche voisin (fidele a + comparaison_script3d_circle_bending.py).""" + matched_a, matched_b, matched_coords = [], [], [] + for i, c in enumerate(coords_a): + d = np.linalg.norm(coords_b - c, axis=1) + j = np.argmin(d) + if d[j] > tol: + continue + matched_coords.append(c) + matched_a.append(vals_a[i]) + matched_b.append(vals_b[j]) + return np.array(matched_coords), np.array(matched_a), np.array(matched_b) + + +def run_case(): + mesh_cfg = _load_mesh_cfg() + phys_cfg = _load_phys_cfg() + + length = float(mesh_cfg["length"]) + radius = float(mesh_cfg["radius"]) + E = float(phys_cfg["youngModulus"]) + nu = float(phys_cfg["poissonRatio"]) + q = float(phys_cfg["q"]) + + # --- Maillage : genere s'il n'existe pas deja (meme geometrie que + # circular_traction, mais chaque cas reste autonome) --- + msh_path = _mesh_path(mesh_cfg["meshfile"]) + if not os.path.isfile(msh_path): + os.makedirs(os.path.dirname(msh_path), exist_ok=True) + generate_beam3D_circular_tet( + length=length, radius=radius, + mesh_size=float(mesh_cfg["mesh_size"]), + filename=msh_path, # chemin absolu -> ecrit exactement ici + ) + + # --- FreeFem++ --- + F = q * (np.pi * radius**2) + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3d_circle_bending.edp")) + exports = runner.execute({ + "meshfile": os.path.abspath(msh_path), + "E": E, "nu": nu, "F": F, "radius": radius, "length": length, + }, verbosity=0) + ux_ff = np.asarray(exports["ux[]"]) + uy_ff = np.asarray(exports["uy[]"]) + uz_ff = np.asarray(exports["uz[]"]) + coords_ff = np.column_stack([exports["xcoords"], exports["ycoords"], exports["zcoords"]]) + + # --- SOFA --- + coords_sofa, u_sofa = sofaRun(mesh_file=msh_path, q=q, + young_modulus=E, poisson_ratio=nu) + + # --- Appariement (plus proche voisin, par composante) --- + tol = 1e-6 * max(length, radius) + coords_m, ux_sofa_m, ux_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 0], coords_ff, ux_ff, tol=tol) + _, uy_sofa_m, uy_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 1], coords_ff, uy_ff, tol=tol) + _, uz_sofa_m, uz_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 2], coords_ff, uz_ff, tol=tol) + + u_sofa_m = np.column_stack([ux_sofa_m, uy_sofa_m, uz_sofa_m]) + u_ff_m = np.column_stack([ux_ff_m, uy_ff_m, uz_ff_m]) + + return { + "label": LABEL, + "dim": 3, + "coords_ff": coords_m, + "u_ff": u_ff_m, + "coords_sofa": coords_m, + "u_sofa": u_sofa_m, + "u_ana": None, + "component_names": ["ux", "uy", "uz"], + } diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_bending/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/sofa_scene.py new file mode 100644 index 00000000..73d81836 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_bending/sofa_scene.py @@ -0,0 +1,168 @@ +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + + +def consistent_traction_forces(nodes, loaded_faces, q): + + N = len(nodes) + F = np.zeros((N, 3)) + for tri in loaded_faces: + pts = nodes[tri, :] + v1 = pts[1] - pts[0] + v2 = pts[2] - pts[0] + area = 0.5 * np.linalg.norm(np.cross(v1, v2)) + for nid in tri: + F[nid, 1] -= q * area / 3.0 + return F + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), + RESULTS_DIR, "beam3d_circle_tet.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3d_circle_bending.json") + + +def create_scene_args(rootNode, mesh_file, q, young_modulus, poisson_ratio, tol=1e-6): + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + if not os.path.isfile(mesh_file): + raise FileNotFoundError( + f"Maillage introuvable : {mesh_file}\n" + f"-> generate it first : python beam3d_circular_tet.py params.json" + ) + + loader = Beam.addObject('MeshGmshLoader', name="loader", filename=mesh_file) + + nodes = np.array(loader.position.value) + tets = np.array(loader.tetrahedra.value) + tris = np.array(loader.triangles.value) + N = len(nodes) + + x_min = nodes[:, 0].min() + x_max = nodes[:, 0].max() + fixed_idx = np.where(np.isclose(nodes[:, 0], x_min, atol=tol))[0].tolist() + loaded_mask = np.all(np.isclose(nodes[tris, 0], x_max, atol=tol), axis=1) + loaded_faces = tris[loaded_mask] + + assert len(fixed_idx) > 0, "error " + assert len(loaded_faces) > 0, " (x_max) not found " + + F_nodal = consistent_traction_forces(nodes, loaded_faces, q) + forces_list = F_nodal.tolist() + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position="@loader.position" + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TetrahedronSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TetrahedronSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + Beam.addObject('ConstantForceField' + , name="LoadedBending" + , indices=list(range(N)) + , forces=forces_list) + + return rootNode, dofs, nodes.copy() + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) + return rootNode + + +def sofaRun(mesh_file, q, young_modulus, poisson_ratio): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + u = pos_final[:, :3] - pos0[:, :3] + x0 = pos0[:, :3] + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, "sofa_beam3d_circle_bending_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'z0':>12} {'ux':>12} {'uy':>12} {'uz':>12}\n") + f.write("-" * 78 + "\n") + for (xi, yi, zi), (uxi, uyi, uzi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {zi:12.6f} {uxi:12.6f} {uyi:12.6f} {uzi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/freefem_beam3d_circle_traction.edp b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/freefem_beam3d_circle_traction.edp new file mode 100644 index 00000000..3e4e584c --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/freefem_beam3d_circle_traction.edp @@ -0,0 +1,75 @@ +IMPORT "io.edp" +load "msh3" +load "gmsh" + +DEFAULT (meshfile, "beam3d_circle_tet.msh") +DEFAULT (E, 210000.0) +DEFAULT (nu, 0.3) +DEFAULT (F, 1000.0) +DEFAULT (radius, 0.1) +DEFAULT (length, 1.0) +DEFAULT (exclusionFactor, 2.0) + +real E = $E; +real nu = $nu; +real F = $F; +real radius = $radius; +real length = $length; +real exclusionFactor = $exclusionFactor; + +real A = pi*radius^2; +real q = F/A; + +real lambda = E*nu/((1.+nu)*(1.-2.*nu)); +real mu = E/(2.*(1.+nu)); + + +mesh3 Th = gmshload3("$meshfile"); + + +fespace Vh(Th, P1); +Vh ux, uy, uz, vx, vy, vz; + +solve Elasticity([ux, uy, uz], [vx, vy, vz]) = + int3d(Th)( + lambda*(dx(ux)+dy(uy)+dz(uz))*(dx(vx)+dy(vy)+dz(vz)) + + mu*( 2.*dx(ux)*dx(vx) + 2.*dy(uy)*dy(vy) + 2.*dz(uz)*dz(vz) + + (dy(ux)+dx(uy))*(dy(vx)+dx(vy)) + + (dz(ux)+dx(uz))*(dz(vx)+dx(vz)) + + (dz(uy)+dy(uz))*(dz(vy)+dy(vz)) ) + ) + - int2d(Th, 2)( q*vx ) + + on(1, ux=0, uy=0, uz=0); + +exportArray(ux[]); +exportArray(uy[]); +exportArray(uz[]); + +real[int] xcoords(Th.nv); +real[int] ycoords(Th.nv); +real[int] zcoords(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; + zcoords[i] = Th(i).z; +} +exportArray(xcoords); +exportArray(ycoords); +exportArray(zcoords); + +real exclusionx = exclusionFactor*radius; + +real sumSqUx = 0., sumSqUy = 0., sumSqUz = 0.; +int nCompared = 0; +for (int i = 0; i < Th.nv; i++) { + real xi = Th(i).x, yi = Th(i).y, zi = Th(i).z; + if (xi < exclusionx) continue; + real uxAn = (F/(E*A))*xi; + real uyAn = -nu*(F/(E*A))*yi; + real uzAn = -nu*(F/(E*A))*zi; + sumSqUx += (ux[](i) - uxAn)^2; + sumSqUy += (uy[](i) - uyAn)^2; + sumSqUz += (uz[](i) - uzAn)^2; + nCompared++; +} + diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/mesh_gen.py b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/mesh_gen.py new file mode 100644 index 00000000..0c0223d1 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/mesh_gen.py @@ -0,0 +1,70 @@ +import json +import os +import sys +import gmsh + +RESULTS_DIR = "results" + + +def generate_beam3D_circular_tet(length, radius, mesh_size, filename): + + gmsh.initialize() + gmsh.model.add("beam3d_circular_tet") + + disk_fixed = gmsh.model.occ.addDisk(0, 0, 0, radius, radius, + zAxis=[1, 0, 0], xAxis=[0, 1, 0]) + gmsh.model.occ.synchronize() + + + out = gmsh.model.occ.extrude([(2, disk_fixed)], length, 0, 0) + gmsh.model.occ.synchronize() + + vol_tag = [e[1] for e in out if e[0] == 3][0] + surf_tags = [e[1] for e in out if e[0] == 2] + + disk_loaded = None + lateral = None + for s in surf_tags: + xmin, ymin, zmin, xmax, ymax, zmax = gmsh.model.occ.getBoundingBox(2, s) + if abs(xmax - xmin) < 1e-6: + disk_loaded = s + else: + lateral = s + + assert disk_loaded is not None and lateral is not None, \ + "Could not identify end cap" + + gmsh.model.addPhysicalGroup(2, [disk_fixed], tag=1, name="Fixed") + gmsh.model.addPhysicalGroup(2, [disk_loaded], tag=2, name="Loaded") + gmsh.model.addPhysicalGroup(2, [lateral], tag=3, name="Lateral") + gmsh.model.addPhysicalGroup(3, [vol_tag], tag=4, name="Beam") + + gmsh.model.mesh.setSize(gmsh.model.getEntities(0), mesh_size) + + gmsh.model.mesh.generate(3) + gmsh.model.mesh.setOrder(1) + _, node_coords, _ = gmsh.model.mesh.getNodes() + + os.makedirs(RESULTS_DIR, exist_ok=True) + msh_path = os.path.join(RESULTS_DIR, filename) + gmsh.option.setNumber("Mesh.MshFileVersion", 2.2) + gmsh.write(msh_path) + gmsh.finalize() + + return msh_path, len(node_coords) // 3 + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else "params.json" + with open(config_file) as f: + all_cfg = json.load(f) + cfg = all_cfg["beam3d_circle_tet"] + + msh_path, n_nodes = generate_beam3D_circular_tet( + length=float(cfg["length"]), + radius=float(cfg["radius"]), + mesh_size=float(cfg["mesh_size"]), + filename=cfg.get("meshfile"), + ) + print("Wrote:", msh_path) + print("Number of nodes:", n_nodes) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_beam3d_circle_traction.json b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_beam3d_circle_traction.json new file mode 100644 index 00000000..8ba89712 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_beam3d_circle_traction.json @@ -0,0 +1,8 @@ +{ + "length": 1.0, + "radius": 0.1, + "youngModulus": 210000.0, + "poissonRatio": 0.3, + "q": 31830.988618, + "exclusionFactor": 2.0 +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_mesh.json b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_mesh.json new file mode 100644 index 00000000..2e2cae32 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/params_mesh.json @@ -0,0 +1,8 @@ +{ + "beam3d_circle_tet": { + "length": 1.0, + "radius": 0.1, + "mesh_size": 0.05, + "meshfile": "beam3d_circle_tet.msh" +} +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/results/beam3d_circle_tet.msh b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/results/beam3d_circle_tet.msh new file mode 100644 index 00000000..6adc84a8 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/results/beam3d_circle_tet.msh @@ -0,0 +1,2668 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +4 +2 1 "Fixed" +2 2 "Loaded" +2 3 "Lateral" +3 4 "Beam" +$EndPhysicalNames +$Nodes +453 +1 0 0.1 0 +2 1 0.1 0 +3 0 0.088545602565321 0.04647231720437685 +4 0 0.05680647467311559 0.08229838658936564 +5 0 0.01205366802553232 0.0992708874098054 +6 0 -0.03546048870425355 0.09350162426854149 +7 0 -0.07485107481711009 0.06631226582407955 +8 0 -0.0970941817426052 0.02393156642875581 +9 0 -0.09709418174260522 -0.02393156642875574 +10 0 -0.07485107481711013 -0.06631226582407949 +11 0 -0.03546048870425359 -0.09350162426854147 +12 0 0.01205366802553223 -0.09927088740980541 +13 0 0.05680647467311556 -0.08229838658936567 +14 0 0.08854560256532096 -0.04647231720437692 +15 0.05 0.1 0 +16 0.1 0.1 0 +17 0.15 0.1 0 +18 0.2 0.1 0 +19 0.25 0.1 0 +20 0.3 0.1 0 +21 0.35 0.1 0 +22 0.4 0.1 0 +23 0.45 0.1 0 +24 0.5 0.1 0 +25 0.55 0.1 0 +26 0.6 0.1 0 +27 0.65 0.1 0 +28 0.7 0.1 0 +29 0.75 0.1 0 +30 0.8 0.1 0 +31 0.85 0.1 0 +32 0.9 0.1 0 +33 0.95 0.1 0 +34 1 0.088545602565321 0.04647231720437685 +35 1 0.05680647467311559 0.08229838658936564 +36 1 0.01205366802553232 0.0992708874098054 +37 1 -0.03546048870425355 0.09350162426854149 +38 1 -0.07485107481711009 0.06631226582407955 +39 1 -0.0970941817426052 0.02393156642875581 +40 1 -0.09709418174260522 -0.02393156642875574 +41 1 -0.07485107481711013 -0.06631226582407949 +42 1 -0.03546048870425359 -0.09350162426854147 +43 1 0.01205366802553223 -0.09927088740980541 +44 1 0.05680647467311556 -0.08229838658936567 +45 1 0.08854560256532096 -0.04647231720437692 +46 0 0.05903474758501662 -0.01508958080940203 +47 0 -0.0492698659733555 0.02585882046984534 +48 0 -0.006707081897908891 -0.05523778907178359 +49 0 0.02248904019415254 0.05242633510007481 +50 0 -0.04926986597335551 -0.0258588204698453 +51 0 -0.04157212784815703 -0.06022762490856246 +52 0 -0.01118075978364661 -0.007009767007613534 +53 0 -0.004613279163841614 0.03040663489853741 +54 0 0.02382287111292555 -0.03041862635662273 +55 0 0.02540110428852566 0.0086268742639045 +56 0 0.05871282821768856 0.02912238872471996 +57 0 -0.02160866673981265 0.06129609466181399 +58 0 0.05297152495156948 -0.04790590352414643 +59 0 -0.07318202385798035 2.575175938670205e-17 +60 0 0.02647850445689395 -0.06531239184665578 +61 0.525 0.09062500000002606 -0.04227421643265879 +62 0.325 0.09062500000002606 -0.04227421643265879 +63 0.7247321929054121 0.0906014768281314 -0.04232460745903702 +64 0.2249088558909533 0.0906489382497534 0.04222286103750427 +65 0.3749610379574955 0.09047909499018243 0.04258560049779204 +66 0.5246955176948944 0.09051631449690881 0.0425064325708086 +67 0.675 0.09062499999998612 0.04227421643274441 +68 0.03666694290009229 -0.08891669253546225 -0.04575829748312402 +69 0.9609644721730408 -0.08854944395130865 0.04646499731963891 +70 0.9586512897969375 -0.05680647467311559 -0.08229838658936564 +71 0.04544577857965489 -0.05560921000961699 0.08311206748785832 +72 0.175 0.09062499999999643 -0.04227421643272229 +73 0.825 0.09062500000000127 0.04227421643271193 +74 0.8248931136068336 0.09059133196679657 -0.0423463171064694 +75 0.625 0.09062499999999224 -0.04227421643273131 +76 0.425 0.09062500000002155 -0.04227421643266845 +77 0.1250009001578968 0.09070593679524616 0.0421002735157007 +78 0.9586512897969832 0.03546048870425347 -0.09350162426854153 +79 0.04164187172384426 0.03191073153718672 -0.09477185875966344 +80 0.9658904809486353 0.03481410377083859 0.09374421677433378 +81 0.03827501585519767 0.03080415301980048 0.09513729109414834 +82 0.925 0.09062499999911637 -0.04227421643460893 +83 0.07500000000000001 0.09062499999911637 -0.04227421643460893 +84 0.925 0.09062500000013259 0.04227421643243041 +85 0.6752320498676275 0.09068291833657185 -0.04214983181416791 +86 0.7000624132814768 0.06466582215711908 -0.0762779879437302 +87 0.7498988332380633 0.06456123959783609 -0.07636652631612101 +88 0.7245421674008413 0.02693135541666405 -0.09630525476536221 +89 0.7737433283748976 0.02668491551283694 -0.09637383090898044 +90 0.7489053100394862 -0.01566799335109586 -0.09876494309394411 +91 0.6996276966443704 -0.01543037628960932 -0.09880234555698091 +92 0.7978687571129536 -0.01599341965472191 -0.09871276780512213 +93 0.7731820383046505 -0.05534604550484238 -0.08328754556940622 +94 0.8219497588039285 -0.05546759337657525 -0.08320664687998734 +95 0.7974721447078672 -0.0849173709008768 -0.05281136354311375 +96 0.7484732708638802 -0.08479806616815706 -0.0530027166675526 +97 0.7726817758717098 -0.09915825531423005 -0.01294760221191441 +98 0.723603664743387 -0.0991347233870216 -0.01312656158248281 +99 0.748037999754442 -0.09555798350608255 0.02947323850972701 +100 0.6987582308766007 -0.09561984135551542 0.02927193090908189 +101 0.7972300695270704 -0.09548572355816019 0.02970650764688798 +102 0.7724706792186732 -0.07458083013967907 0.0666160624450015 +103 0.8216014995405123 -0.07439996384557944 0.06681800191397878 +104 0.8463572140533971 -0.08507202158464294 -0.05256187918541388 +105 0.7969374523856195 -0.03998649918829657 0.09165740495270613 +106 0.747656015441033 -0.04010951759187911 0.0916036385660894 +107 0.8460065238346298 -0.03987458816960292 0.09170614602252437 +108 0.8468668197836117 -0.01633624148899725 -0.09865661262182665 +109 0.6742960383492299 -0.09909733869241022 -0.01340587423787565 +110 0.6493989625512538 -0.09568123809520412 0.02907061534554882 +111 0.6248877393899903 -0.09905869030996697 -0.01368853074928267 +112 0.6000089224118225 -0.09574425161895329 0.02886240256677464 +113 0.5753855130989914 -0.09901889312999121 -0.01397350361617946 +114 0.550573609813195 -0.09596093641822531 0.02813358636465177 +115 0.5258216682620488 -0.09897904773116778 -0.01425300355122426 +116 0.5006958271755022 -0.09606902327249559 0.02776225436575175 +117 0.4762459976751384 -0.09893412377097968 -0.01456156425898242 +118 0.4512708480514874 -0.09617122963647042 0.02740610498062934 +119 0.4267028039134228 -0.09888914180390823 -0.0148639709797392 +120 0.4013884415242719 -0.09623494179536446 0.0271815374407486 +121 0.3771162807477543 -0.09884511279475673 -0.01515399869974323 +122 0.352014732682948 -0.09632756704543945 0.02685143994474727 +123 0.3275273708654057 -0.09880860296755857 -0.01539025599525153 +124 0.302576677150529 -0.09629414647479811 0.0269710465998286 +125 0.2782127946004221 -0.09878183414901842 -0.01556114527134232 +126 0.253409221529746 -0.096345761825942 0.0267860817996746 +127 0.2289172588985519 -0.09875851994739632 -0.01570842887750794 +128 0.2044180140992862 -0.09644522694681602 0.02642571094932269 +129 0.2537171581342478 -0.08332970073002993 -0.05528255580419242 +130 0.2046702979030801 -0.0832344981037863 -0.05542579115728341 +131 0.2776077874154967 -0.07618728704380684 0.06477265852892394 +132 0.4240569955268227 -0.07699436747042367 0.06381118536612031 +133 0.6002183681181599 -0.08427335189967741 -0.05383309539301208 +134 0.6294270633228001 -0.07540663365380589 0.06567982643857026 +135 0.3526692694488349 -0.08339122563532846 -0.05518970453841676 +136 0.4516568605179293 -0.08365503178598344 -0.05478901036600407 +137 0.2292773109461138 -0.0528929332046538 -0.08486658716484381 +138 0.1803495240305886 -0.05276705530766342 -0.08494491081964822 +139 0.5234245126049405 -0.0767614566080424 0.06409117551903402 +140 0.1558352619409007 -0.08308694493319645 -0.05564673918270488 +141 0.131576980445584 -0.05267925330461507 -0.08499938982879938 +142 0.7721829027016203 0.001902972432155912 0.09998189184008499 +143 0.2049582842160574 -0.01281596285367196 -0.09917535528614607 +144 0.2541131259752866 -0.01295335803967707 -0.09915750357636044 +145 0.722723305071527 0.001775964381053817 0.0999842285088865 +146 0.2296409253779692 0.02953987309665257 -0.09553740574996614 +147 0.7473590501439606 0.04357796970494957 0.09000533626621535 +148 0.8703053954109863 -0.07414235675426961 0.06710373264523078 +149 0.8947588444202585 -0.0397014198956771 0.09178124676788356 +150 0.8703066061185374 0.001296205695217692 0.09999159890108611 +151 0.2789672212037499 0.02936778057740318 -0.09559044650987619 +152 0.3034188721787029 -0.01318774803595798 -0.0991266023917903 +153 0.6984923938029713 -0.04039727276896418 0.09147710288826327 +154 0.6731578479774077 0.001598013646085534 0.09998723094669101 +155 0.328259286727802 0.0290991827147477 -0.0956725538769282 +156 0.3528409357716168 -0.0134439178665752 -0.09909218471906239 +157 0.3774832308994978 0.0289057384805023 -0.09573117717283544 +158 0.402296027414197 -0.01369189586101478 -0.09905822524016432 +159 0.4269566404967688 0.02875624228642785 -0.09577618978412254 +160 0.4517812488109106 -0.01399210086594966 -0.0990162669128517 +161 0.4764849461597911 0.02845342168412643 -0.09586658852001194 +162 0.5012831885587484 -0.01419683775280103 -0.09898711935307869 +163 0.52598312885278 0.02831592942135774 -0.09590728930068187 +164 0.5507429643292465 -0.01444894809045619 -0.09895063364667911 +165 0.5755715787931375 0.02807899699600199 -0.0959769239333003 +166 0.600232769058864 -0.01469971307616794 -0.09891369185041239 +167 0.625161221771425 0.02780215099729346 -0.09605748487194371 +168 0.180357708111076 0.02974196587615833 -0.09547468494748457 +169 0.5258217444268484 -0.05445515199553377 -0.08387273943984014 +170 0.2542892890625685 0.06576713275512143 -0.07533050012558151 +171 0.792194306504495 0.04288275405199386 0.09033863738686899 +172 0.1118391256429288 -0.08272182357873575 -0.05618807617109274 +173 0.1311475248033561 -0.09859844232565002 -0.01668373971732563 +174 0.08549152706759754 -0.05285725499598931 -0.08488881312804981 +175 0.1074539593955709 -0.01326051613915361 -0.09911689417916225 +176 0.7720458362426075 0.07737175716454675 0.06335306774948164 +177 0.08265394967134061 -0.09855651823025352 -0.01692964011223233 +178 0.1066979998314181 -0.09680112063822501 0.02509069634712856 +179 0.05468438740794547 -0.09693980049595211 0.02454944153753816 +180 0.7258171343268301 0.07691628590269689 0.06390528118187569 +181 0.9171042791674254 0.002073358924080724 0.09997850360338434 +182 0.8858000321707828 0.04212842747081245 0.09069286410096715 +183 0.9410832598426677 -0.03801335331510997 0.09249316174583189 +184 0.08229263481356194 -0.07814178422857621 0.06240081375731121 +185 0.1305463366779104 -0.07800186384096727 0.06257562814175503 +186 0.1062268649603983 -0.04549973859886018 0.08904927729878213 +187 0.1547981211774539 -0.04520894145258858 0.08919726236122059 +188 0.1277643166088349 -0.00390202595352298 0.09992384196706026 +189 0.1782568541798167 -0.004278196657176173 0.09990844325362361 +190 0.2031096337593761 -0.04482932585208761 0.08938865444589347 +191 0.2232412751332632 -0.004715701937994187 0.09988874889211496 +192 0.1519408955049489 0.03686856959622076 0.09295541176246075 +193 0.1138358334183953 0.03830260098107234 0.09237375578639616 +194 0.06561370415662733 -0.01234698153707487 0.09923483283063027 +195 0.7743358382262885 0.09045935202594169 -0.04262752199045541 +196 0.06609593995459039 -0.01311700179329851 -0.09913598874250766 +197 0.6496350314302461 -0.0149244305400869 -0.0988800352601784 +198 0.5752180010786554 0.09067941719048145 -0.04215736350858077 +199 0.8752357336050889 0.09068383625908605 -0.0421478569008588 +200 0.8497517649437336 0.06451604707712674 -0.07640470973403385 +201 0.7996112490675489 0.0645335082611674 -0.07638996211221628 +202 0.8892488815233911 0.06383114162050996 -0.07697782381583934 +203 0.8749183607220022 0.02708740268814036 -0.0962614804353773 +204 0.4748051161967255 0.09067365455518096 -0.04216975657515361 +205 0.3748141847208678 0.09067139345883567 -0.04217461805675321 +206 0.1247688085207812 0.09068270443447932 -0.0421502920090581 +207 0.1107099651872024 0.06392444116388561 -0.07690036295028085 +208 0.1554132169399485 0.06465291690042398 -0.07628892669494619 +209 0.8749473706797958 0.09084143004524312 0.04180711168372198 +210 0.8557948979976452 0.07008063157824826 0.07133516017781016 +211 0.8462780245282533 -0.09537260004577927 0.03006770959863461 +212 0.8907561183038731 -0.09540127364950975 0.02997660731389325 +213 0.174875907596821 0.09081879899554073 0.04185625101472386 +214 0.2028197549433827 0.06444837540995195 0.07646180031242988 +215 0.2515105979437889 0.06474217659866309 0.07621319156988193 +216 0.823970716775739 0.02683370852825769 -0.09633250794316793 +217 0.8900327364104292 -0.01790072755320826 -0.09838477500642978 +218 0.1551671736588479 -0.09672463011316022 0.02538396993128419 +219 0.1797185123863067 -0.09863233514212588 -0.01648218627522947 +220 0.3031169538710634 -0.08336841721874559 -0.05522415241940039 +221 0.07513637735263529 0.09065906182150785 0.0422011197676557 +222 0.275 0.09062500000002828 0.04227421643265401 +223 0.3002211267147768 0.0642304028527295 0.07664499559251131 +224 0.2741363190049307 0.02612598596324274 0.09652685044819626 +225 0.3237726326305602 0.02578199996148754 0.09661929661297404 +226 0.2986533989505137 -0.01695894431565721 0.09855147998735705 +227 0.3490056771495798 -0.01677857276567286 0.09858234880518429 +228 0.3734756709863143 0.02547228516730384 0.0967014099605355 +229 0.3979282262300922 -0.01773142033551271 0.09841542934360124 +230 0.4231462329924285 0.02509853977116485 0.09679908729608588 +231 0.4475237976689056 -0.01767083509504732 0.09842632568090533 +232 0.4728821523231145 0.02474413071179501 0.09689028844686966 +233 0.4483182783090968 0.06337563730400941 0.07735327140018483 +234 0.4977956407834336 -0.01785397447145672 0.09839327007256427 +235 0.52266936461721 0.02439106048457763 0.0969797719549684 +236 0.5475853688843231 -0.01815443764858781 0.09833827532382057 +237 0.5724469404413105 0.02402266062896407 0.09707168369975676 +238 0.596972387812323 -0.01929711918993835 0.09812044226851668 +239 0.3739721874881208 -0.05674421844180901 0.08234132421468739 +240 0.6221735457173504 0.02359101995170563 0.09717748596068036 +241 0.5976350671510985 0.06246262350478224 0.07809238544762112 +242 0.4734948890588048 -0.05501386512023957 0.08350733287880825 +243 0.6474351460529207 0.06215432017785976 0.07833798876169912 +244 0.5663722131482889 -0.05548811430485592 0.08319296346982265 +245 0.3248788707268807 0.09040114570469242 0.04275082286084061 +246 0.2248814579325742 0.09065461094848191 -0.04221068009141032 +247 0.6752866912429786 0.02713334613483909 -0.09624854039167043 +248 0.6745365215990767 -0.05496131776549656 -0.08354192689590129 +249 0.4020850981980664 -0.08355409638540079 -0.05494281551958505 +250 0.8210696069975196 0.001291905294989635 0.09999165455531166 +251 0.4248198384748114 0.09054526678751265 0.04244472478857837 +252 0.4745831291382883 0.09050973116045632 0.04252044878951682 +253 0.6251813367651564 0.09038000694781968 0.04279549443705572 +254 0.5750142610370313 0.09027457439763786 0.04301745247368036 +255 0.3269431628907761 -0.07590354641226338 0.06510492793976029 +256 0.1561508423063196 -0.01307875037164717 -0.09914104240281187 +257 0.6990484657645646 -0.08462921302037221 -0.05327190914123939 +258 0.3985680555958067 0.06363060442425023 0.07714367233029931 +259 0.5479397956903685 0.06279462019249718 0.07782567490796355 +260 0.4980848001500697 0.06306865803992286 0.07760376519888243 +261 0.7231904385259066 -0.0747078271254733 0.06647360804251862 +262 0.7239635678908372 -0.05515016747497944 -0.08341737845006711 +263 0.8215907657798855 -0.09916879962923715 -0.01286659162700884 +264 0.8710701290177836 -0.09929985837187764 -0.01181262575912071 +265 0.9196835844894277 -0.09935509001449794 -0.01133869870007203 +266 0.895425754847758 -0.08655723710702276 -0.05007838560096205 +267 0.6977900532596697 0.04344563043778987 0.09006929108116143 +268 0.3490869471358209 0.06382003422919341 0.07698703287557317 +269 0.6762795666283116 -0.07502013299478474 0.0661209471003313 +270 0.6504715363509287 0.06495922891932127 -0.07602827486012829 +271 0.8684869014708732 -0.0559165282817311 -0.08290562022515946 +272 0.2785877450790024 -0.05305904068786566 -0.08476283502386772 +273 0.6543923213838043 -0.04143167265351554 0.0910132765102539 +274 0.1788908683817996 -0.07758999523324264 0.06308559772012455 +275 0.9185220733774295 -0.07365441144425043 0.06763895087005026 +276 0.5754136126237446 -0.05457746897964573 -0.08379319709723343 +277 0.6496651976491155 -0.08446956245783493 -0.05352469540484955 +278 0.6252745541384392 -0.05470452996528903 -0.08371030044908928 +279 0.3279653718709938 -0.05324759037460799 -0.08464451617971452 +280 0.600624905463449 0.06516135069840485 -0.07585511436389437 +281 0.3774301402055493 -0.05341849094607594 -0.08453676611418255 +282 0.948402202131462 -0.08813635905015187 -0.04724385900180801 +283 0.9631254982043859 -0.01025657366463381 -0.09947262285001809 +284 0.5009028216641521 -0.08403288127069136 -0.05420770116271202 +285 0.476484861148284 -0.05374689814530066 -0.08432835193313502 +286 0.5505536839584981 -0.08428725486424489 -0.05381132471376102 +287 0.4269831137584812 -0.05357427776009077 -0.08443812386881085 +288 0.550230372293343 0.06536296898967305 -0.0756814527136936 +289 0.2282247595386515 -0.07705983498560229 0.0637321098975371 +290 0.2518480247539022 -0.04415719952999245 0.08972258204971832 +291 0.5003662592346333 0.0654474913494195 -0.07560837173268353 +292 0.4508092118418056 0.06560936407693238 -0.07546794912690112 +293 0.4007400863717974 0.06573414883222869 -0.07535928394897611 +294 0.3519650700780498 0.06531252226235558 -0.07572499214743643 +295 0.03364619669421869 0.07441066279173963 0.06680608701977699 +296 0.9665975116140474 0.07487785962560076 -0.06628201971793579 +297 0.03342664072238798 0.0745926036306542 -0.06660287894378225 +298 0.9644902674001012 0.07464387006054654 0.0665454180419978 +299 0.3034782362519676 0.06535504133610616 -0.07568829877831748 +300 0.2773145027301543 0.09119428627707182 -0.04103172127044478 +301 0.0379914345031872 -0.05680647467311559 -0.08229838658936564 +302 0.1315103335664333 0.02697105307224849 -0.09629414466193652 +303 0.2039815111281687 0.06530050246572666 -0.07573535751367143 +304 0.9606120935550899 -0.0999999110731674 -0.0001333617584379002 +305 0.9144741865159695 -0.05902480153744941 -0.08072219523442553 +306 0.08655002157616598 0.02439406793783185 -0.09697901551080236 +307 0.917922925026908 0.02036046151971678 -0.09790531960370762 +308 0.9627123460477456 -0.004727563765038709 0.09988818819483861 +309 0.107533216107368 0.07150281393547574 0.06990956729453228 +310 0.1499852469597218 0.07159595915112855 0.06981417215171953 +311 0.03672165179235776 -0.09965033704379245 -0.008355257450166858 +312 0.2034359475138506 0.0288007894523449 0.09576280346210475 +313 0.03628599168476299 -0.08393357826729327 0.05436133220634091 +314 0.9278804746813119 0.05757820037494099 0.0817603255961175 +315 0.3020095920074386 -0.05304205159443916 0.08477346732706441 +316 0.8365750148867069 0.04004861419255848 0.09163028157359118 +317 0.02820795054535954 -0.01205366802553229 0.0992708874098054 +318 0.9648184485537352 -0.06557500532236936 0.0754978057758716 +319 0.8972594023591645 0.07353798629797619 0.06776551166514326 +320 0.7305143542789625 0.09525206112945547 0.03044741122970029 +321 0.775 0.09555553107405332 0.02948118859808117 +322 0.3756548665193917 -0.08366948344515611 0.05476693838458335 +323 0.9647469923900245 0.0940553148216251 -0.03396465447792735 +324 0.03525300760997525 0.09405531482162499 -0.03396465447792769 +325 0.9647469923899695 0.09405531482160584 0.03396465447798067 +326 0.03525881628188438 0.09405322632483197 0.03397043741093036 +327 0.4225554465150777 -0.04557140380803633 0.08901262357084468 +328 0.9313436162450445 -0.09724270904309106 0.02332071049433826 +329 0.4749779843536133 -0.08383305861152773 0.05451622037372139 +330 0.07071452720440169 0.05787287046560883 0.08155201324351756 +331 0.5220983604839006 -0.04560043930794519 0.08899775241500434 +332 0.5753674673570632 -0.08196309046552187 0.05728919445533057 +333 0.07201829620539299 -0.07821204998063978 -0.0623127213161639 +334 0.8139284997976983 0.07034799831552553 0.07107150718113989 +335 0.239162162618001 0.03448253763007807 0.09386668524343582 +336 0.9341572062584494 0.05781662234254856 -0.08159190021625379 +337 0.260136890146918 -0.007402104351760944 0.09972566796550246 +338 0.9257597748674049 -0.02606904340161778 -0.09654224451567599 +339 0.0812910045554722 0.0239518667362444 0.09708917591497618 +340 0.06583515632582791 0.05777593981397317 -0.08162071292638989 +341 0.6841961890775969 0.07025398364048206 0.07116444184171532 +342 0.02445289620900777 -0.01201727016199908 -0.09927530013983099 +343 0.3377399498473421 -0.04942064630721379 0.08693445645184238 +344 0.6311307733985565 -0.01381360041992372 0.09904132694708145 +345 0.6048981546438468 -0.05105223378578955 0.08598644908054459 +346 1 0.05903474758501662 -0.01508958080940203 +347 1 -0.0492698659733555 0.02585882046984534 +348 1 -0.006707081897908891 -0.05523778907178359 +349 1 0.02248904019415254 0.05242633510007481 +350 1 -0.04926986597335551 -0.0258588204698453 +351 1 -0.04157212784815703 -0.06022762490856246 +352 1 -0.01118075978364661 -0.007009767007613534 +353 1 -0.004613279163841614 0.03040663489853741 +354 1 0.02382287111292555 -0.03041862635662273 +355 1 0.02540110428852566 0.0086268742639045 +356 1 0.05871282821768856 0.02912238872471996 +357 1 -0.02160866673981265 0.06129609466181399 +358 1 0.05297152495156948 -0.04790590352414643 +359 1 -0.07318202385798035 2.575175938670205e-17 +360 1 0.02647850445689395 -0.06531239184665578 +361 0.8097442979127593 -0.0002538220636328914 -0.0002190724419874404 +362 0.6919943088333138 4.985491467739307e-05 -1.765495114762483e-05 +363 0.2661225984761846 -0.0002345009512542684 -0.0002659731745668775 +364 0.1434609246194812 -0.000347968407252694 -0.0001578347581655155 +365 0.5917600396074824 -7.27120839916183e-05 -0.0001149220786268446 +366 0.9056369980894834 0.004166506266690477 0.001910386627615918 +367 0.4887868891536019 5.252040016875265e-05 -2.262249490066204e-05 +368 0.3882625271117123 -1.544633814109728e-05 -6.234524122779306e-05 +369 0.07072180072935581 0.01189339837702686 -0.01038178609236985 +370 0.7507713059074741 -0.01809603037091218 -0.03027871727728182 +371 0.7509399843971718 0.004622499109199152 0.03407912911233445 +372 0.2048127944455869 -0.01830450085692758 -0.02902887991368125 +373 0.3272558462914928 -0.003926628895856845 -0.03403314584716364 +374 0.3252661952183864 -0.004984575553836603 0.03490469916065429 +375 0.2046298982999326 0.0005302558387481111 0.04393452275189724 +376 0.8598006988872438 -0.0368884659397513 -0.01353906245731697 +377 0.6419338845532857 -0.03776454536308895 -0.01093360399964313 +378 0.6418375859791138 0.001685343610644846 0.03859148063194598 +379 0.6418582028482743 0.03273465085097027 -0.0217797605613903 +380 0.8556916694533818 0.03641814988857875 0.01932685066192455 +381 0.5403131380590794 0.00426293295252185 0.03839512446053304 +382 0.5402238594059806 -0.01462125056967047 -0.03558560967030561 +383 0.4385549194868565 -0.03635414626424641 -0.01426215678577366 +384 0.4385070867084823 0.003290064397895573 0.03895349506735941 +385 0.4385126262683935 0.03143028466374422 -0.02321390122806663 +386 0.7366233455912645 0.03845229129473127 -0.0140143763223288 +387 0.8531480241058584 0.01789724397332794 -0.0381248658978995 +388 0.9491219301592703 0.03647523129170174 -0.01137539261825475 +389 0.2175151974888435 0.03916883931522169 -0.006811522033994398 +390 0.09661375065149289 -0.03592267809151975 0.01935117131817035 +391 0.9445372257406316 0.005697044415833365 0.04540537559031475 +392 0.94285836848714 -0.0152036011382565 -0.04045876464010048 +393 0.8673535000929513 -0.01704227541175079 0.04158290410188616 +394 0.5396717887260073 0.0408399470396652 -0.01034127320472924 +395 0.7261640990524291 -0.04402667871348675 0.01512838196973669 +396 0.325 0.04506700301951457 0.001159374608041785 +397 0.1076438339483907 -0.02103573890108096 -0.04129877626633474 +398 0.3014737291427959 -0.04657885150170261 -0.003622048363858548 +399 0.1041999217598357 0.0234161060193528 0.03642640720558003 +400 0.9406045018621955 -0.04118836570849152 0.01140264484181875 +401 0.05534635425113341 -0.004385324508291634 0.04141679918393604 +402 0.5256461514330444 -0.04567390355330087 0.01175901602630076 +403 0.7809836800821299 -0.04750204347949779 0.006076480269965388 +404 0.04747181645710714 -0.04732362603282369 -7.366360577403669e-05 +405 0.2327732292633964 -0.04469398778012831 0.01335105558627647 +406 0.782959195555848 0.02545325608013942 -0.04110257716306683 +407 0.357442223506528 -0.04600243727439472 -0.01140902901739073 +408 0.176633159426807 -0.04693193960634534 0.01036656375652196 +409 0.6675721548463689 -0.007366452929078637 -0.04807026305792333 +410 0.7954338489107714 0.03299132435853947 0.03842482175425001 +411 0.04235121909087061 0.04429337963326432 -0.02933421939553563 +412 0.8003809522115908 -0.03274972827073072 -0.04073475329232642 +413 0.7012193827485377 0.04644879232182852 0.02586949887753818 +414 0.7014957770489088 0.0005938100035964857 0.05179041099006949 +415 0.8156560393748963 -0.01401133118622601 0.05007761103876692 +416 0.1720394784612087 0.02525878618541143 -0.04056073382013108 +417 0.1147865120332441 0.04485922780420802 -0.0132184087869404 +418 0.25428907057385 0.01152144336659399 -0.05133377946257717 +419 0.6142132538458003 -0.01037340359242246 -0.04750982772114612 +420 0.4765159126311785 -0.01123785819904922 -0.05124349444085305 +421 0.377589299115111 -0.003054777515063873 -0.05262301213112017 +422 0.3685434482612364 0.02661122338475763 0.04277924711682188 +423 0.2769447850141633 -0.02592871701979426 0.04569958936466267 +424 0.2759272342775064 0.03713820763982899 0.03709298374268958 +425 0.8134640658480627 0.0507219891921122 -0.006423859249217065 +426 0.7041030925032823 -0.03900333743919324 -0.03073361312312459 +427 0.6761735463601064 -0.04060314030927173 0.02762046142737952 +428 0.1659986654285851 0.0485571555881805 0.00835592586576327 +429 0.3774814435950348 0.05194969164282277 -0.005563362224740954 +430 0.5800948252536829 -0.04685651771461988 -0.022135560169152 +431 0.8999487940670268 0.05152396068502595 -0.01863373560946169 +432 0.579466829168978 0.02928965970327264 -0.04323089876401044 +433 0.05373284214593916 0.04566421355081217 0.02592770408534403 +434 0.6133802972150876 0.04315103291985688 0.02173777534139584 +435 0.4996402538736603 0.04630142209100169 0.02507418536676692 +436 0.6089834909343274 -0.0399270385221904 0.03119970208639706 +437 0.5913004176980696 0.004991160054803545 0.05203750071138363 +438 0.8984079487330503 0.0296861698138235 0.04410669311186817 +439 0.05553102201879556 -0.02340671837352426 -0.04596689608315931 +440 0.6904681105005237 0.03605478508836452 -0.03560362727116519 +441 0.1576142356972987 -0.03320207819734568 -0.04312718404156363 +442 0.8918654051223267 -0.01473803443572818 -0.04709037028137126 +443 0.2525260077673315 -0.03670862756988921 -0.03376985780662313 +444 0.3939568711986839 -0.04486137128097641 0.02550520337497304 +445 0.135577774667834 -0.01688203818318414 0.04919944489258739 +446 0.4912902502823541 0.04290333695702901 -0.02953452832414168 +447 0.4683129043965774 -0.03862598902552317 0.02883182787539095 +448 0.4885139127929301 0.003701125220790278 0.05226956182335596 +449 0.2758552607778448 0.04844644105144878 -0.01285981843115505 +450 0.4868407360569572 -0.0495863450538804 -0.02018699102277531 +451 0.827625338684292 -0.05113480699549148 0.02049514157432552 +452 0.4490014668928631 0.0503533509058885 0.02280517180580901 +453 0.4267846430130182 -0.01100968230100716 -0.05563423131048706 +$EndNodes +$Elements +2199 +1 2 2 1 1 3 56 1 +2 2 2 1 1 1 46 14 +3 2 2 1 1 1 56 46 +4 2 2 1 1 4 56 3 +5 2 2 1 1 5 49 4 +6 2 2 1 1 49 56 4 +7 2 2 1 1 6 57 5 +8 2 2 1 1 5 57 49 +9 2 2 1 1 7 57 6 +10 2 2 1 1 8 47 7 +11 2 2 1 1 47 57 7 +12 2 2 1 1 9 59 8 +13 2 2 1 1 8 59 47 +14 2 2 1 1 10 50 9 +15 2 2 1 1 50 59 9 +16 2 2 1 1 11 51 10 +17 2 2 1 1 10 51 50 +18 2 2 1 1 12 48 11 +19 2 2 1 1 48 51 11 +20 2 2 1 1 13 60 12 +21 2 2 1 1 12 60 48 +22 2 2 1 1 14 58 13 +23 2 2 1 1 58 60 13 +24 2 2 1 1 46 58 14 +25 2 2 1 1 46 55 54 +26 2 2 1 1 54 58 46 +27 2 2 1 1 46 56 55 +28 2 2 1 1 50 52 47 +29 2 2 1 1 47 59 50 +30 2 2 1 1 52 53 47 +31 2 2 1 1 53 57 47 +32 2 2 1 1 50 51 48 +33 2 2 1 1 48 52 50 +34 2 2 1 1 48 54 52 +35 2 2 1 1 48 60 54 +36 2 2 1 1 53 55 49 +37 2 2 1 1 49 57 53 +38 2 2 1 1 55 56 49 +39 2 2 1 1 52 55 53 +40 2 2 1 1 54 55 52 +41 2 2 1 1 54 60 58 +42 2 2 3 2 1 3 326 +43 2 2 3 2 14 1 324 +44 2 2 3 2 1 15 324 +45 2 2 3 2 15 1 326 +46 2 2 3 2 33 2 323 +47 2 2 3 2 2 33 325 +48 2 2 3 2 34 2 325 +49 2 2 3 2 2 45 323 +50 2 2 3 2 3 4 295 +51 2 2 3 2 3 295 326 +52 2 2 3 2 4 5 81 +53 2 2 3 2 4 81 295 +54 2 2 3 2 5 6 317 +55 2 2 3 2 81 5 317 +56 2 2 3 2 6 7 71 +57 2 2 3 2 6 71 317 +58 2 2 3 2 7 8 313 +59 2 2 3 2 71 7 313 +60 2 2 3 2 8 9 311 +61 2 2 3 2 179 8 311 +62 2 2 3 2 8 179 313 +63 2 2 3 2 9 10 68 +64 2 2 3 2 9 68 311 +65 2 2 3 2 10 11 301 +66 2 2 3 2 68 10 301 +67 2 2 3 2 11 12 342 +68 2 2 3 2 301 11 342 +69 2 2 3 2 12 13 79 +70 2 2 3 2 12 79 342 +71 2 2 3 2 13 14 297 +72 2 2 3 2 79 13 297 +73 2 2 3 2 297 14 324 +74 2 2 3 2 15 16 83 +75 2 2 3 2 16 15 221 +76 2 2 3 2 15 83 324 +77 2 2 3 2 221 15 326 +78 2 2 3 2 17 16 77 +79 2 2 3 2 16 17 206 +80 2 2 3 2 77 16 221 +81 2 2 3 2 83 16 206 +82 2 2 3 2 17 18 72 +83 2 2 3 2 18 17 213 +84 2 2 3 2 17 72 206 +85 2 2 3 2 17 77 213 +86 2 2 3 2 19 18 64 +87 2 2 3 2 18 19 246 +88 2 2 3 2 64 18 213 +89 2 2 3 2 72 18 246 +90 2 2 3 2 20 19 222 +91 2 2 3 2 19 20 300 +92 2 2 3 2 19 64 222 +93 2 2 3 2 246 19 300 +94 2 2 3 2 20 21 62 +95 2 2 3 2 21 20 245 +96 2 2 3 2 20 62 300 +97 2 2 3 2 20 222 245 +98 2 2 3 2 22 21 65 +99 2 2 3 2 21 22 205 +100 2 2 3 2 62 21 205 +101 2 2 3 2 65 21 245 +102 2 2 3 2 22 23 76 +103 2 2 3 2 23 22 251 +104 2 2 3 2 22 65 251 +105 2 2 3 2 22 76 205 +106 2 2 3 2 23 24 204 +107 2 2 3 2 24 23 252 +108 2 2 3 2 76 23 204 +109 2 2 3 2 23 251 252 +110 2 2 3 2 24 25 61 +111 2 2 3 2 25 24 66 +112 2 2 3 2 24 61 204 +113 2 2 3 2 66 24 252 +114 2 2 3 2 25 26 198 +115 2 2 3 2 26 25 254 +116 2 2 3 2 61 25 198 +117 2 2 3 2 25 66 254 +118 2 2 3 2 26 27 75 +119 2 2 3 2 27 26 253 +120 2 2 3 2 26 75 198 +121 2 2 3 2 253 26 254 +122 2 2 3 2 28 27 67 +123 2 2 3 2 27 28 85 +124 2 2 3 2 67 27 253 +125 2 2 3 2 75 27 85 +126 2 2 3 2 28 29 63 +127 2 2 3 2 29 28 320 +128 2 2 3 2 28 63 85 +129 2 2 3 2 28 67 320 +130 2 2 3 2 29 30 195 +131 2 2 3 2 30 29 321 +132 2 2 3 2 63 29 195 +133 2 2 3 2 29 320 321 +134 2 2 3 2 31 30 73 +135 2 2 3 2 30 31 74 +136 2 2 3 2 73 30 321 +137 2 2 3 2 30 74 195 +138 2 2 3 2 31 32 199 +139 2 2 3 2 32 31 209 +140 2 2 3 2 31 73 209 +141 2 2 3 2 74 31 199 +142 2 2 3 2 32 33 82 +143 2 2 3 2 33 32 84 +144 2 2 3 2 32 82 199 +145 2 2 3 2 84 32 209 +146 2 2 3 2 82 33 323 +147 2 2 3 2 33 84 325 +148 2 2 3 2 35 34 298 +149 2 2 3 2 298 34 325 +150 2 2 3 2 36 35 80 +151 2 2 3 2 80 35 298 +152 2 2 3 2 37 36 308 +153 2 2 3 2 36 80 308 +154 2 2 3 2 38 37 318 +155 2 2 3 2 183 37 308 +156 2 2 3 2 37 183 318 +157 2 2 3 2 39 38 69 +158 2 2 3 2 69 38 318 +159 2 2 3 2 40 39 304 +160 2 2 3 2 39 69 304 +161 2 2 3 2 41 40 282 +162 2 2 3 2 282 40 304 +163 2 2 3 2 42 41 70 +164 2 2 3 2 70 41 282 +165 2 2 3 2 43 42 283 +166 2 2 3 2 42 70 283 +167 2 2 3 2 44 43 78 +168 2 2 3 2 78 43 283 +169 2 2 3 2 45 44 296 +170 2 2 3 2 44 78 296 +171 2 2 3 2 45 296 323 +172 2 2 3 2 61 198 288 +173 2 2 3 2 204 61 291 +174 2 2 3 2 61 288 291 +175 2 2 3 2 62 205 294 +176 2 2 3 2 62 294 299 +177 2 2 3 2 62 299 300 +178 2 2 3 2 85 63 86 +179 2 2 3 2 86 63 87 +180 2 2 3 2 87 63 195 +181 2 2 3 2 64 213 214 +182 2 2 3 2 64 214 215 +183 2 2 3 2 64 215 222 +184 2 2 3 2 65 245 268 +185 2 2 3 2 251 65 258 +186 2 2 3 2 258 65 268 +187 2 2 3 2 66 252 260 +188 2 2 3 2 254 66 259 +189 2 2 3 2 259 66 260 +190 2 2 3 2 67 180 320 +191 2 2 3 2 180 67 341 +192 2 2 3 2 243 67 253 +193 2 2 3 2 67 243 341 +194 2 2 3 2 68 177 311 +195 2 2 3 2 177 68 333 +196 2 2 3 2 68 301 333 +197 2 2 3 2 275 69 318 +198 2 2 3 2 69 275 328 +199 2 2 3 2 304 69 328 +200 2 2 3 2 70 282 305 +201 2 2 3 2 283 70 338 +202 2 2 3 2 70 305 338 +203 2 2 3 2 71 184 186 +204 2 2 3 2 184 71 313 +205 2 2 3 2 71 186 194 +206 2 2 3 2 71 194 317 +207 2 2 3 2 206 72 208 +208 2 2 3 2 208 72 303 +209 2 2 3 2 72 246 303 +210 2 2 3 2 176 73 321 +211 2 2 3 2 73 176 334 +212 2 2 3 2 209 73 210 +213 2 2 3 2 210 73 334 +214 2 2 3 2 195 74 201 +215 2 2 3 2 74 199 200 +216 2 2 3 2 74 200 201 +217 2 2 3 2 75 85 270 +218 2 2 3 2 198 75 280 +219 2 2 3 2 75 270 280 +220 2 2 3 2 76 204 292 +221 2 2 3 2 205 76 293 +222 2 2 3 2 76 292 293 +223 2 2 3 2 213 77 310 +224 2 2 3 2 77 221 309 +225 2 2 3 2 77 309 310 +226 2 2 3 2 78 283 307 +227 2 2 3 2 296 78 336 +228 2 2 3 2 78 307 336 +229 2 2 3 2 196 79 306 +230 2 2 3 2 79 196 342 +231 2 2 3 2 79 297 340 +232 2 2 3 2 306 79 340 +233 2 2 3 2 80 181 308 +234 2 2 3 2 181 80 314 +235 2 2 3 2 80 298 314 +236 2 2 3 2 194 81 317 +237 2 2 3 2 81 194 339 +238 2 2 3 2 295 81 330 +239 2 2 3 2 330 81 339 +240 2 2 3 2 199 82 202 +241 2 2 3 2 202 82 336 +242 2 2 3 2 296 82 323 +243 2 2 3 2 82 296 336 +244 2 2 3 2 83 206 207 +245 2 2 3 2 83 207 340 +246 2 2 3 2 83 297 324 +247 2 2 3 2 297 83 340 +248 2 2 3 2 84 209 319 +249 2 2 3 2 298 84 314 +250 2 2 3 2 84 298 325 +251 2 2 3 2 314 84 319 +252 2 2 3 2 85 86 270 +253 2 2 3 2 86 87 88 +254 2 2 3 2 86 88 247 +255 2 2 3 2 86 247 270 +256 2 2 3 2 88 87 89 +257 2 2 3 2 89 87 201 +258 2 2 3 2 87 195 201 +259 2 2 3 2 88 89 90 +260 2 2 3 2 88 90 91 +261 2 2 3 2 88 91 247 +262 2 2 3 2 90 89 92 +263 2 2 3 2 92 89 216 +264 2 2 3 2 89 201 216 +265 2 2 3 2 91 90 262 +266 2 2 3 2 90 92 93 +267 2 2 3 2 90 93 262 +268 2 2 3 2 91 197 247 +269 2 2 3 2 197 91 248 +270 2 2 3 2 248 91 262 +271 2 2 3 2 93 92 94 +272 2 2 3 2 94 92 108 +273 2 2 3 2 108 92 216 +274 2 2 3 2 93 94 95 +275 2 2 3 2 93 95 96 +276 2 2 3 2 93 96 262 +277 2 2 3 2 95 94 104 +278 2 2 3 2 104 94 271 +279 2 2 3 2 94 108 271 +280 2 2 3 2 96 95 97 +281 2 2 3 2 97 95 263 +282 2 2 3 2 95 104 263 +283 2 2 3 2 96 97 98 +284 2 2 3 2 96 98 257 +285 2 2 3 2 96 257 262 +286 2 2 3 2 98 97 99 +287 2 2 3 2 99 97 101 +288 2 2 3 2 101 97 263 +289 2 2 3 2 98 99 100 +290 2 2 3 2 98 100 109 +291 2 2 3 2 98 109 257 +292 2 2 3 2 100 99 261 +293 2 2 3 2 99 101 102 +294 2 2 3 2 99 102 261 +295 2 2 3 2 109 100 110 +296 2 2 3 2 110 100 269 +297 2 2 3 2 100 261 269 +298 2 2 3 2 102 101 103 +299 2 2 3 2 103 101 211 +300 2 2 3 2 211 101 263 +301 2 2 3 2 102 103 105 +302 2 2 3 2 102 105 106 +303 2 2 3 2 102 106 261 +304 2 2 3 2 105 103 107 +305 2 2 3 2 107 103 148 +306 2 2 3 2 148 103 211 +307 2 2 3 2 263 104 264 +308 2 2 3 2 264 104 266 +309 2 2 3 2 266 104 271 +310 2 2 3 2 106 105 142 +311 2 2 3 2 105 107 250 +312 2 2 3 2 142 105 250 +313 2 2 3 2 106 142 145 +314 2 2 3 2 106 145 153 +315 2 2 3 2 106 153 261 +316 2 2 3 2 107 148 149 +317 2 2 3 2 107 149 150 +318 2 2 3 2 107 150 250 +319 2 2 3 2 203 108 216 +320 2 2 3 2 108 203 217 +321 2 2 3 2 108 217 271 +322 2 2 3 2 109 110 111 +323 2 2 3 2 109 111 277 +324 2 2 3 2 257 109 277 +325 2 2 3 2 111 110 112 +326 2 2 3 2 112 110 134 +327 2 2 3 2 134 110 269 +328 2 2 3 2 111 112 113 +329 2 2 3 2 111 113 133 +330 2 2 3 2 111 133 277 +331 2 2 3 2 113 112 114 +332 2 2 3 2 114 112 332 +333 2 2 3 2 112 134 332 +334 2 2 3 2 113 114 115 +335 2 2 3 2 113 115 286 +336 2 2 3 2 133 113 286 +337 2 2 3 2 115 114 116 +338 2 2 3 2 116 114 139 +339 2 2 3 2 139 114 332 +340 2 2 3 2 115 116 117 +341 2 2 3 2 115 117 284 +342 2 2 3 2 115 284 286 +343 2 2 3 2 117 116 118 +344 2 2 3 2 118 116 329 +345 2 2 3 2 116 139 329 +346 2 2 3 2 117 118 119 +347 2 2 3 2 117 119 136 +348 2 2 3 2 117 136 284 +349 2 2 3 2 119 118 120 +350 2 2 3 2 120 118 132 +351 2 2 3 2 132 118 329 +352 2 2 3 2 119 120 121 +353 2 2 3 2 119 121 249 +354 2 2 3 2 136 119 249 +355 2 2 3 2 121 120 122 +356 2 2 3 2 122 120 322 +357 2 2 3 2 120 132 322 +358 2 2 3 2 121 122 123 +359 2 2 3 2 121 123 135 +360 2 2 3 2 121 135 249 +361 2 2 3 2 123 122 124 +362 2 2 3 2 124 122 255 +363 2 2 3 2 255 122 322 +364 2 2 3 2 123 124 125 +365 2 2 3 2 123 125 220 +366 2 2 3 2 135 123 220 +367 2 2 3 2 125 124 126 +368 2 2 3 2 126 124 131 +369 2 2 3 2 131 124 255 +370 2 2 3 2 125 126 127 +371 2 2 3 2 125 127 129 +372 2 2 3 2 125 129 220 +373 2 2 3 2 127 126 128 +374 2 2 3 2 128 126 289 +375 2 2 3 2 126 131 289 +376 2 2 3 2 127 128 219 +377 2 2 3 2 129 127 130 +378 2 2 3 2 130 127 219 +379 2 2 3 2 128 218 219 +380 2 2 3 2 218 128 274 +381 2 2 3 2 274 128 289 +382 2 2 3 2 129 130 137 +383 2 2 3 2 129 137 272 +384 2 2 3 2 220 129 272 +385 2 2 3 2 137 130 138 +386 2 2 3 2 138 130 140 +387 2 2 3 2 140 130 219 +388 2 2 3 2 131 255 315 +389 2 2 3 2 289 131 290 +390 2 2 3 2 290 131 315 +391 2 2 3 2 132 239 322 +392 2 2 3 2 239 132 327 +393 2 2 3 2 132 242 327 +394 2 2 3 2 242 132 329 +395 2 2 3 2 133 276 278 +396 2 2 3 2 276 133 286 +397 2 2 3 2 277 133 278 +398 2 2 3 2 134 269 273 +399 2 2 3 2 134 273 345 +400 2 2 3 2 332 134 345 +401 2 2 3 2 135 220 279 +402 2 2 3 2 249 135 281 +403 2 2 3 2 135 279 281 +404 2 2 3 2 136 249 287 +405 2 2 3 2 284 136 285 +406 2 2 3 2 285 136 287 +407 2 2 3 2 137 138 143 +408 2 2 3 2 137 143 144 +409 2 2 3 2 137 144 272 +410 2 2 3 2 138 140 141 +411 2 2 3 2 138 141 256 +412 2 2 3 2 143 138 256 +413 2 2 3 2 139 242 329 +414 2 2 3 2 242 139 331 +415 2 2 3 2 139 244 331 +416 2 2 3 2 244 139 332 +417 2 2 3 2 141 140 172 +418 2 2 3 2 172 140 173 +419 2 2 3 2 173 140 219 +420 2 2 3 2 141 172 174 +421 2 2 3 2 141 174 175 +422 2 2 3 2 141 175 256 +423 2 2 3 2 145 142 147 +424 2 2 3 2 147 142 171 +425 2 2 3 2 171 142 250 +426 2 2 3 2 144 143 146 +427 2 2 3 2 146 143 168 +428 2 2 3 2 168 143 256 +429 2 2 3 2 144 146 151 +430 2 2 3 2 144 151 152 +431 2 2 3 2 144 152 272 +432 2 2 3 2 145 147 267 +433 2 2 3 2 153 145 154 +434 2 2 3 2 154 145 267 +435 2 2 3 2 151 146 170 +436 2 2 3 2 146 168 303 +437 2 2 3 2 170 146 303 +438 2 2 3 2 147 171 176 +439 2 2 3 2 147 176 180 +440 2 2 3 2 147 180 267 +441 2 2 3 2 149 148 275 +442 2 2 3 2 148 211 212 +443 2 2 3 2 148 212 275 +444 2 2 3 2 150 149 181 +445 2 2 3 2 181 149 183 +446 2 2 3 2 183 149 275 +447 2 2 3 2 150 181 182 +448 2 2 3 2 150 182 316 +449 2 2 3 2 250 150 316 +450 2 2 3 2 152 151 155 +451 2 2 3 2 155 151 299 +452 2 2 3 2 151 170 299 +453 2 2 3 2 152 155 156 +454 2 2 3 2 152 156 279 +455 2 2 3 2 272 152 279 +456 2 2 3 2 153 154 273 +457 2 2 3 2 261 153 269 +458 2 2 3 2 269 153 273 +459 2 2 3 2 240 154 243 +460 2 2 3 2 154 240 344 +461 2 2 3 2 243 154 267 +462 2 2 3 2 273 154 344 +463 2 2 3 2 156 155 157 +464 2 2 3 2 157 155 294 +465 2 2 3 2 294 155 299 +466 2 2 3 2 156 157 158 +467 2 2 3 2 156 158 281 +468 2 2 3 2 279 156 281 +469 2 2 3 2 158 157 159 +470 2 2 3 2 159 157 293 +471 2 2 3 2 293 157 294 +472 2 2 3 2 158 159 160 +473 2 2 3 2 158 160 287 +474 2 2 3 2 281 158 287 +475 2 2 3 2 160 159 161 +476 2 2 3 2 161 159 292 +477 2 2 3 2 292 159 293 +478 2 2 3 2 160 161 162 +479 2 2 3 2 160 162 285 +480 2 2 3 2 160 285 287 +481 2 2 3 2 162 161 163 +482 2 2 3 2 163 161 291 +483 2 2 3 2 291 161 292 +484 2 2 3 2 162 163 164 +485 2 2 3 2 162 164 169 +486 2 2 3 2 162 169 285 +487 2 2 3 2 164 163 165 +488 2 2 3 2 165 163 288 +489 2 2 3 2 288 163 291 +490 2 2 3 2 164 165 166 +491 2 2 3 2 164 166 276 +492 2 2 3 2 169 164 276 +493 2 2 3 2 166 165 167 +494 2 2 3 2 167 165 280 +495 2 2 3 2 280 165 288 +496 2 2 3 2 166 167 197 +497 2 2 3 2 166 197 278 +498 2 2 3 2 276 166 278 +499 2 2 3 2 197 167 247 +500 2 2 3 2 247 167 270 +501 2 2 3 2 270 167 280 +502 2 2 3 2 208 168 302 +503 2 2 3 2 168 208 303 +504 2 2 3 2 168 256 302 +505 2 2 3 2 169 276 286 +506 2 2 3 2 169 284 285 +507 2 2 3 2 284 169 286 +508 2 2 3 2 170 246 300 +509 2 2 3 2 246 170 303 +510 2 2 3 2 299 170 300 +511 2 2 3 2 176 171 334 +512 2 2 3 2 171 250 316 +513 2 2 3 2 171 316 334 +514 2 2 3 2 172 173 177 +515 2 2 3 2 174 172 333 +516 2 2 3 2 172 177 333 +517 2 2 3 2 177 173 178 +518 2 2 3 2 178 173 218 +519 2 2 3 2 218 173 219 +520 2 2 3 2 175 174 196 +521 2 2 3 2 196 174 301 +522 2 2 3 2 301 174 333 +523 2 2 3 2 175 196 306 +524 2 2 3 2 256 175 302 +525 2 2 3 2 302 175 306 +526 2 2 3 2 180 176 320 +527 2 2 3 2 320 176 321 +528 2 2 3 2 177 178 179 +529 2 2 3 2 177 179 311 +530 2 2 3 2 179 178 184 +531 2 2 3 2 184 178 185 +532 2 2 3 2 185 178 218 +533 2 2 3 2 179 184 313 +534 2 2 3 2 267 180 341 +535 2 2 3 2 182 181 314 +536 2 2 3 2 181 183 308 +537 2 2 3 2 182 210 316 +538 2 2 3 2 210 182 319 +539 2 2 3 2 182 314 319 +540 2 2 3 2 183 275 318 +541 2 2 3 2 184 185 186 +542 2 2 3 2 186 185 187 +543 2 2 3 2 187 185 274 +544 2 2 3 2 185 218 274 +545 2 2 3 2 186 187 188 +546 2 2 3 2 186 188 194 +547 2 2 3 2 188 187 189 +548 2 2 3 2 189 187 190 +549 2 2 3 2 190 187 274 +550 2 2 3 2 188 189 192 +551 2 2 3 2 188 192 193 +552 2 2 3 2 188 193 339 +553 2 2 3 2 194 188 339 +554 2 2 3 2 189 190 191 +555 2 2 3 2 189 191 312 +556 2 2 3 2 192 189 312 +557 2 2 3 2 191 190 290 +558 2 2 3 2 190 274 289 +559 2 2 3 2 190 289 290 +560 2 2 3 2 191 290 337 +561 2 2 3 2 312 191 335 +562 2 2 3 2 335 191 337 +563 2 2 3 2 193 192 310 +564 2 2 3 2 192 214 310 +565 2 2 3 2 214 192 312 +566 2 2 3 2 309 193 310 +567 2 2 3 2 193 309 330 +568 2 2 3 2 193 330 339 +569 2 2 3 2 196 301 342 +570 2 2 3 2 197 248 278 +571 2 2 3 2 198 280 288 +572 2 2 3 2 200 199 202 +573 2 2 3 2 201 200 216 +574 2 2 3 2 200 202 203 +575 2 2 3 2 200 203 216 +576 2 2 3 2 203 202 307 +577 2 2 3 2 307 202 336 +578 2 2 3 2 217 203 307 +579 2 2 3 2 204 291 292 +580 2 2 3 2 205 293 294 +581 2 2 3 2 207 206 208 +582 2 2 3 2 207 208 302 +583 2 2 3 2 207 302 306 +584 2 2 3 2 207 306 340 +585 2 2 3 2 209 210 319 +586 2 2 3 2 316 210 334 +587 2 2 3 2 212 211 264 +588 2 2 3 2 211 263 264 +589 2 2 3 2 212 264 265 +590 2 2 3 2 212 265 328 +591 2 2 3 2 275 212 328 +592 2 2 3 2 214 213 310 +593 2 2 3 2 215 214 335 +594 2 2 3 2 214 312 335 +595 2 2 3 2 222 215 223 +596 2 2 3 2 223 215 224 +597 2 2 3 2 224 215 335 +598 2 2 3 2 271 217 305 +599 2 2 3 2 305 217 338 +600 2 2 3 2 217 307 338 +601 2 2 3 2 220 272 279 +602 2 2 3 2 295 221 326 +603 2 2 3 2 221 295 330 +604 2 2 3 2 309 221 330 +605 2 2 3 2 222 223 245 +606 2 2 3 2 223 224 225 +607 2 2 3 2 223 225 268 +608 2 2 3 2 245 223 268 +609 2 2 3 2 225 224 226 +610 2 2 3 2 226 224 337 +611 2 2 3 2 224 335 337 +612 2 2 3 2 225 226 227 +613 2 2 3 2 225 227 228 +614 2 2 3 2 225 228 268 +615 2 2 3 2 227 226 343 +616 2 2 3 2 226 290 315 +617 2 2 3 2 290 226 337 +618 2 2 3 2 226 315 343 +619 2 2 3 2 228 227 229 +620 2 2 3 2 229 227 239 +621 2 2 3 2 239 227 343 +622 2 2 3 2 228 229 230 +623 2 2 3 2 228 230 258 +624 2 2 3 2 228 258 268 +625 2 2 3 2 230 229 231 +626 2 2 3 2 231 229 327 +627 2 2 3 2 229 239 327 +628 2 2 3 2 230 231 232 +629 2 2 3 2 230 232 233 +630 2 2 3 2 230 233 258 +631 2 2 3 2 232 231 234 +632 2 2 3 2 234 231 242 +633 2 2 3 2 242 231 327 +634 2 2 3 2 233 232 260 +635 2 2 3 2 232 234 235 +636 2 2 3 2 232 235 260 +637 2 2 3 2 251 233 252 +638 2 2 3 2 233 251 258 +639 2 2 3 2 252 233 260 +640 2 2 3 2 235 234 236 +641 2 2 3 2 236 234 331 +642 2 2 3 2 234 242 331 +643 2 2 3 2 235 236 237 +644 2 2 3 2 235 237 259 +645 2 2 3 2 235 259 260 +646 2 2 3 2 237 236 238 +647 2 2 3 2 238 236 244 +648 2 2 3 2 244 236 331 +649 2 2 3 2 237 238 240 +650 2 2 3 2 237 240 241 +651 2 2 3 2 237 241 259 +652 2 2 3 2 240 238 344 +653 2 2 3 2 238 244 345 +654 2 2 3 2 344 238 345 +655 2 2 3 2 239 255 322 +656 2 2 3 2 255 239 343 +657 2 2 3 2 241 240 243 +658 2 2 3 2 241 243 253 +659 2 2 3 2 241 253 254 +660 2 2 3 2 241 254 259 +661 2 2 3 2 243 267 341 +662 2 2 3 2 244 332 345 +663 2 2 3 2 257 248 262 +664 2 2 3 2 248 257 277 +665 2 2 3 2 248 277 278 +666 2 2 3 2 249 281 287 +667 2 2 3 2 315 255 343 +668 2 2 3 2 265 264 266 +669 2 2 3 2 265 266 282 +670 2 2 3 2 265 282 304 +671 2 2 3 2 265 304 328 +672 2 2 3 2 266 271 305 +673 2 2 3 2 282 266 305 +674 2 2 3 2 273 344 345 +675 2 2 3 2 307 283 338 +676 2 2 2 3 34 356 2 +677 2 2 2 3 2 346 45 +678 2 2 2 3 2 356 346 +679 2 2 2 3 35 356 34 +680 2 2 2 3 36 349 35 +681 2 2 2 3 349 356 35 +682 2 2 2 3 37 357 36 +683 2 2 2 3 36 357 349 +684 2 2 2 3 38 357 37 +685 2 2 2 3 39 347 38 +686 2 2 2 3 347 357 38 +687 2 2 2 3 40 359 39 +688 2 2 2 3 39 359 347 +689 2 2 2 3 41 350 40 +690 2 2 2 3 350 359 40 +691 2 2 2 3 42 351 41 +692 2 2 2 3 41 351 350 +693 2 2 2 3 43 348 42 +694 2 2 2 3 348 351 42 +695 2 2 2 3 44 360 43 +696 2 2 2 3 43 360 348 +697 2 2 2 3 45 358 44 +698 2 2 2 3 358 360 44 +699 2 2 2 3 346 358 45 +700 2 2 2 3 346 355 354 +701 2 2 2 3 354 358 346 +702 2 2 2 3 346 356 355 +703 2 2 2 3 350 352 347 +704 2 2 2 3 347 359 350 +705 2 2 2 3 352 353 347 +706 2 2 2 3 353 357 347 +707 2 2 2 3 350 351 348 +708 2 2 2 3 348 352 350 +709 2 2 2 3 348 354 352 +710 2 2 2 3 348 360 354 +711 2 2 2 3 353 355 349 +712 2 2 2 3 349 357 353 +713 2 2 2 3 355 356 349 +714 2 2 2 3 352 355 353 +715 2 2 2 3 354 355 352 +716 2 2 2 3 354 360 358 +717 4 2 4 1 91 426 370 440 +718 4 2 4 1 296 360 358 388 +719 4 2 4 1 91 370 88 440 +720 4 2 4 1 91 409 426 440 +721 4 2 4 1 358 360 354 388 +722 4 2 4 1 149 393 391 400 +723 4 2 4 1 212 376 393 400 +724 4 2 4 1 173 390 408 441 +725 4 2 4 1 369 397 306 417 +726 4 2 4 1 275 393 149 400 +727 4 2 4 1 275 149 391 400 +728 4 2 4 1 360 354 388 392 +729 4 2 4 1 78 360 388 392 +730 4 2 4 1 266 376 400 442 +731 4 2 4 1 381 394 254 434 +732 4 2 4 1 173 397 390 441 +733 4 2 4 1 335 423 375 424 +734 4 2 4 1 102 403 371 415 +735 4 2 4 1 381 434 254 437 +736 4 2 4 1 370 386 88 440 +737 4 2 4 1 265 266 376 400 +738 4 2 4 1 84 388 298 391 +739 4 2 4 1 379 413 27 434 +740 4 2 4 1 105 102 371 415 +741 4 2 4 1 249 407 383 421 +742 4 2 4 1 336 392 388 431 +743 4 2 4 1 265 376 212 400 +744 4 2 4 1 320 386 371 413 +745 4 2 4 1 152 373 418 443 +746 4 2 4 1 294 373 421 429 +747 4 2 4 1 249 421 383 453 +748 4 2 4 1 152 272 373 443 +749 4 2 4 1 176 371 386 410 +750 4 2 4 1 375 389 214 424 +751 4 2 4 1 294 396 373 429 +752 4 2 4 1 152 418 272 443 +753 4 2 4 1 259 381 254 437 +754 4 2 4 1 266 400 392 442 +755 4 2 4 1 84 388 391 438 +756 4 2 4 1 88 386 370 406 +757 4 2 4 1 105 102 106 371 +758 4 2 4 1 244 402 381 436 +759 4 2 4 1 373 299 418 449 +760 4 2 4 1 369 411 306 439 +761 4 2 4 1 108 376 387 412 +762 4 2 4 1 366 393 376 400 +763 4 2 4 1 275 212 393 400 +764 4 2 4 1 299 151 373 418 +765 4 2 4 1 294 299 373 396 +766 4 2 4 1 102 395 371 403 +767 4 2 4 1 255 407 374 444 +768 4 2 4 1 302 397 416 417 +769 4 2 4 1 337 423 335 424 +770 4 2 4 1 259 254 381 394 +771 4 2 4 1 108 94 376 412 +772 4 2 4 1 272 398 373 443 +773 4 2 4 1 173 390 218 408 +774 4 2 4 1 84 325 298 388 +775 4 2 4 1 392 431 307 442 +776 4 2 4 1 374 396 223 422 +777 4 2 4 1 360 296 78 388 +778 4 2 4 1 27 413 379 440 +779 4 2 4 1 229 422 384 444 +780 4 2 4 1 106 371 102 395 +781 4 2 4 1 321 410 386 425 +782 4 2 4 1 176 386 321 410 +783 4 2 4 1 91 90 88 370 +784 4 2 4 1 390 364 408 441 +785 4 2 4 1 356 298 388 391 +786 4 2 4 1 378 413 379 434 +787 4 2 4 1 336 307 392 431 +788 4 2 4 1 394 432 26 434 +789 4 2 4 1 265 264 212 376 +790 4 2 4 1 255 398 374 407 +791 4 2 4 1 172 390 173 397 +792 4 2 4 1 306 397 369 439 +793 4 2 4 1 198 26 394 432 +794 4 2 4 1 199 387 380 425 +795 4 2 4 1 382 394 163 446 +796 4 2 4 1 391 393 366 400 +797 4 2 4 1 67 27 413 434 +798 4 2 4 1 383 407 249 444 +799 4 2 4 1 223 396 374 424 +800 4 2 4 1 373 396 299 449 +801 4 2 4 1 121 249 407 444 +802 4 2 4 1 27 28 413 440 +803 4 2 4 1 199 380 387 431 +804 4 2 4 1 302 207 397 417 +805 4 2 4 1 293 421 385 429 +806 4 2 4 1 216 387 406 412 +807 4 2 4 1 192 428 375 445 +808 4 2 4 1 207 306 397 417 +809 4 2 4 1 88 370 90 406 +810 4 2 4 1 259 394 381 435 +811 4 2 4 1 108 387 376 442 +812 4 2 4 1 180 320 371 413 +813 4 2 4 1 122 407 255 444 +814 4 2 4 1 255 374 343 444 +815 4 2 4 1 251 422 429 452 +816 4 2 4 1 185 218 390 408 +817 4 2 4 1 302 207 306 397 +818 4 2 4 1 375 423 363 424 +819 4 2 4 1 207 340 306 417 +820 4 2 4 1 229 239 422 444 +821 4 2 4 1 227 229 239 422 +822 4 2 4 1 376 366 400 442 +823 4 2 4 1 163 394 382 432 +824 4 2 4 1 75 432 379 434 +825 4 2 4 1 382 163 420 446 +826 4 2 4 1 155 299 151 373 +827 4 2 4 1 176 371 320 386 +828 4 2 4 1 271 108 94 376 +829 4 2 4 1 79 411 60 439 +830 4 2 4 1 259 66 254 394 +831 4 2 4 1 325 356 298 388 +832 4 2 4 1 368 429 422 452 +833 4 2 4 1 199 380 31 425 +834 4 2 4 1 173 178 218 390 +835 4 2 4 1 294 62 299 396 +836 4 2 4 1 370 371 361 406 +837 4 2 4 1 362 379 378 413 +838 4 2 4 1 244 332 402 436 +839 4 2 4 1 381 402 365 436 +840 4 2 4 1 294 299 155 373 +841 4 2 4 1 373 398 279 407 +842 4 2 4 1 26 432 75 434 +843 4 2 4 1 87 386 88 406 +844 4 2 4 1 384 368 422 452 +845 4 2 4 1 259 66 394 435 +846 4 2 4 1 370 395 96 403 +847 4 2 4 1 279 398 220 407 +848 4 2 4 1 79 306 411 439 +849 4 2 4 1 212 393 376 451 +850 4 2 4 1 390 397 364 441 +851 4 2 4 1 244 436 381 437 +852 4 2 4 1 84 431 388 438 +853 4 2 4 1 254 394 26 434 +854 4 2 4 1 114 430 402 436 +855 4 2 4 1 254 25 26 394 +856 4 2 4 1 383 407 368 421 +857 4 2 4 1 352 391 388 400 +858 4 2 4 1 321 386 29 425 +859 4 2 4 1 365 394 381 434 +860 4 2 4 1 255 122 398 407 +861 4 2 4 1 146 416 372 418 +862 4 2 4 1 216 108 387 412 +863 4 2 4 1 251 258 422 452 +864 4 2 4 1 282 392 266 400 +865 4 2 4 1 293 294 421 429 +866 4 2 4 1 185 408 390 445 +867 4 2 4 1 146 143 372 416 +868 4 2 4 1 386 410 406 425 +869 4 2 4 1 130 127 405 408 +870 4 2 4 1 302 416 397 441 +871 4 2 4 1 78 388 336 392 +872 4 2 4 1 148 275 212 393 +873 4 2 4 1 163 288 394 432 +874 4 2 4 1 130 405 372 408 +875 4 2 4 1 105 371 142 415 +876 4 2 4 1 256 302 397 441 +877 4 2 4 1 362 370 426 440 +878 4 2 4 1 399 428 192 445 +879 4 2 4 1 88 90 89 406 +880 4 2 4 1 172 177 173 390 +881 4 2 4 1 91 262 370 426 +882 4 2 4 1 384 422 258 452 +883 4 2 4 1 316 393 380 438 +884 4 2 4 1 355 352 353 391 +885 4 2 4 1 108 376 271 442 +886 4 2 4 1 163 394 288 446 +887 4 2 4 1 152 373 151 418 +888 4 2 4 1 98 96 395 403 +889 4 2 4 1 122 255 322 444 +890 4 2 4 1 281 407 249 421 +891 4 2 4 1 316 380 393 415 +892 4 2 4 1 370 386 371 406 +893 4 2 4 1 402 430 365 436 +894 4 2 4 1 406 410 361 425 +895 4 2 4 1 105 106 142 371 +896 4 2 4 1 26 198 75 432 +897 4 2 4 1 363 389 375 424 +898 4 2 4 1 355 388 352 391 +899 4 2 4 1 29 386 195 425 +900 4 2 4 1 385 421 293 453 +901 4 2 4 1 230 384 229 422 +902 4 2 4 1 31 380 199 431 +903 4 2 4 1 340 79 306 411 +904 4 2 4 1 146 303 416 418 +905 4 2 4 1 177 390 172 397 +906 4 2 4 1 27 85 28 440 +907 4 2 4 1 212 148 393 451 +908 4 2 4 1 216 406 92 412 +909 4 2 4 1 256 416 302 441 +910 4 2 4 1 48 60 411 439 +911 4 2 4 1 146 372 143 418 +912 4 2 4 1 251 422 65 429 +913 4 2 4 1 275 149 183 391 +914 4 2 4 1 164 382 276 419 +915 4 2 4 1 91 262 90 370 +916 4 2 4 1 216 92 108 412 +917 4 2 4 1 265 266 264 376 +918 4 2 4 1 382 419 164 432 +919 4 2 4 1 365 434 381 437 +920 4 2 4 1 98 97 96 403 +921 4 2 4 1 220 398 272 443 +922 4 2 4 1 259 254 241 437 +923 4 2 4 1 96 395 370 426 +924 4 2 4 1 352 388 392 400 +925 4 2 4 1 389 416 303 418 +926 4 2 4 1 294 373 155 421 +927 4 2 4 1 281 421 249 453 +928 4 2 4 1 176 320 321 386 +929 4 2 4 1 244 331 381 402 +930 4 2 4 1 282 266 265 400 +931 4 2 4 1 254 434 241 437 +932 4 2 4 1 184 401 390 404 +933 4 2 4 1 279 152 272 373 +934 4 2 4 1 286 402 382 450 +935 4 2 4 1 172 397 173 441 +936 4 2 4 1 27 379 85 440 +937 4 2 4 1 373 407 279 421 +938 4 2 4 1 402 447 331 448 +939 4 2 4 1 281 279 407 421 +940 4 2 4 1 130 219 127 408 +941 4 2 4 1 316 410 380 415 +942 4 2 4 1 135 279 220 407 +943 4 2 4 1 371 395 106 414 +944 4 2 4 1 225 374 224 424 +945 4 2 4 1 376 380 361 393 +946 4 2 4 1 159 293 421 453 +947 4 2 4 1 114 402 332 436 +948 4 2 4 1 374 423 224 424 +949 4 2 4 1 214 389 375 428 +950 4 2 4 1 155 151 152 373 +951 4 2 4 1 356 388 355 391 +952 4 2 4 1 190 375 290 405 +953 4 2 4 1 159 385 293 453 +954 4 2 4 1 164 276 166 419 +955 4 2 4 1 360 348 354 392 +956 4 2 4 1 164 419 166 432 +957 4 2 4 1 19 64 389 424 +958 4 2 4 1 251 258 65 422 +959 4 2 4 1 366 431 392 442 +960 4 2 4 1 364 375 372 389 +961 4 2 4 1 185 218 178 390 +962 4 2 4 1 146 168 143 416 +963 4 2 4 1 388 392 366 431 +964 4 2 4 1 411 417 83 433 +965 4 2 4 1 88 386 87 440 +966 4 2 4 1 127 130 405 443 +967 4 2 4 1 372 405 130 443 +968 4 2 4 1 261 106 395 414 +969 4 2 4 1 361 380 376 387 +970 4 2 4 1 350 351 70 392 +971 4 2 4 1 191 290 375 423 +972 4 2 4 1 150 393 316 438 +973 4 2 4 1 149 181 391 393 +974 4 2 4 1 25 198 26 394 +975 4 2 4 1 62 396 294 429 +976 4 2 4 1 201 406 387 425 +977 4 2 4 1 115 402 286 450 +978 4 2 4 1 180 320 176 371 +979 4 2 4 1 381 402 331 448 +980 4 2 4 1 290 405 375 423 +981 4 2 4 1 362 386 370 440 +982 4 2 4 1 190 290 289 405 +983 4 2 4 1 109 395 426 427 +984 4 2 4 1 310 192 399 428 +985 4 2 4 1 364 389 372 416 +986 4 2 4 1 284 286 382 450 +987 4 2 4 1 375 428 364 445 +988 4 2 4 1 373 363 418 443 +989 4 2 4 1 391 393 181 438 +990 4 2 4 1 147 413 371 414 +991 4 2 4 1 214 375 192 428 +992 4 2 4 1 15 411 83 433 +993 4 2 4 1 48 79 60 439 +994 4 2 4 1 163 162 382 420 +995 4 2 4 1 376 380 366 387 +996 4 2 4 1 224 337 335 424 +997 4 2 4 1 373 374 368 396 +998 4 2 4 1 48 60 54 411 +999 4 2 4 1 212 211 148 451 +1000 4 2 4 1 263 376 412 451 +1001 4 2 4 1 98 395 96 426 +1002 4 2 4 1 55 52 369 401 +1003 4 2 4 1 201 387 200 425 +1004 4 2 4 1 384 422 368 444 +1005 4 2 4 1 96 370 403 412 +1006 4 2 4 1 239 255 343 444 +1007 4 2 4 1 291 163 288 446 +1008 4 2 4 1 16 83 417 433 +1009 4 2 4 1 366 380 376 393 +1010 4 2 4 1 19 424 389 449 +1011 4 2 4 1 386 406 195 425 +1012 4 2 4 1 16 15 83 433 +1013 4 2 4 1 52 54 55 411 +1014 4 2 4 1 161 385 159 453 +1015 4 2 4 1 223 374 225 424 +1016 4 2 4 1 161 420 385 453 +1017 4 2 4 1 104 263 376 412 +1018 4 2 4 1 388 391 366 400 +1019 4 2 4 1 302 416 207 417 +1020 4 2 4 1 277 409 377 426 +1021 4 2 4 1 243 413 378 434 +1022 4 2 4 1 375 389 364 428 +1023 4 2 4 1 385 429 368 452 +1024 4 2 4 1 202 307 431 442 +1025 4 2 4 1 281 279 135 407 +1026 4 2 4 1 230 258 384 422 +1027 4 2 4 1 353 391 352 400 +1028 4 2 4 1 314 84 391 438 +1029 4 2 4 1 106 102 261 395 +1030 4 2 4 1 84 298 314 391 +1031 4 2 4 1 318 391 357 400 +1032 4 2 4 1 266 392 305 442 +1033 4 2 4 1 334 380 316 410 +1034 4 2 4 1 360 78 283 392 +1035 4 2 4 1 100 395 109 427 +1036 4 2 4 1 202 431 387 442 +1037 4 2 4 1 170 389 303 418 +1038 4 2 4 1 366 393 391 438 +1039 4 2 4 1 112 430 114 436 +1040 4 2 4 1 239 322 255 444 +1041 4 2 4 1 209 431 32 438 +1042 4 2 4 1 84 33 388 431 +1043 4 2 4 1 102 403 415 451 +1044 4 2 4 1 389 416 364 428 +1045 4 2 4 1 137 143 372 418 +1046 4 2 4 1 277 248 409 426 +1047 4 2 4 1 64 389 214 428 +1048 4 2 4 1 374 398 255 423 +1049 4 2 4 1 163 161 420 446 +1050 4 2 4 1 276 419 382 430 +1051 4 2 4 1 226 224 374 423 +1052 4 2 4 1 225 226 224 374 +1053 4 2 4 1 316 380 210 438 +1054 4 2 4 1 230 229 228 422 +1055 4 2 4 1 275 391 183 400 +1056 4 2 4 1 278 377 277 409 +1057 4 2 4 1 364 428 399 445 +1058 4 2 4 1 327 444 384 447 +1059 4 2 4 1 229 384 327 444 +1060 4 2 4 1 388 366 392 400 +1061 4 2 4 1 368 422 374 444 +1062 4 2 4 1 201 200 74 425 +1063 4 2 4 1 293 294 157 421 +1064 4 2 4 1 83 411 340 417 +1065 4 2 4 1 247 409 91 440 +1066 4 2 4 1 130 408 372 441 +1067 4 2 4 1 74 199 31 425 +1068 4 2 4 1 284 115 286 450 +1069 4 2 4 1 32 431 84 438 +1070 4 2 4 1 361 371 370 403 +1071 4 2 4 1 109 395 98 426 +1072 4 2 4 1 368 383 421 453 +1073 4 2 4 1 363 374 373 396 +1074 4 2 4 1 104 376 94 412 +1075 4 2 4 1 143 372 416 441 +1076 4 2 4 1 22 429 385 452 +1077 4 2 4 1 161 292 159 385 +1078 4 2 4 1 385 421 368 429 +1079 4 2 4 1 55 53 52 401 +1080 4 2 4 1 364 416 397 417 +1081 4 2 4 1 167 270 379 409 +1082 4 2 4 1 377 378 362 379 +1083 4 2 4 1 143 416 256 441 +1084 4 2 4 1 372 416 389 418 +1085 4 2 4 1 29 195 30 425 +1086 4 2 4 1 163 382 164 432 +1087 4 2 4 1 381 382 365 402 +1088 4 2 4 1 362 371 370 386 +1089 4 2 4 1 169 284 286 382 +1090 4 2 4 1 286 382 402 430 +1091 4 2 4 1 161 385 420 446 +1092 4 2 4 1 109 426 377 427 +1093 4 2 4 1 90 370 93 412 +1094 4 2 4 1 336 78 296 388 +1095 4 2 4 1 77 399 221 417 +1096 4 2 4 1 363 373 418 449 +1097 4 2 4 1 373 398 363 443 +1098 4 2 4 1 150 316 182 438 +1099 4 2 4 1 371 410 142 415 +1100 4 2 4 1 96 403 95 412 +1101 4 2 4 1 247 91 88 440 +1102 4 2 4 1 77 221 16 417 +1103 4 2 4 1 126 398 405 423 +1104 4 2 4 1 221 417 399 433 +1105 4 2 4 1 370 371 362 395 +1106 4 2 4 1 219 408 130 441 +1107 4 2 4 1 381 436 365 437 +1108 4 2 4 1 261 153 106 414 +1109 4 2 4 1 321 29 30 425 +1110 4 2 4 1 209 32 84 438 +1111 4 2 4 1 399 401 390 445 +1112 4 2 4 1 201 216 387 406 +1113 4 2 4 1 76 293 385 429 +1114 4 2 4 1 118 383 119 444 +1115 4 2 4 1 163 164 165 432 +1116 4 2 4 1 373 368 421 429 +1117 4 2 4 1 209 380 431 438 +1118 4 2 4 1 261 414 395 427 +1119 4 2 4 1 375 405 363 423 +1120 4 2 4 1 356 349 298 391 +1121 4 2 4 1 161 292 385 446 +1122 4 2 4 1 383 444 118 447 +1123 4 2 4 1 360 283 348 392 +1124 4 2 4 1 55 401 369 433 +1125 4 2 4 1 137 418 372 443 +1126 4 2 4 1 334 210 316 380 +1127 4 2 4 1 76 23 22 385 +1128 4 2 4 1 277 377 109 426 +1129 4 2 4 1 23 22 385 452 +1130 4 2 4 1 167 419 379 432 +1131 4 2 4 1 189 192 375 445 +1132 4 2 4 1 170 389 418 449 +1133 4 2 4 1 120 118 119 444 +1134 4 2 4 1 361 406 387 412 +1135 4 2 4 1 52 55 369 411 +1136 4 2 4 1 372 375 363 389 +1137 4 2 4 1 167 379 280 432 +1138 4 2 4 1 71 184 313 404 +1139 4 2 4 1 191 290 190 375 +1140 4 2 4 1 100 98 109 395 +1141 4 2 4 1 333 177 172 397 +1142 4 2 4 1 373 396 368 429 +1143 4 2 4 1 369 417 411 433 +1144 4 2 4 1 52 369 401 404 +1145 4 2 4 1 124 255 122 398 +1146 4 2 4 1 133 377 278 419 +1147 4 2 4 1 256 302 175 397 +1148 4 2 4 1 316 393 150 415 +1149 4 2 4 1 102 415 103 451 +1150 4 2 4 1 368 374 373 407 +1151 4 2 4 1 278 277 248 409 +1152 4 2 4 1 341 413 267 414 +1153 4 2 4 1 16 417 221 433 +1154 4 2 4 1 363 375 372 405 +1155 4 2 4 1 71 401 184 404 +1156 4 2 4 1 356 355 349 391 +1157 4 2 4 1 299 396 62 449 +1158 4 2 4 1 214 192 310 428 +1159 4 2 4 1 86 88 87 440 +1160 4 2 4 1 33 346 325 388 +1161 4 2 4 1 331 402 139 447 +1162 4 2 4 1 169 284 382 450 +1163 4 2 4 1 180 371 147 413 +1164 4 2 4 1 191 337 290 423 +1165 4 2 4 1 90 92 89 406 +1166 4 2 4 1 365 432 394 434 +1167 4 2 4 1 271 94 104 376 +1168 4 2 4 1 368 396 374 422 +1169 4 2 4 1 392 400 366 442 +1170 4 2 4 1 224 423 337 424 +1171 4 2 4 1 233 384 258 452 +1172 4 2 4 1 244 139 331 402 +1173 4 2 4 1 165 164 166 432 +1174 4 2 4 1 371 403 361 415 +1175 4 2 4 1 137 144 143 418 +1176 4 2 4 1 87 88 89 406 +1177 4 2 4 1 261 153 414 427 +1178 4 2 4 1 167 247 270 409 +1179 4 2 4 1 374 407 368 444 +1180 4 2 4 1 169 382 420 450 +1181 4 2 4 1 368 407 383 444 +1182 4 2 4 1 384 385 368 452 +1183 4 2 4 1 365 402 382 430 +1184 4 2 4 1 19 222 64 424 +1185 4 2 4 1 362 379 413 440 +1186 4 2 4 1 365 378 377 379 +1187 4 2 4 1 357 391 353 400 +1188 4 2 4 1 202 387 203 442 +1189 4 2 4 1 76 385 22 429 +1190 4 2 4 1 245 396 223 424 +1191 4 2 4 1 62 294 205 429 +1192 4 2 4 1 152 144 272 418 +1193 4 2 4 1 377 409 278 419 +1194 4 2 4 1 202 307 336 431 +1195 4 2 4 1 263 412 403 451 +1196 4 2 4 1 126 398 125 405 +1197 4 2 4 1 316 210 182 438 +1198 4 2 4 1 170 246 303 389 +1199 4 2 4 1 377 419 133 430 +1200 4 2 4 1 293 205 294 429 +1201 4 2 4 1 302 306 175 397 +1202 4 2 4 1 78 336 307 392 +1203 4 2 4 1 96 97 95 403 +1204 4 2 4 1 167 409 379 419 +1205 4 2 4 1 362 426 409 440 +1206 4 2 4 1 125 405 398 443 +1207 4 2 4 1 90 93 92 412 +1208 4 2 4 1 233 230 258 384 +1209 4 2 4 1 383 420 136 453 +1210 4 2 4 1 186 390 401 445 +1211 4 2 4 1 72 417 416 428 +1212 4 2 4 1 142 371 147 410 +1213 4 2 4 1 270 379 409 440 +1214 4 2 4 1 350 392 282 400 +1215 4 2 4 1 84 33 325 388 +1216 4 2 4 1 282 305 266 392 +1217 4 2 4 1 148 149 275 393 +1218 4 2 4 1 281 249 287 453 +1219 4 2 4 1 243 67 413 434 +1220 4 2 4 1 75 379 27 434 +1221 4 2 4 1 255 398 124 423 +1222 4 2 4 1 259 381 235 435 +1223 4 2 4 1 361 387 376 412 +1224 4 2 4 1 190 187 189 375 +1225 4 2 4 1 65 245 396 422 +1226 4 2 4 1 133 277 278 377 +1227 4 2 4 1 29 321 320 386 +1228 4 2 4 1 246 389 170 449 +1229 4 2 4 1 365 382 381 394 +1230 4 2 4 1 157 294 155 421 +1231 4 2 4 1 159 293 157 421 +1232 4 2 4 1 373 374 363 398 +1233 4 2 4 1 289 128 274 408 +1234 4 2 4 1 318 357 347 400 +1235 4 2 4 1 227 228 229 422 +1236 4 2 4 1 381 382 367 394 +1237 4 2 4 1 386 413 28 440 +1238 4 2 4 1 286 402 115 430 +1239 4 2 4 1 189 375 187 445 +1240 4 2 4 1 289 405 128 408 +1241 4 2 4 1 214 312 192 375 +1242 4 2 4 1 323 358 346 388 +1243 4 2 4 1 208 207 302 416 +1244 4 2 4 1 273 378 427 436 +1245 4 2 4 1 325 346 356 388 +1246 4 2 4 1 48 411 54 439 +1247 4 2 4 1 251 429 22 452 +1248 4 2 4 1 112 114 332 436 +1249 4 2 4 1 25 254 66 394 +1250 4 2 4 1 72 206 416 417 +1251 4 2 4 1 112 113 114 430 +1252 4 2 4 1 64 214 213 428 +1253 4 2 4 1 65 422 396 429 +1254 4 2 4 1 310 399 77 428 +1255 4 2 4 1 368 384 383 385 +1256 4 2 4 1 214 335 312 375 +1257 4 2 4 1 399 417 77 428 +1258 4 2 4 1 390 408 364 445 +1259 4 2 4 1 236 244 381 437 +1260 4 2 4 1 267 413 147 414 +1261 4 2 4 1 156 373 279 421 +1262 4 2 4 1 270 409 247 440 +1263 4 2 4 1 383 384 367 385 +1264 4 2 4 1 84 32 33 431 +1265 4 2 4 1 377 430 111 436 +1266 4 2 4 1 64 18 389 428 +1267 4 2 4 1 132 444 327 447 +1268 4 2 4 1 244 331 236 381 +1269 4 2 4 1 201 216 200 387 +1270 4 2 4 1 316 150 250 415 +1271 4 2 4 1 69 359 304 400 +1272 4 2 4 1 123 220 398 407 +1273 4 2 4 1 354 352 388 392 +1274 4 2 4 1 26 75 27 434 +1275 4 2 4 1 280 379 75 432 +1276 4 2 4 1 96 93 370 412 +1277 4 2 4 1 388 431 366 438 +1278 4 2 4 1 363 396 373 449 +1279 4 2 4 1 259 235 260 435 +1280 4 2 4 1 273 378 414 427 +1281 4 2 4 1 243 341 267 414 +1282 4 2 4 1 270 280 167 379 +1283 4 2 4 1 147 371 176 410 +1284 4 2 4 1 143 168 256 416 +1285 4 2 4 1 24 23 446 452 +1286 4 2 4 1 361 393 380 415 +1287 4 2 4 1 347 357 353 400 +1288 4 2 4 1 183 391 318 400 +1289 4 2 4 1 102 99 395 403 +1290 4 2 4 1 367 382 381 402 +1291 4 2 4 1 374 396 363 424 +1292 4 2 4 1 208 207 416 417 +1293 4 2 4 1 72 206 417 428 +1294 4 2 4 1 23 385 204 446 +1295 4 2 4 1 23 385 446 452 +1296 4 2 4 1 146 303 168 416 +1297 4 2 4 1 131 255 124 423 +1298 4 2 4 1 186 390 184 401 +1299 4 2 4 1 249 281 135 407 +1300 4 2 4 1 123 135 220 407 +1301 4 2 4 1 366 391 388 438 +1302 4 2 4 1 369 390 404 439 +1303 4 2 4 1 377 379 362 409 +1304 4 2 4 1 104 95 263 412 +1305 4 2 4 1 163 291 161 446 +1306 4 2 4 1 369 404 52 439 +1307 4 2 4 1 299 170 418 449 +1308 4 2 4 1 202 203 307 442 +1309 4 2 4 1 147 180 176 371 +1310 4 2 4 1 369 411 55 433 +1311 4 2 4 1 347 359 69 400 +1312 4 2 4 1 162 164 163 382 +1313 4 2 4 1 95 403 263 412 +1314 4 2 4 1 118 117 383 450 +1315 4 2 4 1 127 405 125 443 +1316 4 2 4 1 171 142 147 410 +1317 4 2 4 1 376 393 361 451 +1318 4 2 4 1 235 435 381 448 +1319 4 2 4 1 369 397 390 439 +1320 4 2 4 1 169 382 162 420 +1321 4 2 4 1 177 178 173 390 +1322 4 2 4 1 61 288 394 446 +1323 4 2 4 1 362 413 378 414 +1324 4 2 4 1 64 213 18 428 +1325 4 2 4 1 138 372 143 441 +1326 4 2 4 1 27 67 253 434 +1327 4 2 4 1 24 446 435 452 +1328 4 2 4 1 277 109 257 426 +1329 4 2 4 1 312 189 192 375 +1330 4 2 4 1 225 227 374 422 +1331 4 2 4 1 145 371 106 414 +1332 4 2 4 1 63 386 28 440 +1333 4 2 4 1 112 111 430 436 +1334 4 2 4 1 128 405 127 408 +1335 4 2 4 1 344 378 273 436 +1336 4 2 4 1 207 83 340 417 +1337 4 2 4 1 115 402 113 430 +1338 4 2 4 1 172 173 140 441 +1339 4 2 4 1 118 383 447 450 +1340 4 2 4 1 20 396 222 424 +1341 4 2 4 1 364 390 369 397 +1342 4 2 4 1 169 420 285 450 +1343 4 2 4 1 367 382 420 446 +1344 4 2 4 1 245 222 396 424 +1345 4 2 4 1 15 46 411 433 +1346 4 2 4 1 61 291 288 446 +1347 4 2 4 1 145 142 106 371 +1348 4 2 4 1 140 219 130 441 +1349 4 2 4 1 303 389 72 416 +1350 4 2 4 1 113 402 114 430 +1351 4 2 4 1 323 296 358 388 +1352 4 2 4 1 361 380 410 415 +1353 4 2 4 1 111 377 133 430 +1354 4 2 4 1 136 420 383 450 +1355 4 2 4 1 15 326 46 433 +1356 4 2 4 1 281 156 279 421 +1357 4 2 4 1 101 403 102 451 +1358 4 2 4 1 110 377 111 436 +1359 4 2 4 1 107 393 148 451 +1360 4 2 4 1 369 390 364 399 +1361 4 2 4 1 123 398 122 407 +1362 4 2 4 1 219 128 127 408 +1363 4 2 4 1 65 396 21 429 +1364 4 2 4 1 102 105 103 415 +1365 4 2 4 1 237 381 259 437 +1366 4 2 4 1 371 386 362 413 +1367 4 2 4 1 132 118 444 447 +1368 4 2 4 1 137 144 418 443 +1369 4 2 4 1 384 233 448 452 +1370 4 2 4 1 306 196 397 439 +1371 4 2 4 1 59 47 313 404 +1372 4 2 4 1 163 161 162 420 +1373 4 2 4 1 20 245 222 396 +1374 4 2 4 1 79 196 306 439 +1375 4 2 4 1 315 374 255 423 +1376 4 2 4 1 372 375 364 408 +1377 4 2 4 1 110 109 377 427 +1378 4 2 4 1 77 309 221 399 +1379 4 2 4 1 327 384 231 447 +1380 4 2 4 1 242 331 447 448 +1381 4 2 4 1 396 422 368 429 +1382 4 2 4 1 262 96 370 426 +1383 4 2 4 1 328 265 212 400 +1384 4 2 4 1 52 401 53 404 +1385 4 2 4 1 397 416 364 441 +1386 4 2 4 1 232 384 233 448 +1387 4 2 4 1 361 410 371 415 +1388 4 2 4 1 21 65 245 396 +1389 4 2 4 1 121 120 119 444 +1390 4 2 4 1 119 118 117 383 +1391 4 2 4 1 103 107 148 451 +1392 4 2 4 1 79 342 48 60 +1393 4 2 4 1 273 427 134 436 +1394 4 2 4 1 156 155 373 421 +1395 4 2 4 1 146 170 303 418 +1396 4 2 4 1 209 84 319 438 +1397 4 2 4 1 142 410 171 415 +1398 4 2 4 1 272 418 144 443 +1399 4 2 4 1 55 49 53 401 +1400 4 2 4 1 72 206 208 416 +1401 4 2 4 1 371 395 370 403 +1402 4 2 4 1 208 416 206 417 +1403 4 2 4 1 188 194 399 445 +1404 4 2 4 1 125 398 220 443 +1405 4 2 4 1 20 396 424 449 +1406 4 2 4 1 76 205 293 429 +1407 4 2 4 1 365 379 377 419 +1408 4 2 4 1 48 54 52 439 +1409 4 2 4 1 378 436 344 437 +1410 4 2 4 1 138 143 256 441 +1411 4 2 4 1 222 424 19 449 +1412 4 2 4 1 96 93 262 370 +1413 4 2 4 1 282 350 70 392 +1414 4 2 4 1 283 70 351 392 +1415 4 2 4 1 260 435 235 448 +1416 4 2 4 1 335 191 312 375 +1417 4 2 4 1 276 133 419 430 +1418 4 2 4 1 234 236 331 381 +1419 4 2 4 1 292 293 159 385 +1420 4 2 4 1 179 313 184 404 +1421 4 2 4 1 48 342 79 439 +1422 4 2 4 1 276 133 278 419 +1423 4 2 4 1 246 72 303 389 +1424 4 2 4 1 374 398 373 407 +1425 4 2 4 1 334 73 380 410 +1426 4 2 4 1 49 81 401 433 +1427 4 2 4 1 110 427 377 436 +1428 4 2 4 1 234 381 331 448 +1429 4 2 4 1 223 225 224 424 +1430 4 2 4 1 58 60 297 411 +1431 4 2 4 1 156 152 279 373 +1432 4 2 4 1 107 415 393 451 +1433 4 2 4 1 114 113 115 402 +1434 4 2 4 1 244 332 139 402 +1435 4 2 4 1 147 371 145 414 +1436 4 2 4 1 130 137 372 443 +1437 4 2 4 1 393 415 361 451 +1438 4 2 4 1 137 143 138 372 +1439 4 2 4 1 151 299 170 418 +1440 4 2 4 1 133 111 277 377 +1441 4 2 4 1 137 138 130 372 +1442 4 2 4 1 145 147 142 371 +1443 4 2 4 1 136 285 420 450 +1444 4 2 4 1 372 389 363 418 +1445 4 2 4 1 124 122 123 398 +1446 4 2 4 1 344 273 345 436 +1447 4 2 4 1 101 102 103 451 +1448 4 2 4 1 156 155 152 373 +1449 4 2 4 1 367 394 382 446 +1450 4 2 4 1 67 27 28 413 +1451 4 2 4 1 169 285 284 450 +1452 4 2 4 1 368 421 385 453 +1453 4 2 4 1 251 65 22 429 +1454 4 2 4 1 262 93 90 370 +1455 4 2 4 1 376 361 412 451 +1456 4 2 4 1 24 23 204 446 +1457 4 2 4 1 234 235 236 381 +1458 4 2 4 1 185 274 218 408 +1459 4 2 4 1 87 195 386 406 +1460 4 2 4 1 65 268 245 422 +1461 4 2 4 1 59 313 179 404 +1462 4 2 4 1 276 382 286 430 +1463 4 2 4 1 267 180 147 413 +1464 4 2 4 1 339 399 194 401 +1465 4 2 4 1 399 401 330 433 +1466 4 2 4 1 266 271 376 442 +1467 4 2 4 1 127 126 125 405 +1468 4 2 4 1 276 169 286 382 +1469 4 2 4 1 46 326 56 433 +1470 4 2 4 1 364 397 369 417 +1471 4 2 4 1 261 102 99 395 +1472 4 2 4 1 275 183 318 400 +1473 4 2 4 1 126 405 131 423 +1474 4 2 4 1 243 67 341 413 +1475 4 2 4 1 350 352 392 400 +1476 4 2 4 1 125 220 129 443 +1477 4 2 4 1 141 256 175 397 +1478 4 2 4 1 76 204 23 385 +1479 4 2 4 1 72 416 389 428 +1480 4 2 4 1 264 376 263 451 +1481 4 2 4 1 384 444 383 447 +1482 4 2 4 1 273 414 153 427 +1483 4 2 4 1 256 397 141 441 +1484 4 2 4 1 72 17 206 428 +1485 4 2 4 1 382 365 419 432 +1486 4 2 4 1 92 94 108 412 +1487 4 2 4 1 383 385 367 420 +1488 4 2 4 1 366 387 380 431 +1489 4 2 4 1 20 424 222 449 +1490 4 2 4 1 275 328 212 400 +1491 4 2 4 1 289 405 290 423 +1492 4 2 4 1 107 150 393 415 +1493 4 2 4 1 348 283 351 392 +1494 4 2 4 1 130 372 138 441 +1495 4 2 4 1 235 381 234 448 +1496 4 2 4 1 382 419 365 430 +1497 4 2 4 1 68 51 50 439 +1498 4 2 4 1 240 434 378 437 +1499 4 2 4 1 198 280 75 432 +1500 4 2 4 1 225 228 227 422 +1501 4 2 4 1 277 257 248 426 +1502 4 2 4 1 350 359 347 400 +1503 4 2 4 1 181 393 150 438 +1504 4 2 4 1 179 184 390 404 +1505 4 2 4 1 336 388 82 431 +1506 4 2 4 1 230 228 258 422 +1507 4 2 4 1 49 401 55 433 +1508 4 2 4 1 183 357 318 391 +1509 4 2 4 1 379 432 365 434 +1510 4 2 4 1 368 385 383 453 +1511 4 2 4 1 231 447 384 448 +1512 4 2 4 1 383 384 368 444 +1513 4 2 4 1 18 72 389 428 +1514 4 2 4 1 310 309 77 399 +1515 4 2 4 1 188 194 339 399 +1516 4 2 4 1 344 436 345 437 +1517 4 2 4 1 387 406 361 425 +1518 4 2 4 1 238 344 345 437 +1519 4 2 4 1 113 112 111 430 +1520 4 2 4 1 131 405 289 423 +1521 4 2 4 1 175 306 196 397 +1522 4 2 4 1 160 420 161 453 +1523 4 2 4 1 103 415 107 451 +1524 4 2 4 1 110 111 112 436 +1525 4 2 4 1 354 346 358 388 +1526 4 2 4 1 270 75 280 379 +1527 4 2 4 1 47 53 401 404 +1528 4 2 4 1 66 24 25 394 +1529 4 2 4 1 162 169 164 382 +1530 4 2 4 1 160 161 159 453 +1531 4 2 4 1 260 232 233 448 +1532 4 2 4 1 286 115 113 430 +1533 4 2 4 1 24 394 66 435 +1534 4 2 4 1 125 126 124 398 +1535 4 2 4 1 263 95 97 403 +1536 4 2 4 1 318 347 69 400 +1537 4 2 4 1 149 181 183 391 +1538 4 2 4 1 77 417 17 428 +1539 4 2 4 1 96 95 93 412 +1540 4 2 4 1 231 229 230 384 +1541 4 2 4 1 17 417 206 428 +1542 4 2 4 1 16 221 15 433 +1543 4 2 4 1 195 406 201 425 +1544 4 2 4 1 111 110 109 377 +1545 4 2 4 1 237 259 241 437 +1546 4 2 4 1 371 413 362 414 +1547 4 2 4 1 354 352 355 388 +1548 4 2 4 1 366 387 431 442 +1549 4 2 4 1 362 378 377 427 +1550 4 2 4 1 199 387 202 431 +1551 4 2 4 1 369 399 364 417 +1552 4 2 4 1 232 230 233 384 +1553 4 2 4 1 131 126 289 405 +1554 4 2 4 1 242 331 139 447 +1555 4 2 4 1 330 401 81 433 +1556 4 2 4 1 221 399 309 433 +1557 4 2 4 1 57 71 47 401 +1558 4 2 4 1 85 27 75 379 +1559 4 2 4 1 330 309 399 433 +1560 4 2 4 1 91 409 248 426 +1561 4 2 4 1 376 387 366 442 +1562 4 2 4 1 334 73 210 380 +1563 4 2 4 1 363 424 396 449 +1564 4 2 4 1 33 323 346 388 +1565 4 2 4 1 89 92 216 406 +1566 4 2 4 1 367 385 384 452 +1567 4 2 4 1 62 21 396 429 +1568 4 2 4 1 266 271 104 376 +1569 4 2 4 1 264 104 263 376 +1570 4 2 4 1 46 55 411 433 +1571 4 2 4 1 80 298 349 391 +1572 4 2 4 1 149 150 181 393 +1573 4 2 4 1 108 203 387 442 +1574 4 2 4 1 127 129 130 443 +1575 4 2 4 1 370 395 362 426 +1576 4 2 4 1 167 197 409 419 +1577 4 2 4 1 179 390 177 404 +1578 4 2 4 1 107 250 150 415 +1579 4 2 4 1 71 186 184 401 +1580 4 2 4 1 330 399 339 401 +1581 4 2 4 1 315 343 255 374 +1582 4 2 4 1 85 63 28 440 +1583 4 2 4 1 119 117 136 383 +1584 4 2 4 1 231 327 229 384 +1585 4 2 4 1 49 295 81 433 +1586 4 2 4 1 378 379 365 434 +1587 4 2 4 1 214 310 213 428 +1588 4 2 4 1 349 355 353 391 +1589 4 2 4 1 301 51 68 439 +1590 4 2 4 1 199 200 202 387 +1591 4 2 4 1 362 377 426 427 +1592 4 2 4 1 163 165 288 432 +1593 4 2 4 1 367 402 381 448 +1594 4 2 4 1 28 386 320 413 +1595 4 2 4 1 127 125 129 443 +1596 4 2 4 1 250 142 171 415 +1597 4 2 4 1 246 19 389 449 +1598 4 2 4 1 330 221 309 433 +1599 4 2 4 1 235 259 237 381 +1600 4 2 4 1 370 406 361 412 +1601 4 2 4 1 362 395 371 414 +1602 4 2 4 1 19 64 18 389 +1603 4 2 4 1 168 302 256 416 +1604 4 2 4 1 136 249 119 383 +1605 4 2 4 1 28 63 29 386 +1606 4 2 4 1 350 348 351 392 +1607 4 2 4 1 173 218 219 408 +1608 4 2 4 1 361 403 370 412 +1609 4 2 4 1 276 164 169 382 +1610 4 2 4 1 353 352 347 400 +1611 4 2 4 1 261 269 153 427 +1612 4 2 4 1 241 434 240 437 +1613 4 2 4 1 389 424 363 449 +1614 4 2 4 1 363 405 398 423 +1615 4 2 4 1 198 394 288 432 +1616 4 2 4 1 117 136 383 450 +1617 4 2 4 1 318 69 275 400 +1618 4 2 4 1 81 317 49 401 +1619 4 2 4 1 364 408 375 445 +1620 4 2 4 1 195 201 74 425 +1621 4 2 4 1 24 61 394 446 +1622 4 2 4 1 139 402 116 447 +1623 4 2 4 1 403 412 361 451 +1624 4 2 4 1 246 18 72 389 +1625 4 2 4 1 63 87 195 386 +1626 4 2 4 1 379 409 377 419 +1627 4 2 4 1 319 210 209 438 +1628 4 2 4 1 82 336 296 388 +1629 4 2 4 1 292 76 293 385 +1630 4 2 4 1 50 59 311 404 +1631 4 2 4 1 278 409 197 419 +1632 4 2 4 1 73 380 410 425 +1633 4 2 4 1 91 248 262 426 +1634 4 2 4 1 17 77 16 417 +1635 4 2 4 1 62 205 21 429 +1636 4 2 4 1 367 447 402 448 +1637 4 2 4 1 382 394 365 432 +1638 4 2 4 1 24 394 435 446 +1639 4 2 4 1 120 132 118 444 +1640 4 2 4 1 261 395 100 427 +1641 4 2 4 1 399 417 369 433 +1642 4 2 4 1 307 338 392 442 +1643 4 2 4 1 363 423 374 424 +1644 4 2 4 1 110 134 427 436 +1645 4 2 4 1 398 405 363 443 +1646 4 2 4 1 367 384 383 447 +1647 4 2 4 1 226 225 227 374 +1648 4 2 4 1 300 299 62 449 +1649 4 2 4 1 327 231 242 447 +1650 4 2 4 1 345 436 244 437 +1651 4 2 4 1 380 387 361 425 +1652 4 2 4 1 198 61 288 394 +1653 4 2 4 1 85 379 270 440 +1654 4 2 4 1 111 109 277 377 +1655 4 2 4 1 354 348 352 392 +1656 4 2 4 1 390 401 369 404 +1657 4 2 4 1 178 177 179 390 +1658 4 2 4 1 377 409 362 426 +1659 4 2 4 1 264 263 211 451 +1660 4 2 4 1 239 229 327 444 +1661 4 2 4 1 385 420 383 453 +1662 4 2 4 1 188 186 194 445 +1663 4 2 4 1 167 197 247 409 +1664 4 2 4 1 363 398 374 423 +1665 4 2 4 1 257 109 98 426 +1666 4 2 4 1 197 278 248 409 +1667 4 2 4 1 76 292 204 385 +1668 4 2 4 1 236 381 237 437 +1669 4 2 4 1 242 234 331 448 +1670 4 2 4 1 116 447 402 450 +1671 4 2 4 1 385 367 446 452 +1672 4 2 4 1 46 15 1 326 +1673 4 2 4 1 325 33 2 346 +1674 4 2 4 1 78 307 283 392 +1675 4 2 4 1 381 394 367 435 +1676 4 2 4 1 236 238 244 437 +1677 4 2 4 1 292 204 385 446 +1678 4 2 4 1 210 380 209 438 +1679 4 2 4 1 251 233 258 452 +1680 4 2 4 1 382 367 420 450 +1681 4 2 4 1 24 435 252 452 +1682 4 2 4 1 122 121 407 444 +1683 4 2 4 1 60 79 297 411 +1684 4 2 4 1 24 252 23 452 +1685 4 2 4 1 144 146 143 418 +1686 4 2 4 1 235 237 236 381 +1687 4 2 4 1 232 231 230 384 +1688 4 2 4 1 222 215 64 424 +1689 4 2 4 1 110 100 109 427 +1690 4 2 4 1 320 28 29 386 +1691 4 2 4 1 372 418 363 443 +1692 4 2 4 1 152 151 144 418 +1693 4 2 4 1 169 162 285 420 +1694 4 2 4 1 85 75 270 379 +1695 4 2 4 1 139 116 329 447 +1696 4 2 4 1 367 384 448 452 +1697 4 2 4 1 156 157 155 421 +1698 4 2 4 1 121 249 135 407 +1699 4 2 4 1 153 145 106 414 +1700 4 2 4 1 82 388 33 431 +1701 4 2 4 1 368 407 373 421 +1702 4 2 4 1 310 193 309 399 +1703 4 2 4 1 189 191 190 375 +1704 4 2 4 1 158 159 421 453 +1705 4 2 4 1 246 170 300 449 +1706 4 2 4 1 220 272 129 443 +1707 4 2 4 1 324 15 46 411 +1708 4 2 4 1 321 73 410 425 +1709 4 2 4 1 242 447 231 448 +1710 4 2 4 1 158 159 157 421 +1711 4 2 4 1 332 114 139 402 +1712 4 2 4 1 304 282 265 400 +1713 4 2 4 1 131 315 255 423 +1714 4 2 4 1 51 342 48 439 +1715 4 2 4 1 377 378 365 436 +1716 4 2 4 1 29 63 195 386 +1717 4 2 4 1 62 396 20 449 +1718 4 2 4 1 264 266 104 376 +1719 4 2 4 1 363 405 372 443 +1720 4 2 4 1 57 47 53 401 +1721 4 2 4 1 57 49 317 401 +1722 4 2 4 1 179 311 59 404 +1723 4 2 4 1 361 410 380 425 +1724 4 2 4 1 231 384 232 448 +1725 4 2 4 1 81 330 339 401 +1726 4 2 4 1 208 206 207 417 +1727 4 2 4 1 382 402 367 450 +1728 4 2 4 1 243 253 67 434 +1729 4 2 4 1 226 227 343 374 +1730 4 2 4 1 390 399 369 401 +1731 4 2 4 1 356 346 355 388 +1732 4 2 4 1 257 98 96 426 +1733 4 2 4 1 247 88 86 440 +1734 4 2 4 1 260 252 435 452 +1735 4 2 4 1 24 61 25 394 +1736 4 2 4 1 299 300 170 449 +1737 4 2 4 1 435 446 367 452 +1738 4 2 4 1 366 431 380 438 +1739 4 2 4 1 192 193 399 445 +1740 4 2 4 1 260 233 252 452 +1741 4 2 4 1 40 304 359 282 +1742 4 2 4 1 178 179 184 390 +1743 4 2 4 1 364 372 408 441 +1744 4 2 4 1 379 419 365 432 +1745 4 2 4 1 367 448 435 452 +1746 4 2 4 1 281 158 421 453 +1747 4 2 4 1 161 291 292 446 +1748 4 2 4 1 196 79 342 439 +1749 4 2 4 1 122 120 121 444 +1750 4 2 4 1 345 244 238 437 +1751 4 2 4 1 108 217 203 442 +1752 4 2 4 1 68 404 333 439 +1753 4 2 4 1 343 315 226 374 +1754 4 2 4 1 46 56 55 433 +1755 4 2 4 1 350 347 352 400 +1756 4 2 4 1 216 108 203 387 +1757 4 2 4 1 364 417 399 428 +1758 4 2 4 1 226 337 224 423 +1759 4 2 4 1 23 251 22 452 +1760 4 2 4 1 359 350 40 282 +1761 4 2 4 1 183 308 357 391 +1762 4 2 4 1 116 402 115 450 +1763 4 2 4 1 380 393 366 438 +1764 4 2 4 1 372 405 375 408 +1765 4 2 4 1 308 349 357 391 +1766 4 2 4 1 47 52 53 404 +1767 4 2 4 1 137 272 144 443 +1768 4 2 4 1 68 50 404 439 +1769 4 2 4 1 245 223 222 424 +1770 4 2 4 1 273 378 154 414 +1771 4 2 4 1 172 141 397 441 +1772 4 2 4 1 104 94 95 412 +1773 4 2 4 1 226 374 315 423 +1774 4 2 4 1 285 420 160 453 +1775 4 2 4 1 31 199 32 431 +1776 4 2 4 1 285 160 287 453 +1777 4 2 4 1 51 301 342 439 +1778 4 2 4 1 273 269 134 427 +1779 4 2 4 1 70 305 282 392 +1780 4 2 4 1 73 31 380 425 +1781 4 2 4 1 50 51 48 439 +1782 4 2 4 1 313 8 59 179 +1783 4 2 4 1 174 333 397 439 +1784 4 2 4 1 261 100 269 427 +1785 4 2 4 1 82 296 323 388 +1786 4 2 4 1 263 403 101 451 +1787 4 2 4 1 267 147 145 414 +1788 4 2 4 1 130 129 137 443 +1789 4 2 4 1 363 418 389 449 +1790 4 2 4 1 102 101 99 403 +1791 4 2 4 1 56 46 1 326 +1792 4 2 4 1 356 325 2 346 +1793 4 2 4 1 58 54 60 411 +1794 4 2 4 1 313 59 8 47 +1795 4 2 4 1 362 414 378 427 +1796 4 2 4 1 273 134 345 436 +1797 4 2 4 1 367 420 385 446 +1798 4 2 4 1 372 364 416 441 +1799 4 2 4 1 281 287 158 453 +1800 4 2 4 1 338 283 307 392 +1801 4 2 4 1 365 419 377 430 +1802 4 2 4 1 19 18 246 389 +1803 4 2 4 1 310 192 193 399 +1804 4 2 4 1 362 413 386 440 +1805 4 2 4 1 177 333 68 404 +1806 4 2 4 1 361 415 403 451 +1807 4 2 4 1 185 178 184 390 +1808 4 2 4 1 243 378 240 434 +1809 4 2 4 1 198 25 61 394 +1810 4 2 4 1 273 153 269 427 +1811 4 2 4 1 365 430 377 436 +1812 4 2 4 1 50 52 404 439 +1813 4 2 4 1 116 115 117 450 +1814 4 2 4 1 296 44 358 360 +1815 4 2 4 1 185 390 186 445 +1816 4 2 4 1 377 427 378 436 +1817 4 2 4 1 76 22 205 429 +1818 4 2 4 1 131 289 290 423 +1819 4 2 4 1 189 312 191 375 +1820 4 2 4 1 175 196 174 397 +1821 4 2 4 1 140 130 138 441 +1822 4 2 4 1 263 97 101 403 +1823 4 2 4 1 259 260 66 435 +1824 4 2 4 1 185 184 186 390 +1825 4 2 4 1 20 222 19 449 +1826 4 2 4 1 362 426 395 427 +1827 4 2 4 1 139 329 242 447 +1828 4 2 4 1 276 278 166 419 +1829 4 2 4 1 246 300 19 449 +1830 4 2 4 1 253 26 27 434 +1831 4 2 4 1 174 333 172 397 +1832 4 2 4 1 174 397 196 439 +1833 4 2 4 1 330 81 295 433 +1834 4 2 4 1 348 350 352 392 +1835 4 2 4 1 300 62 20 449 +1836 4 2 4 1 395 414 362 427 +1837 4 2 4 1 262 257 96 426 +1838 4 2 4 1 304 69 39 359 +1839 4 2 4 1 107 149 148 393 +1840 4 2 4 1 225 268 228 422 +1841 4 2 4 1 362 409 379 440 +1842 4 2 4 1 216 203 200 387 +1843 4 2 4 1 240 378 344 437 +1844 4 2 4 1 321 30 73 425 +1845 4 2 4 1 71 194 186 401 +1846 4 2 4 1 31 209 73 380 +1847 4 2 4 1 113 111 133 430 +1848 4 2 4 1 201 89 216 406 +1849 4 2 4 1 32 82 33 431 +1850 4 2 4 1 328 275 69 400 +1851 4 2 4 1 165 167 280 432 +1852 4 2 4 1 87 201 195 406 +1853 4 2 4 1 69 347 39 359 +1854 4 2 4 1 33 82 323 388 +1855 4 2 4 1 364 399 390 445 +1856 4 2 4 1 171 334 316 410 +1857 4 2 4 1 327 242 132 447 +1858 4 2 4 1 50 48 52 439 +1859 4 2 4 1 80 314 298 391 +1860 4 2 4 1 13 60 297 58 +1861 4 2 4 1 99 98 100 395 +1862 4 2 4 1 270 247 86 440 +1863 4 2 4 1 171 147 176 410 +1864 4 2 4 1 308 80 349 391 +1865 4 2 4 1 18 17 72 428 +1866 4 2 4 1 295 49 56 433 +1867 4 2 4 1 269 110 134 427 +1868 4 2 4 1 305 392 338 442 +1869 4 2 4 1 351 283 42 70 +1870 4 2 4 1 125 123 220 398 +1871 4 2 4 1 266 305 271 442 +1872 4 2 4 1 241 243 240 434 +1873 4 2 4 1 314 319 84 438 +1874 4 2 4 1 188 339 193 399 +1875 4 2 4 1 381 435 367 448 +1876 4 2 4 1 172 140 141 441 +1877 4 2 4 1 250 105 142 415 +1878 4 2 4 1 369 401 399 433 +1879 4 2 4 1 210 73 209 380 +1880 4 2 4 1 21 20 62 396 +1881 4 2 4 1 367 383 420 450 +1882 4 2 4 1 168 208 302 416 +1883 4 2 4 1 416 417 364 428 +1884 4 2 4 1 329 116 118 447 +1885 4 2 4 1 123 122 121 407 +1886 4 2 4 1 211 103 148 451 +1887 4 2 4 1 261 99 100 395 +1888 4 2 4 1 107 150 149 393 +1889 4 2 4 1 346 354 355 388 +1890 4 2 4 1 319 182 210 438 +1891 4 2 4 1 167 166 197 419 +1892 4 2 4 1 176 73 334 410 +1893 4 2 4 1 213 310 77 428 +1894 4 2 4 1 136 284 285 450 +1895 4 2 4 1 236 237 238 437 +1896 4 2 4 1 367 435 394 446 +1897 4 2 4 1 200 203 202 387 +1898 4 2 4 1 21 245 20 396 +1899 4 2 4 1 128 126 127 405 +1900 4 2 4 1 56 49 55 433 +1901 4 2 4 1 234 242 231 448 +1902 4 2 4 1 108 271 217 442 +1903 4 2 4 1 78 43 360 283 +1904 4 2 4 1 101 97 99 403 +1905 4 2 4 1 181 314 391 438 +1906 4 2 4 1 346 33 2 323 +1907 4 2 4 1 324 15 1 46 +1908 4 2 4 1 103 105 107 415 +1909 4 2 4 1 317 71 57 401 +1910 4 2 4 1 24 204 61 446 +1911 4 2 4 1 213 77 17 428 +1912 4 2 4 1 177 68 311 404 +1913 4 2 4 1 17 16 206 417 +1914 4 2 4 1 141 174 172 397 +1915 4 2 4 1 307 217 338 442 +1916 4 2 4 1 206 83 207 417 +1917 4 2 4 1 248 257 262 426 +1918 4 2 4 1 313 7 71 47 +1919 4 2 4 1 195 74 30 425 +1920 4 2 4 1 58 324 46 411 +1921 4 2 4 1 296 44 360 78 +1922 4 2 4 1 128 289 126 405 +1923 4 2 4 1 182 181 150 438 +1924 4 2 4 1 260 235 232 448 +1925 4 2 4 1 203 217 307 442 +1926 4 2 4 1 85 86 63 440 +1927 4 2 4 1 188 399 193 445 +1928 4 2 4 1 154 273 344 378 +1929 4 2 4 1 311 59 8 179 +1930 4 2 4 1 215 224 335 424 +1931 4 2 4 1 197 248 91 409 +1932 4 2 4 1 402 447 367 450 +1933 4 2 4 1 57 53 49 401 +1934 4 2 4 1 357 349 353 391 +1935 4 2 4 1 125 124 123 398 +1936 4 2 4 1 351 42 283 348 +1937 4 2 4 1 338 70 283 392 +1938 4 2 4 1 303 72 208 416 +1939 4 2 4 1 128 218 274 408 +1940 4 2 4 1 70 338 305 392 +1941 4 2 4 1 378 434 365 437 +1942 4 2 4 1 123 121 135 407 +1943 4 2 4 1 202 336 82 431 +1944 4 2 4 1 273 154 153 414 +1945 4 2 4 1 304 265 328 400 +1946 4 2 4 1 247 197 91 409 +1947 4 2 4 1 85 270 86 440 +1948 4 2 4 1 166 278 197 419 +1949 4 2 4 1 46 55 54 411 +1950 4 2 4 1 68 50 311 404 +1951 4 2 4 1 141 175 174 397 +1952 4 2 4 1 65 258 268 422 +1953 4 2 4 1 114 115 116 402 +1954 4 2 4 1 69 304 328 400 +1955 4 2 4 1 365 436 378 437 +1956 4 2 4 1 383 367 447 450 +1957 4 2 4 1 87 89 201 406 +1958 4 2 4 1 110 269 100 427 +1959 4 2 4 1 193 330 309 399 +1960 4 2 4 1 254 26 253 434 +1961 4 2 4 1 81 5 49 317 +1962 4 2 4 1 128 219 218 408 +1963 4 2 4 1 36 357 308 349 +1964 4 2 4 1 276 286 133 430 +1965 4 2 4 1 50 68 10 51 +1966 4 2 4 1 122 322 120 444 +1967 4 2 4 1 283 43 360 348 +1968 4 2 4 1 367 384 447 448 +1969 4 2 4 1 12 342 79 60 +1970 4 2 4 1 134 110 112 436 +1971 4 2 4 1 240 154 344 378 +1972 4 2 4 1 7 57 71 47 +1973 4 2 4 1 292 291 204 446 +1974 4 2 4 1 240 243 154 378 +1975 4 2 4 1 192 188 193 445 +1976 4 2 4 1 324 83 15 411 +1977 4 2 4 1 234 231 232 448 +1978 4 2 4 1 132 329 118 447 +1979 4 2 4 1 137 129 272 443 +1980 4 2 4 1 60 79 13 297 +1981 4 2 4 1 189 188 192 445 +1982 4 2 4 1 94 92 93 412 +1983 4 2 4 1 321 73 176 410 +1984 4 2 4 1 254 253 241 434 +1985 4 2 4 1 206 16 83 417 +1986 4 2 4 1 295 4 49 81 +1987 4 2 4 1 341 180 267 413 +1988 4 2 4 1 68 301 10 51 +1989 4 2 4 1 73 30 31 425 +1990 4 2 4 1 22 65 21 429 +1991 4 2 4 1 297 79 340 411 +1992 4 2 4 1 198 288 280 432 +1993 4 2 4 1 30 74 31 425 +1994 4 2 4 1 284 117 115 450 +1995 4 2 4 1 50 47 59 404 +1996 4 2 4 1 132 239 327 444 +1997 4 2 4 1 160 162 161 420 +1998 4 2 4 1 345 332 244 436 +1999 4 2 4 1 18 213 17 428 +2000 4 2 4 1 158 156 281 421 +2001 4 2 4 1 193 339 330 399 +2002 4 2 4 1 358 346 45 323 +2003 4 2 4 1 58 324 14 46 +2004 4 2 4 1 132 242 329 447 +2005 4 2 4 1 194 317 81 401 +2006 4 2 4 1 138 256 141 441 +2007 4 2 4 1 223 224 215 424 +2008 4 2 4 1 151 170 146 418 +2009 4 2 4 1 68 333 301 439 +2010 4 2 4 1 211 263 101 451 +2011 4 2 4 1 139 114 116 402 +2012 4 2 4 1 94 93 95 412 +2013 4 2 4 1 81 339 194 401 +2014 4 2 4 1 237 241 240 437 +2015 4 2 4 1 317 5 49 57 +2016 4 2 4 1 51 301 11 342 +2017 4 2 4 1 168 303 208 416 +2018 4 2 4 1 80 36 308 349 +2019 4 2 4 1 58 297 324 411 +2020 4 2 4 1 258 228 268 422 +2021 4 2 4 1 20 19 300 449 +2022 4 2 4 1 311 179 177 404 +2023 4 2 4 1 308 181 80 391 +2024 4 2 4 1 286 113 133 430 +2025 4 2 4 1 117 284 136 450 +2026 4 2 4 1 181 314 80 391 +2027 4 2 4 1 204 291 61 446 +2028 4 2 4 1 238 240 344 437 +2029 4 2 4 1 105 250 107 415 +2030 4 2 4 1 232 235 234 448 +2031 4 2 4 1 151 146 144 418 +2032 4 2 4 1 52 47 50 404 +2033 4 2 4 1 35 349 298 356 +2034 4 2 4 1 349 80 35 298 +2035 4 2 4 1 158 157 156 421 +2036 4 2 4 1 285 162 160 420 +2037 4 2 4 1 189 187 188 445 +2038 4 2 4 1 24 66 252 435 +2039 4 2 4 1 288 165 280 432 +2040 4 2 4 1 181 182 314 438 +2041 4 2 4 1 22 21 205 429 +2042 4 2 4 1 342 12 48 60 +2043 4 2 4 1 221 326 15 433 +2044 4 2 4 1 194 71 317 401 +2045 4 2 4 1 308 183 181 391 +2046 4 2 4 1 223 215 222 424 +2047 4 2 4 1 322 239 132 444 +2048 4 2 4 1 217 305 338 442 +2049 4 2 4 1 211 101 103 451 +2050 4 2 4 1 160 159 158 453 +2051 4 2 4 1 38 347 69 318 +2052 4 2 4 1 138 141 140 441 +2053 4 2 4 1 221 330 295 433 +2054 4 2 4 1 241 253 243 434 +2055 4 2 4 1 38 347 318 357 +2056 4 2 4 1 217 271 305 442 +2057 4 2 4 1 28 320 67 413 +2058 4 2 4 1 187 185 186 445 +2059 4 2 4 1 83 297 340 411 +2060 4 2 4 1 301 196 342 439 +2061 4 2 4 1 341 67 180 413 +2062 4 2 4 1 252 66 260 435 +2063 4 2 4 1 237 240 238 437 +2064 4 2 4 1 41 40 350 282 +2065 4 2 4 1 357 183 37 308 +2066 4 2 4 1 37 318 183 357 +2067 4 2 4 1 11 48 51 342 +2068 4 2 4 1 295 4 56 49 +2069 4 2 4 1 199 202 82 431 +2070 4 2 4 1 290 337 226 423 +2071 4 2 4 1 251 252 233 452 +2072 4 2 4 1 56 326 295 433 +2073 4 2 4 1 323 45 358 296 +2074 4 2 4 1 134 332 345 436 +2075 4 2 4 1 251 23 252 452 +2076 4 2 4 1 174 196 301 439 +2077 4 2 4 1 287 160 158 453 +2078 4 2 4 1 46 54 58 411 +2079 4 2 4 1 134 112 332 436 +2080 4 2 4 1 176 334 171 410 +2081 4 2 4 1 44 43 360 78 +2082 4 2 4 1 14 297 324 58 +2083 4 2 4 1 174 301 333 439 +2084 4 2 4 1 290 226 315 423 +2085 4 2 4 1 199 82 32 431 +2086 4 2 4 1 180 67 320 413 +2087 4 2 4 1 39 38 347 69 +2088 4 2 4 1 290 315 131 423 +2089 4 2 4 1 13 12 79 60 +2090 4 2 4 1 221 295 326 433 +2091 4 2 4 1 120 322 132 444 +2092 4 2 4 1 297 83 324 411 +2093 4 2 4 1 42 43 283 348 +2094 4 2 4 1 2 45 346 323 +2095 4 2 4 1 324 1 14 46 +2096 4 2 4 1 68 10 9 50 +2097 4 2 4 1 49 4 5 81 +2098 4 2 4 1 153 154 145 414 +2099 4 2 4 1 57 6 7 71 +2100 4 2 4 1 182 319 314 438 +2101 4 2 4 1 42 41 351 70 +2102 4 2 4 1 57 317 6 71 +2103 4 2 4 1 313 8 7 47 +2104 4 2 4 1 154 267 145 414 +2105 4 2 4 1 298 34 35 356 +2106 4 2 4 1 1 3 56 326 +2107 4 2 4 1 325 2 34 356 +2108 4 2 4 1 301 11 10 51 +2109 4 2 4 1 59 8 9 311 +2110 4 2 4 1 39 40 304 359 +2111 4 2 4 1 34 298 325 356 +2112 4 2 4 1 188 187 186 445 +2113 4 2 4 1 11 12 48 342 +2114 4 2 4 1 45 44 358 296 +2115 4 2 4 1 3 4 56 295 +2116 4 2 4 1 318 37 38 357 +2117 4 2 4 1 37 36 357 308 +2118 4 2 4 1 326 3 56 295 +2119 4 2 4 1 35 36 80 349 +2120 4 2 4 1 297 14 13 58 +2121 4 2 4 1 6 5 317 57 +2122 4 2 4 1 423 191 335 375 +2123 4 2 4 1 423 335 191 337 +2124 4 2 4 1 424 214 335 215 +2125 4 2 4 1 424 335 214 375 +2126 4 2 4 1 214 424 64 215 +2127 4 2 4 1 64 424 214 389 +2128 4 2 4 1 422 223 225 268 +2129 4 2 4 1 422 225 223 374 +2130 4 2 4 1 306 411 417 340 +2131 4 2 4 1 417 411 306 369 +2132 4 2 4 1 444 249 119 121 +2133 4 2 4 1 444 119 249 383 +2134 4 2 4 1 406 371 410 386 +2135 4 2 4 1 406 410 371 361 +2136 4 2 4 1 398 279 272 373 +2137 4 2 4 1 398 272 279 220 +2138 4 2 4 1 403 98 99 395 +2139 4 2 4 1 403 99 98 97 +2140 4 2 4 1 343 444 422 239 +2141 4 2 4 1 422 444 343 374 +2142 4 2 4 1 422 227 343 239 +2143 4 2 4 1 343 227 422 374 +2144 4 2 4 1 412 90 406 92 +2145 4 2 4 1 412 406 90 370 +2146 4 2 4 1 413 243 414 341 +2147 4 2 4 1 413 414 243 378 +2148 4 2 4 1 411 52 439 369 +2149 4 2 4 1 411 439 52 54 +2150 4 2 4 1 425 200 199 387 +2151 4 2 4 1 425 199 200 74 +2152 4 2 4 1 375 190 408 405 +2153 4 2 4 1 289 190 408 274 +2154 4 2 4 1 289 408 190 405 +2155 4 2 4 1 441 219 173 140 +2156 4 2 4 1 441 173 219 408 +2157 4 2 4 1 422 245 223 268 +2158 4 2 4 1 422 223 245 396 +2159 4 2 4 1 404 71 47 313 +2160 4 2 4 1 404 47 71 401 +2161 4 2 4 1 431 209 31 380 +2162 4 2 4 1 431 31 209 32 +2163 4 2 4 1 87 440 63 86 +2164 4 2 4 1 63 440 87 386 +2165 4 2 4 1 453 285 136 287 +2166 4 2 4 1 453 136 285 420 +2167 4 2 4 1 453 136 249 287 +2168 4 2 4 1 453 249 136 383 +2169 4 2 4 1 445 194 401 186 +2170 4 2 4 1 445 401 194 399 +2171 4 2 4 1 439 390 333 397 +2172 4 2 4 1 439 333 390 404 +2173 4 2 4 1 177 333 390 397 +2174 4 2 4 1 177 390 333 404 +2175 4 2 4 1 124 423 126 131 +2176 4 2 4 1 126 423 124 398 +2177 4 2 4 1 350 70 41 282 +2178 4 2 4 1 41 70 350 351 +2179 4 2 4 1 414 243 154 267 +2180 4 2 4 1 414 154 243 378 +2181 4 2 4 1 282 359 400 304 +2182 4 2 4 1 282 400 359 350 +2183 4 2 4 1 450 118 116 447 +2184 4 2 4 1 450 116 118 117 +2185 4 2 4 1 451 264 212 211 +2186 4 2 4 1 451 212 264 376 +2187 4 2 4 1 171 415 316 250 +2188 4 2 4 1 316 415 171 410 +2189 4 2 4 1 166 432 167 165 +2190 4 2 4 1 167 432 166 419 +2191 4 2 4 1 452 260 448 435 +2192 4 2 4 1 452 448 260 233 +2193 4 2 4 1 50 311 9 68 +2194 4 2 4 1 50 9 311 59 +2195 4 2 4 1 190 408 187 375 +2196 4 2 4 1 190 187 408 274 +2197 4 2 4 1 445 187 408 375 +2198 4 2 4 1 187 408 185 445 +2199 4 2 4 1 187 185 408 274 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/run.py b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/run.py new file mode 100644 index 00000000..28146bff --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/run.py @@ -0,0 +1,139 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .mesh_gen import generate_beam3D_circular_tet +from .sofa_scene import sofaRun + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "3D — Circular beam, axial traction" + +MATH_DESCRIPTION = """ +Poutre 3D a section circulaire (rayon r, longueur L), encastree sur la +face x=0 (label 1, Fixed), soumise a une traction axiale uniforme sur la +face x=L (label 2, Loaded) : contrainte q = F/A avec A = pi*r^2. + + -div(sigma) = 0 dans Omega + sigma.n = (q, 0, 0) sur la face Loaded (x=L) + u = 0 sur la face Fixed (x=0) + +Elasticite 3D complete : + lambda = E*nu / ((1+nu)(1-2nu)), mu = E / (2(1+nu)) + +Solution analytique en champ lointain (traction uniaxiale simple) : + ux(x,y,z) = (q/E) * x + uy(x,y,z) = -nu*(q/E) * y + uz(x,y,z) = -nu*(q/E) * z + +Valable seulement pour x >= exclusionFactor*r (effet Saint-Venant : la +face encastree perturbe la solution pres du bord). La comparaison SOFA +vs FreeFem, elle, reste valable sur tout le domaine. +""" + + +def _load_mesh_cfg(): + with open(os.path.join(HERE, "params_mesh.json")) as f: + return json.load(f)["beam3d_circle_tet"] + + +def _load_phys_cfg(): + with open(os.path.join(HERE, "params_beam3d_circle_traction.json")) as f: + return json.load(f) + + +def _mesh_path(meshfile): + return os.path.join(HERE, "results", meshfile) + + +def _match_by_coordinates(coords_a, vals_a, coords_b, vals_b, tol=1e-6): + """Appariement par plus proche voisin (fidele a comparaison_script3d_circle.py) : + pour chaque noeud de coords_a, cherche le plus proche dans coords_b.""" + matched_a, matched_b, matched_coords = [], [], [] + for i, c in enumerate(coords_a): + d = np.linalg.norm(coords_b - c, axis=1) + j = np.argmin(d) + if d[j] > tol: + continue + matched_coords.append(c) + matched_a.append(vals_a[i]) + matched_b.append(vals_b[j]) + return np.array(matched_coords), np.array(matched_a), np.array(matched_b) + + +def _analytical_far_field(coords, E, nu, q): + x, y, z = coords[:, 0], coords[:, 1], coords[:, 2] + ux = (q / E) * x + uy = -nu * (q / E) * y + uz = -nu * (q / E) * z + return np.column_stack([ux, uy, uz]) + + +def run_case(): + mesh_cfg = _load_mesh_cfg() + phys_cfg = _load_phys_cfg() + + length = float(mesh_cfg["length"]) + radius = float(mesh_cfg["radius"]) + E = float(phys_cfg["youngModulus"]) + nu = float(phys_cfg["poissonRatio"]) + q = float(phys_cfg["q"]) + exclusion_factor = float(phys_cfg.get("exclusionFactor", 2.0)) + + # --- Maillage : genere s'il n'existe pas deja --- + msh_path = _mesh_path(mesh_cfg["meshfile"]) + if not os.path.isfile(msh_path): + os.makedirs(os.path.dirname(msh_path), exist_ok=True) + generate_beam3D_circular_tet( + length=length, radius=radius, + mesh_size=float(mesh_cfg["mesh_size"]), + filename=msh_path, # chemin absolu -> ecrit exactement ici + ) + + # --- FreeFem++ --- + # F = q*A calcule explicitement (le .edp attend "F", pas "q" : lui + # passer "q" directement serait ignore silencieusement, cf. discussion). + A = np.pi * radius**2 + F = q * A + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3d_circle_traction.edp")) + exports = runner.execute({ + "meshfile": os.path.abspath(msh_path), + "E": E, "nu": nu, "F": F, "radius": radius, "length": length, + "exclusionFactor": exclusion_factor, + }, verbosity=0) + ux_ff = np.asarray(exports["ux[]"]) + uy_ff = np.asarray(exports["uy[]"]) + uz_ff = np.asarray(exports["uz[]"]) + coords_ff = np.column_stack([exports["xcoords"], exports["ycoords"], exports["zcoords"]]) + + # --- SOFA --- + coords_sofa, u_sofa = sofaRun(mesh_file=msh_path, q=q, + young_modulus=E, poisson_ratio=nu) + + # --- Appariement (plus proche voisin, par composante) --- + tol = 1e-6 * max(length, radius) + coords_m, ux_sofa_m, ux_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 0], coords_ff, ux_ff, tol=tol) + _, uy_sofa_m, uy_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 1], coords_ff, uy_ff, tol=tol) + _, uz_sofa_m, uz_ff_m = _match_by_coordinates(coords_sofa, u_sofa[:, 2], coords_ff, uz_ff, tol=tol) + + u_sofa_m = np.column_stack([ux_sofa_m, uy_sofa_m, uz_sofa_m]) + u_ff_m = np.column_stack([ux_ff_m, uy_ff_m, uz_ff_m]) + + # --- Champ analytique en zone lointaine (calcule sur tous les noeuds + # apparies ; le masque x >= exclusion_x est applique par compare_far_field) --- + exclusion_x = exclusion_factor * radius + u_far_field_ana = _analytical_far_field(coords_m, E, nu, q) + + return { + "label": LABEL, + "dim": 3, + "coords_ff": coords_m, + "u_ff": u_ff_m, + "coords_sofa": coords_m, + "u_sofa": u_sofa_m, + "u_ana": None, + "component_names": ["ux", "uy", "uz"], + "u_far_field_ana": u_far_field_ana, + "saint_venant_x": exclusion_x, + } diff --git a/examples/Freefem/projet_validation/cases/case_3d/circular_traction/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/sofa_scene.py new file mode 100644 index 00000000..b2936da9 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/circular_traction/sofa_scene.py @@ -0,0 +1,168 @@ +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + + +def consistent_traction_forces(nodes, loaded_faces, q): + + N = len(nodes) + F = np.zeros((N, 3)) + for tri in loaded_faces: + pts = nodes[tri, :] + v1 = pts[1] - pts[0] + v2 = pts[2] - pts[0] + area = 0.5 * np.linalg.norm(np.cross(v1, v2)) + for nid in tri: + F[nid, 0] += q * area / 3.0 + return F + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), + RESULTS_DIR, "beam3d_circle_tet.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3d_circle_traction.json") + + +def create_scene_args(rootNode, mesh_file, q, young_modulus, poisson_ratio, tol=1e-6): + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + if not os.path.isfile(mesh_file): + raise FileNotFoundError( + f"Maillage introuvable : {mesh_file}\n" + f"-> generate it first : python beam3d_circular_tet.py params.json" + ) + + loader = Beam.addObject('MeshGmshLoader', name="loader", filename=mesh_file) + + nodes = np.array(loader.position.value) + tets = np.array(loader.tetrahedra.value) + tris = np.array(loader.triangles.value) + N = len(nodes) + + x_min = nodes[:, 0].min() + x_max = nodes[:, 0].max() + fixed_idx = np.where(np.isclose(nodes[:, 0], x_min, atol=tol))[0].tolist() + loaded_mask = np.all(np.isclose(nodes[tris, 0], x_max, atol=tol), axis=1) + loaded_faces = tris[loaded_mask] + + assert len(fixed_idx) > 0, "error " + assert len(loaded_faces) > 0, " (x_max) not found " + + F_nodal = consistent_traction_forces(nodes, loaded_faces, q) + forces_list = F_nodal.tolist() + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position="@loader.position" + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TetrahedronSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TetrahedronSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + Beam.addObject('ConstantForceField' + , name="LoadedTraction" + , indices=list(range(N)) + , forces=forces_list) + + return rootNode, dofs, nodes.copy() + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) + return rootNode + + +def sofaRun(mesh_file, q, young_modulus, poisson_ratio): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + u = pos_final[:, :3] - pos0[:, :3] + x0 = pos0[:, :3] + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, "sofa_beam3d_circle_traction_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'z0':>12} {'ux':>12} {'uy':>12} {'uz':>12}\n") + f.write("-" * 78 + "\n") + for (xi, yi, zi), (uxi, uyi, uzi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {zi:12.6f} {uxi:12.6f} {uyi:12.6f} {uzi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/beam3d_tet.msh b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/beam3d_tet.msh new file mode 100644 index 00000000..a6239eff --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/beam3d_tet.msh @@ -0,0 +1,588 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +7 +2 1 "Fixed" +2 2 "Bottom" +2 3 "Right" +2 4 "Top" +2 5 "Front" +2 6 "Back" +3 7 "Beam" +$EndPhysicalNames +$Nodes +105 +1 0 0 0 +2 1 0 0 +3 1 0.2 0 +4 0 0.2 0 +5 0 0 0.2 +6 1 0 0.2 +7 1 0.2 0.2 +8 0 0.2 0.2 +9 0.09999999999981413 0 0 +10 0.1999999999995569 0 0 +11 0.299999999999265 0 0 +12 0.3999999999989731 0 0 +13 0.4999999999986921 0 0 +14 0.599999999998945 0 0 +15 0.6999999999992088 0 0 +16 0.7999999999994725 0 0 +17 0.8999999999997362 0 0 +18 1 0.0999999999997371 0 +19 0.8999999999995836 0.2 0 +20 0.8 0.2 0 +21 0.7000000000006938 0.2 0 +22 0.6000000000013874 0.2 0 +23 0.5000000000020595 0.2 0 +24 0.400000000001665 0.2 0 +25 0.3000000000012487 0.2 0 +26 0.2000000000008325 0.2 0 +27 0.1000000000004162 0.2 0 +28 0 0.100000000000274 0 +29 0.09999999999981413 0 0.2 +30 0.1999999999995569 0 0.2 +31 0.299999999999265 0 0.2 +32 0.3999999999989731 0 0.2 +33 0.4999999999986921 0 0.2 +34 0.599999999998945 0 0.2 +35 0.6999999999992088 0 0.2 +36 0.7999999999994725 0 0.2 +37 0.8999999999997362 0 0.2 +38 1 0.0999999999997371 0.2 +39 0.8999999999995836 0.2 0.2 +40 0.8 0.2 0.2 +41 0.7000000000006938 0.2 0.2 +42 0.6000000000013874 0.2 0.2 +43 0.5000000000020595 0.2 0.2 +44 0.400000000001665 0.2 0.2 +45 0.3000000000012487 0.2 0.2 +46 0.2000000000008325 0.2 0.2 +47 0.1000000000004162 0.2 0.2 +48 0 0.100000000000274 0.2 +49 0 0 0.0999999999997371 +50 1 0 0.0999999999997371 +51 1 0.2 0.0999999999997371 +52 0 0.2 0.0999999999997371 +53 0.1000000000001152 0.1000000000002203 0 +54 0.2000000000001947 0.1000000000001666 0 +55 0.3000000000002568 0.1000000000001129 0 +56 0.4000000000003191 0.1000000000000592 0 +57 0.5000000000003757 0.1000000000000056 0 +58 0.6000000000001662 0.09999999999995186 0 +59 0.6999999999999513 0.09999999999989816 0 +60 0.7999999999997363 0.09999999999984448 0 +61 0.89999999999966 0.09999999999979081 0 +62 0.1000000000001152 0.1000000000002203 0.2 +63 0.2000000000001947 0.1000000000001666 0.2 +64 0.3000000000002568 0.1000000000001129 0.2 +65 0.4000000000003192 0.1000000000000592 0.2 +66 0.5000000000003757 0.1000000000000055 0.2 +67 0.6000000000001662 0.09999999999995185 0.2 +68 0.6999999999999513 0.09999999999989817 0.2 +69 0.7999999999997363 0.09999999999984449 0.2 +70 0.89999999999966 0.09999999999979081 0.2 +71 0.09999999999981413 0 0.0999999999997371 +72 0.1999999999995569 0 0.0999999999997371 +73 0.299999999999265 0 0.0999999999997371 +74 0.3999999999989731 0 0.0999999999997371 +75 0.4999999999986922 0 0.0999999999997371 +76 0.599999999998945 0 0.0999999999997371 +77 0.6999999999992088 0 0.0999999999997371 +78 0.7999999999994725 0 0.0999999999997371 +79 0.8999999999997362 0 0.0999999999997371 +80 0.8999999999995836 0.2 0.0999999999997371 +81 0.8 0.2 0.0999999999997371 +82 0.7000000000006938 0.2 0.0999999999997371 +83 0.6000000000013874 0.2 0.0999999999997371 +84 0.5000000000020595 0.2 0.0999999999997371 +85 0.400000000001665 0.2 0.0999999999997371 +86 0.3000000000012487 0.2 0.0999999999997371 +87 0.2000000000008325 0.2 0.0999999999997371 +88 0.1000000000004162 0.2 0.0999999999997371 +89 1 0.0999999999997371 0.0999999999997371 +90 0 0.100000000000274 0.0999999999997371 +91 0.2589961673760527 0.1674090681079447 0.02458352422436767 +92 0.4574915415816455 0.1498224237280481 0.0569962371169359 +93 0.3496440916187388 0.04605589271472998 0.04587953831718808 +94 0.1499999999999093 0.05117268292715365 0.1488273170728393 +95 0.8553903463552315 0.1617363547396499 0.161736354739664 +96 0.5499999999993299 0.05117268292752882 0.05117268292760564 +97 0.5439242897806678 0.1579084165060936 0.04687715009988654 +98 0.7647727272728269 0.1574476117266997 0.0483567026358275 +99 0.6589961673756821 0.1674090681076312 0.02458352422439182 +100 0.8499999999996345 0.05117268292775361 0.05117268292778051 +101 0.7625447544532288 0.05117268292776111 0.05117268292778123 +102 0.8314182914960002 0.1028377246782176 0.1020179369065382 +103 0.5499999999988187 0.1255389831945015 0.1255389831954118 +104 0.3545791141791101 0.1071281928871111 0.1048763752863662 +105 0.1500000000001687 0.125538983192814 0.07446101680704631 +$EndNodes +$Elements +464 +1 2 2 5 1 53 9 1 +2 2 2 5 1 28 53 1 +3 2 2 5 1 18 2 17 +4 2 2 5 1 3 18 61 +5 2 2 5 1 19 3 61 +6 2 2 5 1 4 27 28 +7 2 2 5 1 54 10 9 +8 2 2 5 1 53 54 9 +9 2 2 5 1 55 11 10 +10 2 2 5 1 54 55 10 +11 2 2 5 1 56 12 11 +12 2 2 5 1 55 56 11 +13 2 2 5 1 57 13 12 +14 2 2 5 1 56 57 12 +15 2 2 5 1 58 14 13 +16 2 2 5 1 57 58 13 +17 2 2 5 1 59 15 14 +18 2 2 5 1 58 59 14 +19 2 2 5 1 60 16 15 +20 2 2 5 1 59 60 15 +21 2 2 5 1 61 17 16 +22 2 2 5 1 60 61 16 +23 2 2 5 1 61 18 17 +24 2 2 5 1 20 19 60 +25 2 2 5 1 19 61 60 +26 2 2 5 1 21 20 59 +27 2 2 5 1 20 60 59 +28 2 2 5 1 22 21 58 +29 2 2 5 1 21 59 58 +30 2 2 5 1 23 22 57 +31 2 2 5 1 22 58 57 +32 2 2 5 1 24 23 56 +33 2 2 5 1 23 57 56 +34 2 2 5 1 25 24 55 +35 2 2 5 1 24 56 55 +36 2 2 5 1 26 25 54 +37 2 2 5 1 25 55 54 +38 2 2 5 1 27 26 53 +39 2 2 5 1 26 54 53 +40 2 2 5 1 27 53 28 +41 2 2 6 2 5 29 48 +42 2 2 6 2 37 6 70 +43 2 2 6 2 70 6 38 +44 2 2 6 2 39 38 7 +45 2 2 6 2 8 62 47 +46 2 2 6 2 48 62 8 +47 2 2 6 2 29 30 62 +48 2 2 6 2 48 29 62 +49 2 2 6 2 30 31 63 +50 2 2 6 2 62 30 63 +51 2 2 6 2 31 32 64 +52 2 2 6 2 63 31 64 +53 2 2 6 2 32 33 65 +54 2 2 6 2 64 32 65 +55 2 2 6 2 33 34 66 +56 2 2 6 2 65 33 66 +57 2 2 6 2 34 35 67 +58 2 2 6 2 66 34 67 +59 2 2 6 2 35 36 68 +60 2 2 6 2 67 35 68 +61 2 2 6 2 36 37 69 +62 2 2 6 2 68 36 69 +63 2 2 6 2 69 37 70 +64 2 2 6 2 70 38 39 +65 2 2 6 2 40 70 39 +66 2 2 6 2 41 69 40 +67 2 2 6 2 69 70 40 +68 2 2 6 2 42 68 41 +69 2 2 6 2 68 69 41 +70 2 2 6 2 43 67 42 +71 2 2 6 2 67 68 42 +72 2 2 6 2 44 66 43 +73 2 2 6 2 66 67 43 +74 2 2 6 2 45 65 44 +75 2 2 6 2 65 66 44 +76 2 2 6 2 46 64 45 +77 2 2 6 2 64 65 45 +78 2 2 6 2 47 63 46 +79 2 2 6 2 63 64 46 +80 2 2 6 2 62 63 47 +81 2 2 2 3 1 9 49 +82 2 2 2 3 17 2 79 +83 2 2 2 3 79 2 50 +84 2 2 2 3 5 71 29 +85 2 2 2 3 49 71 5 +86 2 2 2 3 37 50 6 +87 2 2 2 3 9 10 71 +88 2 2 2 3 49 9 71 +89 2 2 2 3 10 11 72 +90 2 2 2 3 71 10 72 +91 2 2 2 3 11 12 73 +92 2 2 2 3 72 11 73 +93 2 2 2 3 12 13 74 +94 2 2 2 3 73 12 74 +95 2 2 2 3 13 14 75 +96 2 2 2 3 74 13 75 +97 2 2 2 3 14 15 76 +98 2 2 2 3 75 14 76 +99 2 2 2 3 15 16 77 +100 2 2 2 3 76 15 77 +101 2 2 2 3 16 17 78 +102 2 2 2 3 77 16 78 +103 2 2 2 3 78 17 79 +104 2 2 2 3 29 72 30 +105 2 2 2 3 71 72 29 +106 2 2 2 3 30 73 31 +107 2 2 2 3 72 73 30 +108 2 2 2 3 31 74 32 +109 2 2 2 3 73 74 31 +110 2 2 2 3 32 75 33 +111 2 2 2 3 74 75 32 +112 2 2 2 3 33 76 34 +113 2 2 2 3 75 76 33 +114 2 2 2 3 34 77 35 +115 2 2 2 3 76 77 34 +116 2 2 2 3 35 78 36 +117 2 2 2 3 77 78 35 +118 2 2 2 3 36 79 37 +119 2 2 2 3 78 79 36 +120 2 2 2 3 79 50 37 +121 2 2 4 4 3 19 51 +122 2 2 4 4 27 4 88 +123 2 2 4 4 88 4 52 +124 2 2 4 4 7 80 39 +125 2 2 4 4 51 80 7 +126 2 2 4 4 47 52 8 +127 2 2 4 4 19 20 80 +128 2 2 4 4 51 19 80 +129 2 2 4 4 20 21 81 +130 2 2 4 4 80 20 81 +131 2 2 4 4 21 22 82 +132 2 2 4 4 81 21 82 +133 2 2 4 4 22 23 83 +134 2 2 4 4 82 22 83 +135 2 2 4 4 23 24 84 +136 2 2 4 4 83 23 84 +137 2 2 4 4 24 25 85 +138 2 2 4 4 84 24 85 +139 2 2 4 4 25 26 86 +140 2 2 4 4 85 25 86 +141 2 2 4 4 26 27 87 +142 2 2 4 4 86 26 87 +143 2 2 4 4 87 27 88 +144 2 2 4 4 39 81 40 +145 2 2 4 4 80 81 39 +146 2 2 4 4 40 82 41 +147 2 2 4 4 81 82 40 +148 2 2 4 4 41 83 42 +149 2 2 4 4 82 83 41 +150 2 2 4 4 42 84 43 +151 2 2 4 4 83 84 42 +152 2 2 4 4 43 85 44 +153 2 2 4 4 84 85 43 +154 2 2 4 4 44 86 45 +155 2 2 4 4 85 86 44 +156 2 2 4 4 45 87 46 +157 2 2 4 4 86 87 45 +158 2 2 4 4 46 88 47 +159 2 2 4 4 87 88 46 +160 2 2 4 4 88 52 47 +161 2 2 3 5 2 18 50 +162 2 2 3 5 18 3 89 +163 2 2 3 5 89 3 51 +164 2 2 3 5 6 89 38 +165 2 2 3 5 50 89 6 +166 2 2 3 5 38 51 7 +167 2 2 3 5 50 18 89 +168 2 2 3 5 89 51 38 +169 2 2 1 6 1 49 28 +170 2 2 1 6 28 90 4 +171 2 2 1 6 4 90 52 +172 2 2 1 6 90 5 48 +173 2 2 1 6 49 5 90 +174 2 2 1 6 52 48 8 +175 2 2 1 6 28 49 90 +176 2 2 1 6 90 48 52 +177 4 2 7 1 59 99 58 103 +178 4 2 7 1 60 98 59 102 +179 4 2 7 1 55 104 91 105 +180 4 2 7 1 55 91 54 105 +181 4 2 7 1 62 30 29 94 +182 4 2 7 1 63 30 62 94 +183 4 2 7 1 84 23 83 97 +184 4 2 7 1 13 58 57 96 +185 4 2 7 1 40 81 39 95 +186 4 2 7 1 22 83 23 97 +187 4 2 7 1 81 80 39 95 +188 4 2 7 1 13 14 58 96 +189 4 2 7 1 55 11 56 93 +190 4 2 7 1 23 56 57 92 +191 4 2 7 1 12 56 11 93 +192 4 2 7 1 24 56 23 92 +193 4 2 7 1 16 17 61 100 +194 4 2 7 1 60 16 61 100 +195 4 2 7 1 55 25 54 91 +196 4 2 7 1 25 26 54 91 +197 4 2 7 1 59 60 20 98 +198 4 2 7 1 21 58 59 99 +199 4 2 7 1 77 16 15 101 +200 4 2 7 1 78 16 77 101 +201 4 2 7 1 21 59 20 98 +202 4 2 7 1 22 58 21 99 +203 4 2 7 1 59 101 60 102 +204 4 2 7 1 78 101 77 102 +205 4 2 7 1 91 104 87 105 +206 4 2 7 1 92 103 85 104 +207 4 2 7 1 82 98 81 102 +208 4 2 7 1 86 87 91 104 +209 4 2 7 1 85 92 84 103 +210 4 2 7 1 59 58 76 103 +211 4 2 7 1 74 57 56 104 +212 4 2 7 1 57 75 103 104 +213 4 2 7 1 57 74 75 104 +214 4 2 7 1 55 73 104 105 +215 4 2 7 1 68 77 67 103 +216 4 2 7 1 68 78 77 102 +217 4 2 7 1 76 67 77 103 +218 4 2 7 1 69 78 68 102 +219 4 2 7 1 74 65 75 104 +220 4 2 7 1 63 64 73 104 +221 4 2 7 1 55 54 72 105 +222 4 2 7 1 55 72 73 105 +223 4 2 7 1 87 104 63 105 +224 4 2 7 1 83 68 67 103 +225 4 2 7 1 82 69 68 102 +226 4 2 7 1 69 82 81 102 +227 4 2 7 1 63 87 64 104 +228 4 2 7 1 86 64 87 104 +229 4 2 7 1 84 66 85 103 +230 4 2 7 1 85 24 84 92 +231 4 2 7 1 86 87 26 91 +232 4 2 7 1 26 25 86 91 +233 4 2 7 1 84 24 23 92 +234 4 2 7 1 83 22 82 99 +235 4 2 7 1 82 21 81 98 +236 4 2 7 1 20 81 21 98 +237 4 2 7 1 69 40 70 95 +238 4 2 7 1 21 82 22 99 +239 4 2 7 1 70 40 39 95 +240 4 2 7 1 22 57 58 97 +241 4 2 7 1 16 78 17 100 +242 4 2 7 1 79 17 78 100 +243 4 2 7 1 15 60 59 101 +244 4 2 7 1 15 16 60 101 +245 4 2 7 1 14 75 76 96 +246 4 2 7 1 74 12 73 93 +247 4 2 7 1 23 57 22 97 +248 4 2 7 1 13 75 14 96 +249 4 2 7 1 73 12 11 93 +250 4 2 7 1 30 72 29 94 +251 4 2 7 1 71 29 72 94 +252 4 2 7 1 60 101 78 102 +253 4 2 7 1 78 100 60 102 +254 4 2 7 1 75 96 57 103 +255 4 2 7 1 73 93 55 104 +256 4 2 7 1 63 72 94 105 +257 4 2 7 1 89 61 79 102 +258 4 2 7 1 71 90 62 105 +259 4 2 7 1 56 92 85 104 +260 4 2 7 1 83 58 99 103 +261 4 2 7 1 80 38 70 89 +262 4 2 7 1 38 80 51 89 +263 4 2 7 1 38 80 70 39 +264 4 2 7 1 62 90 71 29 +265 4 2 7 1 48 29 90 62 +266 4 2 7 1 74 57 75 13 +267 4 2 7 1 41 69 68 82 +268 4 2 7 1 70 6 89 38 +269 4 2 7 1 80 38 51 7 +270 4 2 7 1 6 70 89 37 +271 4 2 7 1 19 89 3 51 +272 4 2 7 1 62 8 52 48 +273 4 2 7 1 3 61 89 19 +274 4 2 7 1 31 73 63 64 +275 4 2 7 1 38 80 39 7 +276 4 2 7 1 5 71 49 90 +277 4 2 7 1 89 19 80 51 +278 4 2 7 1 19 89 80 61 +279 4 2 7 1 69 41 40 82 +280 4 2 7 1 5 71 90 29 +281 4 2 7 1 48 29 5 90 +282 4 2 7 1 61 3 89 18 +283 4 2 7 1 68 67 42 83 +284 4 2 7 1 37 89 6 50 +285 4 2 7 1 89 37 70 79 +286 4 2 7 1 82 40 69 81 +287 4 2 7 1 47 8 52 62 +288 4 2 7 1 62 52 90 48 +289 4 2 7 1 53 1 49 28 +290 4 2 7 1 30 73 63 31 +291 4 2 7 1 89 37 79 50 +292 4 2 7 1 73 30 63 72 +293 4 2 7 1 72 11 55 73 +294 4 2 7 1 49 53 90 71 +295 4 2 7 1 49 53 71 9 +296 4 2 7 1 83 41 68 82 +297 4 2 7 1 15 76 59 14 +298 4 2 7 1 53 28 49 90 +299 4 2 7 1 41 68 42 83 +300 4 2 7 1 57 74 12 13 +301 4 2 7 1 69 36 68 78 +302 4 2 7 1 1 53 49 9 +303 4 2 7 1 79 2 17 18 +304 4 2 7 1 52 90 88 62 +305 4 2 7 1 57 74 56 12 +306 4 2 7 1 63 87 46 64 +307 4 2 7 1 35 67 68 77 +308 4 2 7 1 27 28 88 4 +309 4 2 7 1 47 52 88 62 +310 4 2 7 1 10 72 55 54 +311 4 2 7 1 33 75 65 66 +312 4 2 7 1 79 18 89 50 +313 4 2 7 1 79 2 18 50 +314 4 2 7 1 11 72 55 10 +315 4 2 7 1 61 18 89 79 +316 4 2 7 1 79 61 18 17 +317 4 2 7 1 28 27 88 53 +318 4 2 7 1 85 44 65 66 +319 4 2 7 1 28 88 4 90 +320 4 2 7 1 35 78 68 36 +321 4 2 7 1 35 78 77 68 +322 4 2 7 1 14 76 59 58 +323 4 2 7 1 28 88 90 53 +324 4 2 7 1 90 88 4 52 +325 4 2 7 1 75 32 65 74 +326 4 2 7 1 45 87 86 64 +327 4 2 7 1 45 46 87 64 +328 4 2 7 1 77 34 67 76 +329 4 2 7 1 34 77 67 35 +330 4 2 7 1 43 66 85 84 +331 4 2 7 1 32 75 65 33 +332 4 2 7 1 85 44 66 43 +333 4 2 7 1 61 100 79 102 +334 4 2 7 1 58 96 76 103 +335 4 2 7 1 56 93 74 104 +336 4 2 7 1 62 94 71 105 +337 4 2 7 1 89 79 70 102 +338 4 2 7 1 89 80 61 102 +339 4 2 7 1 88 62 90 105 +340 4 2 7 1 71 53 90 105 +341 4 2 7 1 20 60 19 102 +342 4 2 7 1 19 60 61 102 +343 4 2 7 1 79 78 36 102 +344 4 2 7 1 36 37 79 102 +345 4 2 7 1 56 24 55 104 +346 4 2 7 1 55 24 25 104 +347 4 2 7 1 33 76 75 103 +348 4 2 7 1 74 73 31 104 +349 4 2 7 1 31 32 74 104 +350 4 2 7 1 33 34 76 103 +351 4 2 7 1 62 47 63 105 +352 4 2 7 1 46 63 47 105 +353 4 2 7 1 71 72 10 105 +354 4 2 7 1 9 71 10 105 +355 4 2 7 1 30 63 72 94 +356 4 2 7 1 78 60 16 101 +357 4 2 7 1 80 70 39 95 +358 4 2 7 1 11 55 73 93 +359 4 2 7 1 57 75 13 96 +360 4 2 7 1 60 78 16 100 +361 4 2 7 1 80 81 20 102 +362 4 2 7 1 69 70 37 102 +363 4 2 7 1 36 69 37 102 +364 4 2 7 1 20 19 80 102 +365 4 2 7 1 85 86 25 104 +366 4 2 7 1 33 66 34 103 +367 4 2 7 1 85 25 24 104 +368 4 2 7 1 31 64 32 104 +369 4 2 7 1 66 67 34 103 +370 4 2 7 1 32 64 65 104 +371 4 2 7 1 88 87 46 105 +372 4 2 7 1 46 47 88 105 +373 4 2 7 1 54 53 9 105 +374 4 2 7 1 9 10 54 105 +375 4 2 7 1 80 89 70 102 +376 4 2 7 1 88 90 53 105 +377 4 2 7 1 78 79 100 102 +378 4 2 7 1 75 76 96 103 +379 4 2 7 1 74 93 73 104 +380 4 2 7 1 71 94 72 105 +381 4 2 7 1 60 100 61 102 +382 4 2 7 1 57 96 58 103 +383 4 2 7 1 55 93 56 104 +384 4 2 7 1 62 63 94 105 +385 4 2 7 1 80 19 61 102 +386 4 2 7 1 36 78 69 102 +387 4 2 7 1 70 79 37 102 +388 4 2 7 1 56 85 24 104 +389 4 2 7 1 33 75 66 103 +390 4 2 7 1 73 64 31 104 +391 4 2 7 1 32 65 74 104 +392 4 2 7 1 67 76 34 103 +393 4 2 7 1 46 87 63 105 +394 4 2 7 1 9 53 71 105 +395 4 2 7 1 62 88 47 105 +396 4 2 7 1 10 72 54 105 +397 4 2 7 1 70 95 80 102 +398 4 2 7 1 83 97 58 103 +399 4 2 7 1 57 58 97 103 +400 4 2 7 1 71 62 29 94 +401 4 2 7 1 79 61 17 100 +402 4 2 7 1 22 83 58 99 +403 4 2 7 1 83 22 58 97 +404 4 2 7 1 74 56 12 93 +405 4 2 7 1 14 76 58 96 +406 4 2 7 1 85 56 24 92 +407 4 2 7 1 43 66 84 103 +408 4 2 7 1 40 69 81 102 +409 4 2 7 1 45 64 86 104 +410 4 2 7 1 42 83 67 103 +411 4 2 7 1 85 65 44 104 +412 4 2 7 1 53 27 88 105 +413 4 2 7 1 53 26 27 105 +414 4 2 7 1 53 54 26 105 +415 4 2 7 1 87 27 26 105 +416 4 2 7 1 87 88 27 105 +417 4 2 7 1 86 85 44 104 +418 4 2 7 1 44 45 86 104 +419 4 2 7 1 84 83 42 103 +420 4 2 7 1 42 43 84 103 +421 4 2 7 1 65 64 45 104 +422 4 2 7 1 44 65 45 104 +423 4 2 7 1 43 67 66 103 +424 4 2 7 1 42 67 43 103 +425 4 2 7 1 40 81 95 102 +426 4 2 7 1 87 26 91 105 +427 4 2 7 1 40 95 69 102 +428 4 2 7 1 54 91 26 105 +429 4 2 7 1 84 97 83 103 +430 4 2 7 1 69 95 70 102 +431 4 2 7 1 81 80 95 102 +432 4 2 7 1 105 73 63 72 +433 4 2 7 1 105 63 73 104 +434 4 2 7 1 83 68 99 82 +435 4 2 7 1 83 99 68 103 +436 4 2 7 1 59 68 99 103 +437 4 2 7 1 75 66 104 65 +438 4 2 7 1 75 104 66 103 +439 4 2 7 1 85 104 66 65 +440 4 2 7 1 85 66 104 103 +441 4 2 7 1 98 102 20 81 +442 4 2 7 1 20 102 98 60 +443 4 2 7 1 92 103 97 84 +444 4 2 7 1 97 103 92 57 +445 4 2 7 1 97 23 92 84 +446 4 2 7 1 92 23 97 57 +447 4 2 7 1 91 104 25 86 +448 4 2 7 1 25 104 91 55 +449 4 2 7 1 104 57 92 103 +450 4 2 7 1 104 92 57 56 +451 4 2 7 1 102 98 68 82 +452 4 2 7 1 102 68 98 59 +453 4 2 7 1 68 98 99 82 +454 4 2 7 1 68 99 98 59 +455 4 2 7 1 99 98 21 82 +456 4 2 7 1 99 21 98 59 +457 4 2 7 1 102 101 68 59 +458 4 2 7 1 102 68 101 77 +459 4 2 7 1 68 101 103 59 +460 4 2 7 1 68 103 101 77 +461 4 2 7 1 15 77 59 76 +462 4 2 7 1 15 59 77 101 +463 4 2 7 1 103 59 77 76 +464 4 2 7 1 103 77 59 101 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/freefem_beam3d_distributed.edp b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/freefem_beam3d_distributed.edp new file mode 100644 index 00000000..10a7a400 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/freefem_beam3d_distributed.edp @@ -0,0 +1,50 @@ +IMPORT "io.edp" +load "gmsh" +load "msh3" + +DEFAULT (q, 1000.0) +DEFAULT (youngModulus, 1000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam3d_tet.msh") + +real Q = $q; +real E = $youngModulus; +real nu = $poissonRatio; + +mesh3 Th = gmshload3("$meshFile"); + +fespace Vh(Th, P1); +Vh ux, uy, uz, vx, vy, vz; + +real lambda = E*nu / ((1.+nu)*(1.-2.*nu)); +real mu = E / (2.*(1.+nu)); + + +problem Elasticity([ux, uy, uz], [vx, vy, vz]) = + int3d(Th)( + lambda*(dx(ux)+dy(uy)+dz(uz))*(dx(vx)+dy(vy)+dz(vz)) + + 2.*mu*(dx(ux)*dx(vx) + dy(uy)*dy(vy) + dz(uz)*dz(vz)) + + mu*(dy(ux)+dx(uy))*(dy(vx)+dx(vy)) + + mu*(dz(ux)+dx(uz))*(dz(vx)+dx(vz)) + + mu*(dz(uy)+dy(uz))*(dz(vy)+dy(vz)) + ) + - int2d(Th, 4)( -Q*vy ) + + on(1, ux=0, uy=0, uz=0); + +Elasticity; + +exportArray(ux[]); +exportArray(uy[]); +exportArray(uz[]); + +real[int] xcoords(Th.nv); +real[int] ycoords(Th.nv); +real[int] zcoords(Th.nv); +for (int i = 0; i < Th.nv; i++) { + xcoords[i] = Th(i).x; + ycoords[i] = Th(i).y; + zcoords[i] = Th(i).z; +} +exportArray(xcoords); +exportArray(ycoords); +exportArray(zcoords); diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/params_beam3d_distributed.json b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/params_beam3d_distributed.json new file mode 100644 index 00000000..817dc50d --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/params_beam3d_distributed.json @@ -0,0 +1,7 @@ +{ + +"q": 1000, +"youngModulus": 1000, +"poissonRatio": 0.3 + +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/run.py b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/run.py new file mode 100644 index 00000000..0f6bcb02 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/run.py @@ -0,0 +1,94 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .sofa_scene import sofaRun + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "3D — Distributed load (top face)" + +MATH_DESCRIPTION = """ +Poutre 3D encastree sur la face x=x_min (label 1), soumise a une charge +repartie uniforme (0, -q, 0) sur la face superieure y=y_max (label 4). + + -div(sigma) = 0 dans Omega + sigma.n = (0, -q, 0) sur la face superieure (y=y_max) + u = 0 sur la face encastree (x=x_min) + +Elasticite 3D complete (pas de notion plane strain/stress en 3D) : + lambda = E*nu / ((1+nu)(1-2nu)) + mu = E / (2(1+nu)) + +Pas de solution analytique connue pour ce cas -> comparaison SOFA vs +FreeFem uniquement (cross-validation par RMS separement sur ux, uy, uz). +""" + + +def _load_params(): + with open(os.path.join(HERE, "params_beam3d_distributed.json")) as f: + return json.load(f) + + +def _mesh_path(): + return os.path.join(HERE, "beam3d_tet.msh") + + +def _pair_by_coordinates(x_a, y_a, z_a, x_b, y_b, z_b, tol=1e-6): + """Retourne perm tel que (x_b[perm], y_b[perm], z_b[perm]) correspond + noeud a noeud a (x_a, y_a, z_a). Les deux maillages doivent partager le + meme ensemble de noeuds (ici : meme beam3d_tet.msh des deux cotes).""" + order_a = np.lexsort((z_a, y_a, x_a)) + order_b = np.lexsort((z_b, y_b, x_b)) + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol) + and np.allclose(z_a[order_a], z_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def run_case(): + cfg = _load_params() + q = float(cfg["q"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + mesh_file = _mesh_path() + + # --- FreeFem++ --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3d_distributed.edp")) + exports = runner.execute({ + 'q': q, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': mesh_file, + }, verbosity=0) + x_ff = np.asarray(exports['xcoords']) + y_ff = np.asarray(exports['ycoords']) + z_ff = np.asarray(exports['zcoords']) + ux_ff = np.asarray(exports['ux[]']) + uy_ff = np.asarray(exports['uy[]']) + uz_ff = np.asarray(exports['uz[]']) + + # --- SOFA --- + pos0_sofa, u_sofa = sofaRun(mesh_file=mesh_file, q=q, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio) + x_sofa, y_sofa, z_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1], pos0_sofa[:, 2] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, z_sofa, x_ff, y_ff, z_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm], uz_ff[perm]]) + + return { + "label": LABEL, + "dim": 3, + "coords_ff": np.column_stack([x_sofa, y_sofa, z_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa, z_sofa]), + "u_sofa": u_sofa, + "u_ana": None, + "component_names": ["ux", "uy", "uz"], + } diff --git a/examples/Freefem/projet_validation/cases/case_3d/distributed_load/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/sofa_scene.py new file mode 100644 index 00000000..e7880dfb --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/distributed_load/sofa_scene.py @@ -0,0 +1,162 @@ +""" +3D Beam Simulation - Distributed Load on Top Face - P1 Tetrahedra +Cross-validation SOFA vs FreeFEM +""" +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + + +def consistent_traction_forces(nodes, top_faces, q): + N = len(nodes) + F = np.zeros((N, 3)) + for tri in top_faces: + pts = nodes[tri, :] + v1 = pts[1] - pts[0] + v2 = pts[2] - pts[0] + area = 0.5 * np.linalg.norm(np.cross(v1, v2)) + for nid in tri: + F[nid, 1] += -q * area / 3.0 + return F + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "beam3d_tet.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3d_distributed.json") + + +def create_scene_args(rootNode, mesh_file, q, young_modulus, poisson_ratio, tol=1e-6): + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + loader = Beam.addObject('MeshGmshLoader', name="loader", filename=mesh_file) + + nodes = np.array(loader.position.value) + tets = np.array(loader.tetrahedra.value) + tris = np.array(loader.triangles.value) + N = len(nodes) + + + x_min = nodes[:, 0].min() + y_max = nodes[:, 1].max() + fixed_idx = np.where(np.isclose(nodes[:, 0], x_min, atol=tol))[0].tolist() + top_mask = np.all(np.isclose(nodes[tris, 1], y_max, atol=tol), axis=1) + top_faces = tris[top_mask] + + F_nodal = consistent_traction_forces(nodes, top_faces, q) + forces_list = F_nodal.tolist() + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position="@loader.position" + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TetrahedronSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TetrahedronSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + Beam.addObject('ConstantForceField' + , name="TopTraction" + , indices=list(range(N)) + , forces=forces_list) + + return rootNode, dofs, nodes.copy() + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) + return rootNode + + +def sofaRun(mesh_file, q, young_modulus, poisson_ratio): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , q=q + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + u = pos_final[:, :3] - pos0[:, :3] + x0 = pos0[:, :3] + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, "sofa_beam3d_distributed_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'z0':>12} {'ux':>12} {'uy':>12} {'uz':>12}\n") + f.write("-" * 78 + "\n") + for (xi, yi, zi), (uxi, uyi, uzi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {zi:12.6f} {uxi:12.6f} {uyi:12.6f} {uzi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , q=float(cfg["q"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/beam3d_tet.msh b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/beam3d_tet.msh new file mode 100644 index 00000000..264955ad --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/beam3d_tet.msh @@ -0,0 +1,534 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +7 +2 1 "Fixed" +2 2 "Bottom" +2 3 "Right" +2 4 "Top" +2 5 "Front" +2 6 "Back" +3 7 "Beam" +$EndPhysicalNames +$Nodes +99 +1 0 0 0 +2 1 0 0 +3 1 0.2 0 +4 0 0.2 0 +5 0 0 0.2 +6 1 0 0.2 +7 1 0.2 0.2 +8 0 0.2 0.2 +9 0.09999999999981413 0 0 +10 0.1999999999995569 0 0 +11 0.299999999999265 0 0 +12 0.3999999999989731 0 0 +13 0.4999999999986921 0 0 +14 0.599999999998945 0 0 +15 0.6999999999992088 0 0 +16 0.7999999999994725 0 0 +17 0.8999999999997362 0 0 +18 1 0.0999999999997371 0 +19 0.8999999999995836 0.2 0 +20 0.8 0.2 0 +21 0.7000000000006938 0.2 0 +22 0.6000000000013874 0.2 0 +23 0.5000000000020595 0.2 0 +24 0.400000000001665 0.2 0 +25 0.3000000000012487 0.2 0 +26 0.2000000000008325 0.2 0 +27 0.1000000000004162 0.2 0 +28 0 0.100000000000274 0 +29 0.09999999999981413 0 0.2 +30 0.1999999999995569 0 0.2 +31 0.299999999999265 0 0.2 +32 0.3999999999989731 0 0.2 +33 0.4999999999986921 0 0.2 +34 0.599999999998945 0 0.2 +35 0.6999999999992088 0 0.2 +36 0.7999999999994725 0 0.2 +37 0.8999999999997362 0 0.2 +38 1 0.0999999999997371 0.2 +39 0.8999999999995836 0.2 0.2 +40 0.8 0.2 0.2 +41 0.7000000000006938 0.2 0.2 +42 0.6000000000013874 0.2 0.2 +43 0.5000000000020595 0.2 0.2 +44 0.400000000001665 0.2 0.2 +45 0.3000000000012487 0.2 0.2 +46 0.2000000000008325 0.2 0.2 +47 0.1000000000004162 0.2 0.2 +48 0 0.100000000000274 0.2 +49 0 0 0.0999999999997371 +50 1 0 0.0999999999997371 +51 1 0.2 0.0999999999997371 +52 0 0.2 0.0999999999997371 +53 0.1000000000001152 0.1000000000002203 0 +54 0.2000000000001947 0.1000000000001666 0 +55 0.3000000000002568 0.1000000000001129 0 +56 0.4000000000003192 0.1000000000000592 0 +57 0.5000000000003757 0.1000000000000055 0 +58 0.6000000000001662 0.09999999999995185 0 +59 0.6999999999999513 0.09999999999989817 0 +60 0.7999999999997363 0.09999999999984449 0 +61 0.89999999999966 0.09999999999979081 0 +62 0.1000000000001152 0.1000000000002203 0.2 +63 0.2000000000001947 0.1000000000001666 0.2 +64 0.3000000000002568 0.1000000000001129 0.2 +65 0.4000000000003192 0.1000000000000592 0.2 +66 0.5000000000003757 0.1000000000000055 0.2 +67 0.6000000000001662 0.09999999999995185 0.2 +68 0.6999999999999513 0.09999999999989817 0.2 +69 0.7999999999997363 0.09999999999984449 0.2 +70 0.89999999999966 0.09999999999979081 0.2 +71 0.09999999999981413 0 0.0999999999997371 +72 0.1999999999995569 0 0.0999999999997371 +73 0.299999999999265 0 0.0999999999997371 +74 0.3999999999989731 0 0.0999999999997371 +75 0.4999999999986922 0 0.0999999999997371 +76 0.599999999998945 0 0.0999999999997371 +77 0.6999999999992088 0 0.0999999999997371 +78 0.7999999999994725 0 0.0999999999997371 +79 0.8999999999997362 0 0.0999999999997371 +80 0.8999999999995836 0.2 0.0999999999997371 +81 0.8 0.2 0.0999999999997371 +82 0.7000000000006938 0.2 0.0999999999997371 +83 0.6000000000013874 0.2 0.0999999999997371 +84 0.5000000000020595 0.2 0.0999999999997371 +85 0.400000000001665 0.2 0.0999999999997371 +86 0.3000000000012487 0.2 0.0999999999997371 +87 0.2000000000008325 0.2 0.0999999999997371 +88 0.1000000000004162 0.2 0.0999999999997371 +89 1 0.0999999999997371 0.0999999999997371 +90 0 0.100000000000274 0.0999999999997371 +91 0.1000000000001152 0.1000000000002202 0.09999999999973708 +92 0.2000000000001948 0.1000000000001666 0.09999999999973708 +93 0.3000000000002568 0.1000000000001129 0.09999999999973709 +94 0.4000000000003192 0.1000000000000592 0.09999999999973706 +95 0.5000000000003757 0.1000000000000055 0.0999999999997371 +96 0.6000000000001662 0.09999999999995182 0.09999999999973708 +97 0.6999999999999513 0.09999999999989814 0.09999999999973708 +98 0.799999999999736 0.09999999999984448 0.09999999999973708 +99 0.8999999999996604 0.09999999999979081 0.09999999999973708 +$EndNodes +$Elements +416 +1 2 2 5 1 1 9 28 +2 2 2 5 1 28 9 53 +3 2 2 5 1 28 53 4 +4 2 2 5 1 4 53 27 +5 2 2 5 1 9 10 53 +6 2 2 5 1 53 10 54 +7 2 2 5 1 53 54 27 +8 2 2 5 1 27 54 26 +9 2 2 5 1 10 11 54 +10 2 2 5 1 54 11 55 +11 2 2 5 1 54 55 26 +12 2 2 5 1 26 55 25 +13 2 2 5 1 11 12 55 +14 2 2 5 1 55 12 56 +15 2 2 5 1 55 56 25 +16 2 2 5 1 25 56 24 +17 2 2 5 1 12 13 56 +18 2 2 5 1 56 13 57 +19 2 2 5 1 56 57 24 +20 2 2 5 1 24 57 23 +21 2 2 5 1 13 14 57 +22 2 2 5 1 57 14 58 +23 2 2 5 1 57 58 23 +24 2 2 5 1 23 58 22 +25 2 2 5 1 14 15 58 +26 2 2 5 1 58 15 59 +27 2 2 5 1 58 59 22 +28 2 2 5 1 22 59 21 +29 2 2 5 1 15 16 59 +30 2 2 5 1 59 16 60 +31 2 2 5 1 59 60 21 +32 2 2 5 1 21 60 20 +33 2 2 5 1 16 17 60 +34 2 2 5 1 60 17 61 +35 2 2 5 1 60 61 20 +36 2 2 5 1 20 61 19 +37 2 2 5 1 17 2 61 +38 2 2 5 1 61 2 18 +39 2 2 5 1 61 18 19 +40 2 2 5 1 19 18 3 +41 2 2 6 2 5 29 48 +42 2 2 6 2 48 29 62 +43 2 2 6 2 48 62 8 +44 2 2 6 2 8 62 47 +45 2 2 6 2 29 30 62 +46 2 2 6 2 62 30 63 +47 2 2 6 2 62 63 47 +48 2 2 6 2 47 63 46 +49 2 2 6 2 30 31 63 +50 2 2 6 2 63 31 64 +51 2 2 6 2 63 64 46 +52 2 2 6 2 46 64 45 +53 2 2 6 2 31 32 64 +54 2 2 6 2 64 32 65 +55 2 2 6 2 64 65 45 +56 2 2 6 2 45 65 44 +57 2 2 6 2 32 33 65 +58 2 2 6 2 65 33 66 +59 2 2 6 2 65 66 44 +60 2 2 6 2 44 66 43 +61 2 2 6 2 33 34 66 +62 2 2 6 2 66 34 67 +63 2 2 6 2 66 67 43 +64 2 2 6 2 43 67 42 +65 2 2 6 2 34 35 67 +66 2 2 6 2 67 35 68 +67 2 2 6 2 67 68 42 +68 2 2 6 2 42 68 41 +69 2 2 6 2 35 36 68 +70 2 2 6 2 68 36 69 +71 2 2 6 2 68 69 41 +72 2 2 6 2 41 69 40 +73 2 2 6 2 36 37 69 +74 2 2 6 2 69 37 70 +75 2 2 6 2 69 70 40 +76 2 2 6 2 40 70 39 +77 2 2 6 2 37 6 70 +78 2 2 6 2 70 6 38 +79 2 2 6 2 70 38 39 +80 2 2 6 2 39 38 7 +81 2 2 2 3 1 9 49 +82 2 2 2 3 49 9 71 +83 2 2 2 3 49 71 5 +84 2 2 2 3 5 71 29 +85 2 2 2 3 9 10 71 +86 2 2 2 3 71 10 72 +87 2 2 2 3 71 72 29 +88 2 2 2 3 29 72 30 +89 2 2 2 3 10 11 72 +90 2 2 2 3 72 11 73 +91 2 2 2 3 72 73 30 +92 2 2 2 3 30 73 31 +93 2 2 2 3 11 12 73 +94 2 2 2 3 73 12 74 +95 2 2 2 3 73 74 31 +96 2 2 2 3 31 74 32 +97 2 2 2 3 12 13 74 +98 2 2 2 3 74 13 75 +99 2 2 2 3 74 75 32 +100 2 2 2 3 32 75 33 +101 2 2 2 3 13 14 75 +102 2 2 2 3 75 14 76 +103 2 2 2 3 75 76 33 +104 2 2 2 3 33 76 34 +105 2 2 2 3 14 15 76 +106 2 2 2 3 76 15 77 +107 2 2 2 3 76 77 34 +108 2 2 2 3 34 77 35 +109 2 2 2 3 15 16 77 +110 2 2 2 3 77 16 78 +111 2 2 2 3 77 78 35 +112 2 2 2 3 35 78 36 +113 2 2 2 3 16 17 78 +114 2 2 2 3 78 17 79 +115 2 2 2 3 78 79 36 +116 2 2 2 3 36 79 37 +117 2 2 2 3 17 2 79 +118 2 2 2 3 79 2 50 +119 2 2 2 3 79 50 37 +120 2 2 2 3 37 50 6 +121 2 2 3 5 2 18 50 +122 2 2 3 5 50 18 89 +123 2 2 3 5 50 89 6 +124 2 2 3 5 6 89 38 +125 2 2 3 5 18 3 89 +126 2 2 3 5 89 3 51 +127 2 2 3 5 89 51 38 +128 2 2 3 5 38 51 7 +129 4 2 7 1 1 9 28 49 +130 4 2 7 1 9 28 49 71 +131 4 2 7 1 49 71 28 90 +132 4 2 7 1 9 28 71 53 +133 4 2 7 1 28 90 71 53 +134 4 2 7 1 71 90 91 53 +135 4 2 7 1 49 71 90 5 +136 4 2 7 1 71 90 5 29 +137 4 2 7 1 5 29 90 48 +138 4 2 7 1 71 90 29 91 +139 4 2 7 1 90 48 29 91 +140 4 2 7 1 29 48 62 91 +141 4 2 7 1 28 53 4 90 +142 4 2 7 1 53 4 90 91 +143 4 2 7 1 90 91 4 52 +144 4 2 7 1 53 4 91 27 +145 4 2 7 1 4 52 91 27 +146 4 2 7 1 91 52 88 27 +147 4 2 7 1 90 91 52 48 +148 4 2 7 1 91 52 48 62 +149 4 2 7 1 48 62 52 8 +150 4 2 7 1 91 52 62 88 +151 4 2 7 1 52 8 62 88 +152 4 2 7 1 62 8 47 88 +153 4 2 7 1 9 10 53 71 +154 4 2 7 1 10 53 71 72 +155 4 2 7 1 71 72 53 91 +156 4 2 7 1 10 53 72 54 +157 4 2 7 1 53 91 72 54 +158 4 2 7 1 72 91 92 54 +159 4 2 7 1 71 72 91 29 +160 4 2 7 1 72 91 29 30 +161 4 2 7 1 29 30 91 62 +162 4 2 7 1 72 91 30 92 +163 4 2 7 1 91 62 30 92 +164 4 2 7 1 30 62 63 92 +165 4 2 7 1 53 54 27 91 +166 4 2 7 1 54 27 91 92 +167 4 2 7 1 91 92 27 88 +168 4 2 7 1 54 27 92 26 +169 4 2 7 1 27 88 92 26 +170 4 2 7 1 92 88 87 26 +171 4 2 7 1 91 92 88 62 +172 4 2 7 1 92 88 62 63 +173 4 2 7 1 62 63 88 47 +174 4 2 7 1 92 88 63 87 +175 4 2 7 1 88 47 63 87 +176 4 2 7 1 63 47 46 87 +177 4 2 7 1 10 11 54 72 +178 4 2 7 1 11 54 72 73 +179 4 2 7 1 72 73 54 92 +180 4 2 7 1 11 54 73 55 +181 4 2 7 1 54 92 73 55 +182 4 2 7 1 73 92 93 55 +183 4 2 7 1 72 73 92 30 +184 4 2 7 1 73 92 30 31 +185 4 2 7 1 30 31 92 63 +186 4 2 7 1 73 92 31 93 +187 4 2 7 1 92 63 31 93 +188 4 2 7 1 31 63 64 93 +189 4 2 7 1 54 55 26 92 +190 4 2 7 1 55 26 92 93 +191 4 2 7 1 92 93 26 87 +192 4 2 7 1 55 26 93 25 +193 4 2 7 1 26 87 93 25 +194 4 2 7 1 93 87 86 25 +195 4 2 7 1 92 93 87 63 +196 4 2 7 1 93 87 63 64 +197 4 2 7 1 63 64 87 46 +198 4 2 7 1 93 87 64 86 +199 4 2 7 1 87 46 64 86 +200 4 2 7 1 64 46 45 86 +201 4 2 7 1 11 12 55 73 +202 4 2 7 1 12 55 73 74 +203 4 2 7 1 73 74 55 93 +204 4 2 7 1 12 55 74 56 +205 4 2 7 1 55 93 74 56 +206 4 2 7 1 74 93 94 56 +207 4 2 7 1 73 74 93 31 +208 4 2 7 1 74 93 31 32 +209 4 2 7 1 31 32 93 64 +210 4 2 7 1 74 93 32 94 +211 4 2 7 1 93 64 32 94 +212 4 2 7 1 32 64 65 94 +213 4 2 7 1 55 56 25 93 +214 4 2 7 1 56 25 93 94 +215 4 2 7 1 93 94 25 86 +216 4 2 7 1 56 25 94 24 +217 4 2 7 1 25 86 94 24 +218 4 2 7 1 94 86 85 24 +219 4 2 7 1 93 94 86 64 +220 4 2 7 1 94 86 64 65 +221 4 2 7 1 64 65 86 45 +222 4 2 7 1 94 86 65 85 +223 4 2 7 1 86 45 65 85 +224 4 2 7 1 65 45 44 85 +225 4 2 7 1 12 13 56 74 +226 4 2 7 1 13 56 74 75 +227 4 2 7 1 74 75 56 94 +228 4 2 7 1 13 56 75 57 +229 4 2 7 1 56 94 75 57 +230 4 2 7 1 75 94 95 57 +231 4 2 7 1 74 75 94 32 +232 4 2 7 1 75 94 32 33 +233 4 2 7 1 32 33 94 65 +234 4 2 7 1 75 94 33 95 +235 4 2 7 1 94 65 33 95 +236 4 2 7 1 33 65 66 95 +237 4 2 7 1 56 57 24 94 +238 4 2 7 1 57 24 94 95 +239 4 2 7 1 94 95 24 85 +240 4 2 7 1 57 24 95 23 +241 4 2 7 1 24 85 95 23 +242 4 2 7 1 95 85 84 23 +243 4 2 7 1 94 95 85 65 +244 4 2 7 1 95 85 65 66 +245 4 2 7 1 65 66 85 44 +246 4 2 7 1 95 85 66 84 +247 4 2 7 1 85 44 66 84 +248 4 2 7 1 66 44 43 84 +249 4 2 7 1 13 14 57 75 +250 4 2 7 1 14 57 75 76 +251 4 2 7 1 75 76 57 95 +252 4 2 7 1 14 57 76 58 +253 4 2 7 1 57 95 76 58 +254 4 2 7 1 76 95 96 58 +255 4 2 7 1 75 76 95 33 +256 4 2 7 1 76 95 33 34 +257 4 2 7 1 33 34 95 66 +258 4 2 7 1 76 95 34 96 +259 4 2 7 1 95 66 34 96 +260 4 2 7 1 34 66 67 96 +261 4 2 7 1 57 58 23 95 +262 4 2 7 1 58 23 95 96 +263 4 2 7 1 95 96 23 84 +264 4 2 7 1 58 23 96 22 +265 4 2 7 1 23 84 96 22 +266 4 2 7 1 96 84 83 22 +267 4 2 7 1 95 96 84 66 +268 4 2 7 1 96 84 66 67 +269 4 2 7 1 66 67 84 43 +270 4 2 7 1 96 84 67 83 +271 4 2 7 1 84 43 67 83 +272 4 2 7 1 67 43 42 83 +273 4 2 7 1 14 15 58 76 +274 4 2 7 1 15 58 76 77 +275 4 2 7 1 76 77 58 96 +276 4 2 7 1 15 58 77 59 +277 4 2 7 1 58 96 77 59 +278 4 2 7 1 77 96 97 59 +279 4 2 7 1 76 77 96 34 +280 4 2 7 1 77 96 34 35 +281 4 2 7 1 34 35 96 67 +282 4 2 7 1 77 96 35 97 +283 4 2 7 1 96 67 35 97 +284 4 2 7 1 35 67 68 97 +285 4 2 7 1 58 59 22 96 +286 4 2 7 1 59 22 96 97 +287 4 2 7 1 96 97 22 83 +288 4 2 7 1 59 22 97 21 +289 4 2 7 1 22 83 97 21 +290 4 2 7 1 97 83 82 21 +291 4 2 7 1 96 97 83 67 +292 4 2 7 1 97 83 67 68 +293 4 2 7 1 67 68 83 42 +294 4 2 7 1 97 83 68 82 +295 4 2 7 1 83 42 68 82 +296 4 2 7 1 68 42 41 82 +297 4 2 7 1 15 16 59 77 +298 4 2 7 1 16 59 77 78 +299 4 2 7 1 77 78 59 97 +300 4 2 7 1 16 59 78 60 +301 4 2 7 1 59 97 78 60 +302 4 2 7 1 78 97 98 60 +303 4 2 7 1 77 78 97 35 +304 4 2 7 1 78 97 35 36 +305 4 2 7 1 35 36 97 68 +306 4 2 7 1 78 97 36 98 +307 4 2 7 1 97 68 36 98 +308 4 2 7 1 36 68 69 98 +309 4 2 7 1 59 60 21 97 +310 4 2 7 1 60 21 97 98 +311 4 2 7 1 97 98 21 82 +312 4 2 7 1 60 21 98 20 +313 4 2 7 1 21 82 98 20 +314 4 2 7 1 98 82 81 20 +315 4 2 7 1 97 98 82 68 +316 4 2 7 1 98 82 68 69 +317 4 2 7 1 68 69 82 41 +318 4 2 7 1 98 82 69 81 +319 4 2 7 1 82 41 69 81 +320 4 2 7 1 69 41 40 81 +321 4 2 7 1 16 17 60 78 +322 4 2 7 1 17 60 78 79 +323 4 2 7 1 78 79 60 98 +324 4 2 7 1 17 60 79 61 +325 4 2 7 1 60 98 79 61 +326 4 2 7 1 79 98 99 61 +327 4 2 7 1 78 79 98 36 +328 4 2 7 1 79 98 36 37 +329 4 2 7 1 36 37 98 69 +330 4 2 7 1 79 98 37 99 +331 4 2 7 1 98 69 37 99 +332 4 2 7 1 37 69 70 99 +333 4 2 7 1 60 61 20 98 +334 4 2 7 1 61 20 98 99 +335 4 2 7 1 98 99 20 81 +336 4 2 7 1 61 20 99 19 +337 4 2 7 1 20 81 99 19 +338 4 2 7 1 99 81 80 19 +339 4 2 7 1 98 99 81 69 +340 4 2 7 1 99 81 69 70 +341 4 2 7 1 69 70 81 40 +342 4 2 7 1 99 81 70 80 +343 4 2 7 1 81 40 70 80 +344 4 2 7 1 70 40 39 80 +345 4 2 7 1 17 2 61 79 +346 4 2 7 1 2 61 79 50 +347 4 2 7 1 79 50 61 99 +348 4 2 7 1 2 61 50 18 +349 4 2 7 1 61 99 50 18 +350 4 2 7 1 50 99 89 18 +351 4 2 7 1 79 50 99 37 +352 4 2 7 1 50 99 37 6 +353 4 2 7 1 37 6 99 70 +354 4 2 7 1 50 99 6 89 +355 4 2 7 1 99 70 6 89 +356 4 2 7 1 6 70 38 89 +357 4 2 7 1 61 18 19 99 +358 4 2 7 1 18 19 99 89 +359 4 2 7 1 99 89 19 80 +360 4 2 7 1 18 19 89 3 +361 4 2 7 1 19 80 89 3 +362 4 2 7 1 89 80 51 3 +363 4 2 7 1 99 89 80 70 +364 4 2 7 1 89 80 70 38 +365 4 2 7 1 70 38 80 39 +366 4 2 7 1 89 80 38 51 +367 4 2 7 1 80 39 38 51 +368 4 2 7 1 38 39 7 51 +369 2 2 1 1 1 28 49 +370 2 2 1 1 49 90 28 +371 2 2 1 1 49 90 5 +372 2 2 1 1 48 90 5 +373 2 2 1 1 90 28 4 +374 2 2 1 1 90 4 52 +375 2 2 1 1 48 90 52 +376 2 2 1 1 48 8 52 +377 2 2 4 1 27 4 52 +378 2 2 4 1 88 27 52 +379 2 2 4 1 8 88 52 +380 2 2 4 1 8 88 47 +381 2 2 4 1 88 26 27 +382 2 2 4 1 88 26 87 +383 2 2 4 1 88 87 47 +384 2 2 4 1 87 46 47 +385 2 2 4 1 25 26 87 +386 2 2 4 1 25 86 87 +387 2 2 4 1 86 46 87 +388 2 2 4 1 86 45 46 +389 2 2 4 1 24 25 86 +390 2 2 4 1 24 85 86 +391 2 2 4 1 85 45 86 +392 2 2 4 1 85 44 45 +393 2 2 4 1 24 85 23 +394 2 2 4 1 84 85 23 +395 2 2 4 1 44 85 84 +396 2 2 4 1 43 44 84 +397 2 2 4 1 84 22 23 +398 2 2 4 1 83 84 22 +399 2 2 4 1 83 43 84 +400 2 2 4 1 83 42 43 +401 2 2 4 1 83 21 22 +402 2 2 4 1 82 83 21 +403 2 2 4 1 42 83 82 +404 2 2 4 1 41 42 82 +405 2 2 4 1 82 20 21 +406 2 2 4 1 81 82 20 +407 2 2 4 1 81 41 82 +408 2 2 4 1 40 41 81 +409 2 2 4 1 81 19 20 +410 2 2 4 1 80 81 19 +411 2 2 4 1 40 81 80 +412 2 2 4 1 40 80 39 +413 2 2 4 1 80 3 19 +414 2 2 4 1 80 3 51 +415 2 2 4 1 80 51 39 +416 2 2 4 1 51 7 39 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/freefem_beam3d_threept.edp b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/freefem_beam3d_threept.edp new file mode 100644 index 00000000..fe7b233b --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/freefem_beam3d_threept.edp @@ -0,0 +1,120 @@ +load "gmsh" +load "msh3" + +DEFAULT (P, 10.0) +DEFAULT (youngModulus, 1000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam3d_tet.msh") +DEFAULT (outFile, "freefem_beam3d_threept_out.txt") + +real Pload = $P; +real E = $youngModulus; +real nu = $poissonRatio; + +real mu = E / (2.*(1.+nu)); +real lambda = E*nu / ((1.+nu)*(1.-2.*nu)); + +mesh3 Th = gmshload3("$meshFile"); + +real Lbeam = 1.0; +real Hbeam = 0.2; +real tol = 1e-6; + +// =============== Locate support / load line nodes =============== +// (Left: x=0,y=0 - pin | Right: x=Lbeam,y=0 - roller | Load: x=Lbeam/2,y=Hbeam) +int maxN = 50; +int[int] leftIdx(maxN), rightIdx(maxN), loadIdx(maxN); +int nLeft = 0, nRight = 0, nLoad = 0; + +for (int i = 0; i < Th.nv; i++) { + real xi = Th(i).x, yi = Th(i).y; + if (abs(xi - 0.0) < tol && abs(yi - 0.0) < tol) { leftIdx[nLeft] = i; nLeft++; } + if (abs(xi - Lbeam) < tol && abs(yi - 0.0) < tol) { rightIdx[nRight] = i; nRight++; } + if (abs(xi - Lbeam/2.) < tol && abs(yi - Hbeam) < tol) { loadIdx[nLoad] = i; nLoad++; } +} +if (nLeft == 0 || nRight == 0 || nLoad == 0) { + cout << "ERROR: could not locate BC lines (nLeft=" << nLeft + << ", nRight=" << nRight << ", nLoad=" << nLoad << ")" << endl; +} + +// =============== Trapezoidal weights along z for the midspan load line =============== +real[int] zLoad(nLoad), wLoad(nLoad); +for (int k = 0; k < nLoad; k++) zLoad[k] = Th(loadIdx[k]).z; + +int[int] order(nLoad); +for (int k = 0; k < nLoad; k++) order[k] = k; +for (int a = 1; a < nLoad; a++) { + int key = order[a]; + real keyZ = zLoad[key]; + int b = a - 1; + while (b >= 0 && zLoad[order[b]] > keyZ) { + order[b+1] = order[b]; + b--; + } + order[b+1] = key; +} + +real wsum = 0.0; +for (int k = 0; k < nLoad; k++) { + real left = (k > 0) ? zLoad[order[k]] - zLoad[order[k-1]] : 0.0; + real right = (k < nLoad - 1) ? zLoad[order[k+1]] - zLoad[order[k]] : 0.0; + wLoad[order[k]] = 0.5*(left+right); + wsum += wLoad[order[k]]; +} +for (int k = 0; k < nLoad; k++) wLoad[k] = wLoad[k] / wsum; + +// =============== Vector P1 space (dofs interleaved 3*i, 3*i+1, 3*i+2 per node) =============== +fespace Wh(Th, [P1, P1, P1]); +Wh [ux, uy, uz], [vx, vy, vz]; + +varf vElasticity([ux, uy, uz], [vx, vy, vz]) = + int3d(Th)( + lambda*(dx(ux)+dy(uy)+dz(uz))*(dx(vx)+dy(vy)+dz(vz)) + + 2.*mu*( dx(ux)*dx(vx) + dy(uy)*dy(vy) + dz(uz)*dz(vz) ) + + mu*( dy(ux)+dx(uy) )*( dy(vx)+dx(vy) ) + + mu*( dz(ux)+dx(uz) )*( dz(vx)+dx(vz) ) + + mu*( dz(uy)+dy(uz) )*( dz(vy)+dy(vz) ) + ); + +matrix A = vElasticity(Wh, Wh); +real[int] b(Wh.ndof); +b = 0.0; + +// ---- Midspan distributed line load (-y direction), split by tributary length ---- +for (int k = 0; k < nLoad; k++) { + int i = loadIdx[k]; + b[3*i + 1] -= Pload * wLoad[k]; +} + +real tgv = 1e30; +// ---- Left support line: pin (ux=uy=uz=0) ---- +for (int k = 0; k < nLeft; k++) { + int i = leftIdx[k]; + A(3*i, 3*i) = tgv; b[3*i] = 0.0; + A(3*i+1, 3*i+1) = tgv; b[3*i+1] = 0.0; + A(3*i+2, 3*i+2) = tgv; b[3*i+2] = 0.0; +} +// ---- Right support line: roller (uy=0 only) ---- +for (int k = 0; k < nRight; k++) { + int i = rightIdx[k]; + A(3*i+1, 3*i+1) = tgv; b[3*i+1] = 0.0; +} + +set(A, solver=sparsesolver); +real[int] sol = A^-1 * b; +ux[] = sol; + +cout << "[sanity check] midspan deflection uy = " << uy(Lbeam/2., Hbeam, 0.1) + << " (expected: negative)" << endl; + +// =============== Write results as plain text (no pyfreefem export macros) =============== +{ + ofstream fout("$outFile"); + fout.precision(12); + for (int i = 0; i < Th.nv; i++) { + fout << Th(i).x << " " << Th(i).y << " " << Th(i).z << " " + << sol[3*i] << " " << sol[3*i+1] << " " << sol[3*i+2] << endl; + } +} + +cout << "Results written to $outFile" << endl; diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/params_beam3d_threept.json b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/params_beam3d_threept.json new file mode 100644 index 00000000..9bc56483 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/params_beam3d_threept.json @@ -0,0 +1,5 @@ +{ + "P": 10, + "youngModulus": 1000, + "poissonRatio": 0.3 +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/results/freefem_beam3d_threept_raw.txt b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/results/freefem_beam3d_threept_raw.txt new file mode 100644 index 00000000..9d032158 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/results/freefem_beam3d_threept_raw.txt @@ -0,0 +1,99 @@ +0 0 0 -6.95346501607e-33 -1.53455674958e-30 -2.55260845247e-31 +1 0 0 0.636734610555 -1.04425959293e-30 0.58062619218 +1 0.2 0 0.139954118946 -0.0403420772898 0.569625178078 +0 0.2 0 0.505836191061 -0.0796491259616 -0.044503267668 +0 0 0.2 -6.95346501639e-33 -9.36386726172e-31 1.59101042335e-31 +1 0 0.2 0.39634728386 -1.64242961635e-30 0.590296470209 +1 0.2 0.2 -0.0783361225874 -0.0325548942187 0.580238235941 +0 0.2 0.2 0.496682296109 -0.0312055782935 -0.0373806777224 +0.0999999999998 0 0 0.0386771219252 -0.331683429025 0.0161832624459 +0.2 0 0 0.0777449693592 -0.578066677702 0.0346812049964 +0.299999999999 0 0 0.13959242856 -0.783824431069 0.0584489357333 +0.399999999999 0 0 0.224228115151 -0.928911324221 0.0925158406348 +0.499999999999 0 0 0.329068263031 -0.989009357733 0.139579320362 +0.599999999999 0 0 0.439989175415 -0.927703718938 0.206242472525 +0.699999999999 0 0 0.526238007266 -0.773778566879 0.285669130087 +0.799999999999 0 0 0.584870087197 -0.556954563161 0.377659877682 +0.9 0 0 0.62198143647 -0.300424744686 0.477572943711 +1 0.0999999999997 0 0.380691642109 -0.0294809853408 0.575764197425 +0.9 0.2 0 0.144933147678 -0.301782836566 0.458475402867 +0.8 0.2 0 0.167817935947 -0.552908758122 0.348101438073 +0.700000000001 0.2 0 0.206941683476 -0.76824224429 0.245974183164 +0.600000000001 0.2 0 0.261781872793 -0.927024154861 0.154931909581 +0.500000000002 0.2 0 0.335544287616 -1.02572999252 0.0775912306434 +0.400000000002 0.2 0 0.391612153861 -0.944512227697 0.0265514174778 +0.300000000001 0.2 0 0.442166249743 -0.794708826934 -0.00746904373604 +0.200000000001 0.2 0 0.478520951181 -0.586871152546 -0.0277068940182 +0.1 0.2 0 0.499322721131 -0.339670219094 -0.0384637954195 +0 0.1 0 0.271292406008 -0.0614979378061 -0.0217727304836 +0.0999999999998 0 0.2 0.0197091532398 -0.279308113009 0.00881576516456 +0.2 0 0.2 0.0452714927033 -0.529688882147 0.0194105921334 +0.299999999999 0 0.2 0.0850690800447 -0.740472830596 0.0369042917343 +0.399999999999 0 0.2 0.139984844678 -0.893324085833 0.0661833122229 +0.499999999999 0 0.2 0.208573215073 -0.964579004238 0.112517501976 +0.599999999999 0 0.2 0.280478548675 -0.905931845528 0.179714556117 +0.699999999999 0 0.2 0.335086115608 -0.757968149136 0.265403317751 +0.799999999999 0 0.2 0.372644779135 -0.546271153861 0.364102452022 +0.9 0 0.2 0.394236516273 -0.292330467737 0.473233772407 +1 0.0999999999997 0.2 0.156419074969 -0.0290563077642 0.587504222262 +0.9 0.2 0.2 -0.0718758446349 -0.285860842366 0.467382914645 +0.8 0.2 0.2 -0.0390393241493 -0.534695919065 0.363069932212 +0.700000000001 0.2 0.2 0.0217449411066 -0.748265760306 0.26789056425 +0.600000000001 0.2 0.2 0.104660098125 -0.904337558275 0.186854178799 +0.500000000002 0.2 0.2 0.213107921177 -1.01286584603 0.125112378157 +0.400000000002 0.2 0.2 0.312027180621 -0.895751276831 0.0557694255398 +0.300000000001 0.2 0.2 0.393959497711 -0.742998335744 0.0129620957474 +0.200000000001 0.2 0.2 0.451240981537 -0.533596881348 -0.013962604592 +0.1 0.2 0.2 0.484730159898 -0.287735807428 -0.0298086484375 +0 0.1 0.2 0.251814301587 -0.0259962758142 -0.0150308383778 +0 0 0.0999999999997 1.39069300328e-32 -2.52905652423e-30 9.61598029123e-32 +1 0 0.0999999999997 0.517675137465 -2.31331079074e-30 0.585581038876 +1 0.2 0.0999999999997 0.0319475240588 -0.0364691721925 0.575747284425 +0 0.2 0.0999999999997 0.50053182335 -0.0535870430627 -0.0405730351666 +0.1 0.1 0 0.275042353617 -0.337876954883 -0.0100518784427 +0.2 0.1 0 0.281676287499 -0.589361812747 0.00485288005418 +0.3 0.1 0 0.293531280926 -0.799692378225 0.0271514418532 +0.4 0.1 0 0.310159987905 -0.948940824341 0.0609639175031 +0.5 0.1 0 0.331841769477 -1.0128423643 0.108396502169 +0.6 0.1 0 0.35454139229 -0.943047869349 0.179525405002 +0.7 0.0999999999999 0 0.364561170644 -0.780709825438 0.265408539865 +0.8 0.0999999999998 0 0.371565566882 -0.56165985229 0.362666394453 +0.9 0.0999999999998 0 0.374372945097 -0.304596211134 0.467423740901 +0.1 0.1 0.2 0.251858136259 -0.287728031125 -0.00950998802155 +0.2 0.1 0.2 0.246803822403 -0.538000068002 0.00292371188962 +0.3 0.1 0.2 0.237494475024 -0.751678628641 0.0252500145132 +0.4 0.1 0.2 0.224148963193 -0.908782869036 0.0615651523066 +0.5 0.1 0.2 0.209508906463 -0.991923512671 0.117052843292 +0.6 0.1 0.2 0.200349331341 -0.920000822 0.184329810508 +0.7 0.0999999999999 0.2 0.182554923473 -0.764008986052 0.268163138921 +0.8 0.0999999999998 0.2 0.168294139602 -0.547992229122 0.365487718621 +0.9 0.0999999999998 0.2 0.156582957601 -0.291027477876 0.472815017826 +0.0999999999998 0 0.0999999999997 0.0288030541587 -0.300796951147 0.0115058241806 +0.2 0 0.0999999999997 0.0613518218105 -0.550338894967 0.0256071868597 +0.299999999999 0 0.0999999999997 0.112397559875 -0.757604742129 0.0454660515865 +0.399999999999 0 0.0999999999997 0.182449590659 -0.905121432981 0.0761584191065 +0.499999999999 0 0.0999999999997 0.269143096951 -0.969261385329 0.121798888857 +0.599999999999 0 0.0999999999997 0.359785253026 -0.909915576242 0.189401005925 +0.699999999999 0 0.0999999999997 0.430241199981 -0.759982900524 0.272919180967 +0.799999999999 0 0.0999999999997 0.478936804961 -0.547352418672 0.369163472717 +0.9 0 0.0999999999997 0.508974980911 -0.293919371819 0.474445270169 +0.9 0.2 0.0999999999997 0.0377763988113 -0.292405516055 0.46260514463 +0.8 0.2 0.0999999999997 0.0652659384948 -0.541196984399 0.354223593673 +0.700000000001 0.2 0.0999999999997 0.114394516119 -0.753767947775 0.254710480858 +0.600000000001 0.2 0.0999999999997 0.182817016174 -0.909211461349 0.16764382807 +0.500000000002 0.2 0.0999999999997 0.274904901782 -1.01086216097 0.0961979916008 +0.400000000002 0.2 0.0999999999997 0.351658393089 -0.914615710964 0.0382713212066 +0.300000000001 0.2 0.0999999999997 0.418006331367 -0.763241813291 0.000332264842463 +0.200000000001 0.2 0.0999999999997 0.464750652979 -0.555814355779 -0.0224584941576 +0.1 0.2 0.0999999999997 0.491605363482 -0.310692994125 -0.0347519732087 +1 0.0999999999997 0.0999999999997 0.269479498252 -0.0284086702109 0.581402886721 +0 0.1 0.0999999999997 0.260224938975 -0.0429595245688 -0.0172731245308 +0.1 0.1 0.0999999999997 0.262886606395 -0.309726573259 -0.0103311709178 +0.2 0.1 0.0999999999997 0.264125248265 -0.559750599602 0.00238594873501 +0.3 0.1 0.0999999999997 0.26566340213 -0.770628279885 0.0238918958533 +0.4 0.1 0.0999999999997 0.267621624485 -0.922751416601 0.0581254872747 +0.5 0.1 0.0999999999997 0.271270069266 -0.994322010043 0.108334596761 +0.6 0.1 0.0999999999997 0.277272736586 -0.924717691247 0.178541878618 +0.7 0.0999999999999 0.0999999999997 0.273466772817 -0.767114955156 0.264378651842 +0.8 0.0999999999998 0.0999999999997 0.270344168858 -0.551271555856 0.362519296092 +0.9 0.0999999999998 0.0999999999997 0.26644000381 -0.296108087744 0.469343013472 diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/run.py b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/run.py new file mode 100644 index 00000000..1084edb6 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/run.py @@ -0,0 +1,142 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .sofa_scene import sofaRun, L, H, W + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "3D — 3-point bending" + +MATH_DESCRIPTION = """ +Poutre 3D simplement appuyee : ligne d'appui gauche (x=0, y=0) en pin +(ux=uy=uz=0), ligne d'appui droite (x=L, y=0) en rouleau (uy=0 seulement), +chargee par une charge lineique repartie le long de la ligne mediane +(x=L/2, y=H), poids reparti selon des poids trapezoidaux (longueur +tributaire) pour que la somme egale P. + +Elasticite 3D complete (pas de notion plane strain/stress en 3D) : + lambda = E*nu / ((1+nu)(1-2nu)), mu = E / (2(1+nu)) + +Pas de solution analytique 2D/3D exacte -> comparaison SOFA vs FreeFem +uniquement (RMS separement sur ux, uy, uz), plus un releve de la fleche +au point le plus proche de (L/2, H, W/2). +""" + + +def _load_params(): + with open(os.path.join(HERE, "params_beam3d_threept.json")) as f: + return json.load(f) + + +def _mesh_path(): + return os.path.join(HERE, "beam3d_tet.msh") + + +def _to_freefem_path(path): + """FreeFEM string literals on Windows can choke on backslashes; use forward slashes.""" + return path.replace(os.sep, "/") + + +def _pair_by_coordinates(x_a, y_a, z_a, x_b, y_b, z_b, tol=1e-6, snap=1e-6): + """ + Apparie les noeuds entre deux copies independamment chargees du "meme" + maillage, par coordonnees arrondies (snap). + + Le fichier de maillage brut porte du bruit flottant sous-tolerance issu + de la generation du maillage (ex: x=0.8999999999997362 au lieu de 0.9), + et ce bruit differe legerement entre noeuds conceptuellement au meme + endroit selon la source (SOFA garde le bruit brut, FreeFem semble le + nettoyer/arrondir en sortie). Trier sur les valeurs BRUTES est donc + dangereux : une cle de tri primaire (x) "presque a egalite" peut + s'ordonner differemment entre les deux sources, ce qui contamine + ensuite les cles secondaires/tertiaires (y, z) et mele silencieusement + des points pourtant identiques. Arrondir sur une grille bien au-dessus + du bruit mais bien en-dessous de l'espacement reel du maillage corrige + ce probleme. + """ + x_a, y_a, z_a = map(np.asarray, (x_a, y_a, z_a)) + x_b, y_b, z_b = map(np.asarray, (x_b, y_b, z_b)) + + if x_a.size != x_b.size: + raise ValueError( + f"Node COUNT mismatch: SOFA has {x_a.size} nodes, " + f"FreeFEM has {x_b.size} nodes. Check that both loaded the " + f"exact same mesh file (same path, no stale results.txt)." + ) + + def snap_(v): + return np.round(v / snap) * snap + + xs_a, ys_a, zs_a = snap_(x_a), snap_(y_a), snap_(z_a) + xs_b, ys_b, zs_b = snap_(x_b), snap_(y_b), snap_(z_b) + + order_a = np.lexsort((zs_a, ys_a, xs_a)) + order_b = np.lexsort((zs_b, ys_b, xs_b)) + + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol) + and np.allclose(z_a[order_a], z_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def run_case(): + cfg = _load_params() + P = float(cfg["P"]) + young_modulus = float(cfg["youngModulus"]) + poisson_ratio = float(cfg["poissonRatio"]) + mesh_file = _mesh_path() + + os.makedirs(os.path.join(HERE, "results"), exist_ok=True) + ff_out_path = os.path.join(HERE, "results", "freefem_beam3d_threept_raw.txt") + + # --- FreeFem++ (ecrit directement un fichier texte, pas d'exportArray) --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3d_threept.edp")) + runner.execute({ + 'P': P, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': _to_freefem_path(mesh_file), + 'outFile': _to_freefem_path(ff_out_path), + }, verbosity=0) + + if not os.path.isfile(ff_out_path): + raise RuntimeError( + f"FreeFEM did not produce the expected output file: {ff_out_path}\n" + f"Check the FreeFEM console output above for compile/runtime errors." + ) + + raw = np.loadtxt(ff_out_path) + x_ff, y_ff, z_ff = raw[:, 0], raw[:, 1], raw[:, 2] + ux_ff, uy_ff, uz_ff = raw[:, 3], raw[:, 4], raw[:, 5] + + # --- SOFA --- + pos0_sofa, u_sofa = sofaRun(mesh_file=mesh_file, P=P, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio) + x_sofa, y_sofa, z_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1], pos0_sofa[:, 2] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, z_sofa, x_ff, y_ff, z_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm], uz_ff[perm]]) + + # --- Fleche au point le plus proche de (L/2, H, W/2) --- + mid_idx = np.argmin(np.abs(x_sofa - L / 2) + np.abs(y_sofa - H) + np.abs(z_sofa - W / 2)) + w_sofa = u_sofa[mid_idx, 1] + w_ff = u_ff[mid_idx, 1] + + return { + "label": LABEL, + "dim": 3, + "coords_ff": np.column_stack([x_sofa, y_sofa, z_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa, z_sofa]), + "u_sofa": u_sofa, + "u_ana": None, + "component_names": ["ux", "uy", "uz"], + "midspan_deflection": {"w_sofa": w_sofa, "w_ff": w_ff}, + } diff --git a/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/sofa_scene.py new file mode 100644 index 00000000..9d68848c --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/three_point_bending/sofa_scene.py @@ -0,0 +1,192 @@ +""" +3D Beam Simulation - Three-Point Bending - P1 Tetrahedra +Cross-validation SOFA vs FreeFEM + +Boundary conditions (all identified by exact node-coordinate matching, +since this mesh happens to have exact nodes on x=0, x=L, and x=L/2): + - Left support line (x=0, y=0): pin -> ux = uy = uz = 0 + - Right support line (x=L, y=0): roller -> uy = 0 only + - Midspan load line (x=L/2, y=H): distributed line load along -y, + split across the nodes on that line using trapezoidal (tributary + length) weights so that the total applied force equals P. +""" +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" + +L = 1.0 +H = 0.2 +W = 0.2 +TOL = 1e-6 + + +def _line_load_weights(z_values): + """Trapezoidal tributary-length weights along a 1D line (weights sum to 1).""" + z_values = np.asarray(z_values) + order = np.argsort(z_values) + z_sorted = z_values[order] + n = len(z_sorted) + w_sorted = np.zeros(n) + for k in range(n): + left = z_sorted[k] - z_sorted[k - 1] if k > 0 else 0.0 + right = z_sorted[k + 1] - z_sorted[k] if k < n - 1 else 0.0 + w_sorted[k] = 0.5 * (left + right) + w_sorted /= w_sorted.sum() + w = np.empty(n) + w[order] = w_sorted + return w + + +def _default_mesh_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "beam3d_tet.msh") + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3d_threept.json") + + +def create_scene_args(rootNode, mesh_file, P, young_modulus, poisson_ratio, tol=TOL): + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + loader = Beam.addObject('MeshGmshLoader', name="loader", filename=mesh_file) + + nodes = np.array(loader.position.value) + N = len(nodes) + x, y, z = nodes[:, 0], nodes[:, 1], nodes[:, 2] + + # ---- Left support line (x=0, y=0): pin (ux=uy=uz=0) ---- + left_idx = np.where(np.isclose(x, 0.0, atol=tol) & np.isclose(y, 0.0, atol=tol))[0] + + # ---- Right support line (x=L, y=0): roller (uy=0 only) ---- + right_idx = np.where(np.isclose(x, L, atol=tol) & np.isclose(y, 0.0, atol=tol))[0] + + # ---- Midspan load line (x=L/2, y=H): distributed line load ---- + load_idx = np.where(np.isclose(x, L / 2.0, atol=tol) & np.isclose(y, H, atol=tol))[0] + + if len(left_idx) == 0 or len(right_idx) == 0 or len(load_idx) == 0: + raise RuntimeError( + f"BC node search failed: left={len(left_idx)}, " + f"right={len(right_idx)}, load={len(load_idx)}. " + f"Check that this mesh really has exact nodes at x=0, x=L, x=L/2." + ) + + weights = _line_load_weights(z[load_idx]) + forces_y = -P * weights # applied along -y + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position="@loader.position" + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TetrahedronSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TetrahedronSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="leftSupport" + , indices=left_idx.tolist()) + + Beam.addObject('PartialFixedProjectiveConstraint' + , name="rightSupport" + , fixedDirections=[0, 1, 0] + , indices=right_idx.tolist()) + + Beam.addObject('ConstantForceField' + , name="MidspanLoad" + , indices=load_idx.tolist() + , forces=[[0.0, fy, 0.0] for fy in forces_y]) + + return rootNode, dofs, nodes.copy() + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , P=float(cfg["P"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) + return rootNode + + +def sofaRun(mesh_file, P, young_modulus, poisson_ratio): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , P=P + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + u = pos_final[:, :3] - pos0[:, :3] + x0 = pos0[:, :3] + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, "sofa_beam3d_threept_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'z0':>12} {'ux':>12} {'uy':>12} {'uz':>12}\n") + f.write("-" * 78 + "\n") + for (xi, yi, zi), (uxi, uyi, uzi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {zi:12.6f} {uxi:12.6f} {uyi:12.6f} {uzi:12.6f}\n") + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , P=float(cfg["P"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/__init__.py b/examples/Freefem/projet_validation/cases/case_3d/torsion/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/freefem_beam3d_torsion.edp b/examples/Freefem/projet_validation/cases/case_3d/torsion/freefem_beam3d_torsion.edp new file mode 100644 index 00000000..89feb017 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/freefem_beam3d_torsion.edp @@ -0,0 +1,99 @@ +load "gmsh" +load "msh3" + +DEFAULT (T, 0.08) +DEFAULT (radius, 0.1) +DEFAULT (youngModulus, 10000.0) +DEFAULT (poissonRatio, 0.3) +DEFAULT (meshFile, "beam3d_circular_tet.msh") +DEFAULT (outFile, "freefem_beam3d_torsion_out.txt") + +real Torque = $T; +real radius = $radius; +real E = $youngModulus; +real nu = $poissonRatio; + +real mu = E / (2.*(1.+nu)); +real lambda = E*nu / ((1.+nu)*(1.-2.*nu)); + +mesh3 Th = gmshload3("$meshFile"); + +// =============== Geometrie =============== +real xmin=1e30, xmax=-1e30, ymin=1e30, ymax=-1e30, zmin=1e30, zmax=-1e30; +for (int i = 0; i < Th.nv; i++) { + xmin = min(xmin, Th(i).x); xmax = max(xmax, Th(i).x); + ymin = min(ymin, Th(i).y); ymax = max(ymax, Th(i).y); + zmin = min(zmin, Th(i).z); zmax = max(zmax, Th(i).z); +} +real length = xmax - xmin; +real yc = 0.5*(ymin+ymax); +real zc = 0.5*(zmin+zmax); + +real J = pi*radius^4/2.; +real G = mu; +real thetaPrime = Torque/(G*J); +real thetaTotal = thetaPrime*length; +cout << "length=" << length << " yc=" << yc << " zc=" << zc << " J=" << J << endl; +cout << "theta' = " << thetaPrime << " rad/m, theta_total = " << thetaTotal << " rad" << endl; +if (abs(thetaTotal) > 0.1) + cout << " total torsion's angle : small-strain " << endl; + + +fespace Wh(Th, [P1, P1, P1]); +Wh [ux, uy, uz], [vx, vy, vz]; + + +varf vElasticity([ux, uy, uz], [vx, vy, vz]) = + int3d(Th)( + lambda*(dx(ux)+dy(uy)+dz(uz))*(dx(vx)+dy(vy)+dz(vz)) + + 2.*mu*( dx(ux)*dx(vx) + dy(uy)*dy(vy) + dz(uz)*dz(vz) ) + + mu*( dy(ux)+dx(uy) )*( dy(vx)+dx(vy) ) + + mu*( dz(ux)+dx(uz) )*( dz(vx)+dx(vz) ) + + mu*( dz(uy)+dy(uz) )*( dz(vy)+dy(vz) ) + ); + +matrix A = vElasticity(Wh, Wh); +real[int] b(Wh.ndof); +b = 0.0; + +func taux = 0.; +func tauy = -(Torque/J)*(z-zc); +func tauz = (Torque/J)*(y-yc); + +varf vTraction([ux, uy, uz], [vx, vy, vz]) = int2d(Th, 2)(taux*vx + tauy*vy + tauz*vz); +real[int] bTraction = vTraction(0, Wh); +b += bTraction; + +cout << " Aire face charged (attendu " << pi*radius^2 << ") = " + << int2d(Th, 2)(1.) << endl; +cout << "Applicated moment (attendu " << Torque << ") = " + << int2d(Th, 2)((y-yc)*tauz - (z-zc)*tauy) << endl; + +real tgv = 1e30; +int nFixed = 0; +for (int i = 0; i < Th.nv; i++) { + if (abs(Th(i).x - xmin) < 1e-6) { + A(3*i, 3*i) = tgv; b[3*i] = 0.0; + A(3*i+1, 3*i+1) = tgv; b[3*i+1] = 0.0; + A(3*i+2, 3*i+2) = tgv; b[3*i+2] = 0.0; + nFixed++; + } +} + +set(A, solver=sparsesolver); +real[int] sol = A^-1 * b; +ux[] = sol; + +cout << " amplitude uy sur maillage : min=" << uy[].min + << " max=" << uy[].max << endl; + + +{ + ofstream fout("$outFile"); + fout.precision(12); + for (int i = 0; i < Th.nv; i++) { + fout << Th(i).x << " " << Th(i).y << " " << Th(i).z << " " + << sol[3*i] << " " << sol[3*i+1] << " " << sol[3*i+2] << endl; + } +} + diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh/beam3d_circular_tet.msh b/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh/beam3d_circular_tet.msh new file mode 100644 index 00000000..a4336f48 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh/beam3d_circular_tet.msh @@ -0,0 +1,1600 @@ +$MeshFormat +2.2 0 8 +$EndMeshFormat +$PhysicalNames +4 +2 1 "Fixed" +2 2 "Loaded" +2 3 "Lateral" +3 4 "Beam" +$EndPhysicalNames +$Nodes +279 +1 0 0.1 0 +2 1 0.1 0 +3 0 0.08412535328311815 0.05406408174555971 +4 0 0.04154150130018873 0.0909631995354518 +5 0 -0.01423148382732846 0.09898214418809329 +6 0 -0.06548607339452847 0.07557495743542586 +7 0 -0.09594929736144969 0.02817325568414318 +8 0 -0.09594929736144986 -0.0281732556841426 +9 0 -0.06548607339452898 -0.07557495743542542 +10 0 -0.01423148382732931 -0.09898214418809316 +11 0 0.04154150130018804 -0.09096319953545212 +12 0 0.08412535328311789 -0.05406408174556013 +13 0.05882352941176477 0.1 0 +14 0.1176470588235296 0.1 0 +15 0.1764705882352943 0.1 0 +16 0.235294117647059 0.1 0 +17 0.2941176470588239 0.1 0 +18 0.3529411764705889 0.1 0 +19 0.4117647058823538 0.1 0 +20 0.4705882352941187 0.1 0 +21 0.5294117647058832 0.1 0 +22 0.5882352941176479 0.1 0 +23 0.6470588235294124 0.1 0 +24 0.7058823529411768 0.1 0 +25 0.7647058823529413 0.1 0 +26 0.823529411764706 0.1 0 +27 0.8823529411764703 0.1 0 +28 0.9411764705882349 0.1 0 +29 1 0.08412535328311815 0.05406408174555971 +30 1 0.04154150130018873 0.0909631995354518 +31 1 -0.01423148382732846 0.09898214418809329 +32 1 -0.06548607339452847 0.07557495743542586 +33 1 -0.09594929736144969 0.02817325568414318 +34 1 -0.09594929736144986 -0.0281732556841426 +35 1 -0.06548607339452898 -0.07557495743542542 +36 1 -0.01423148382732931 -0.09898214418809316 +37 1 0.04154150130018804 -0.09096319953545212 +38 1 0.08412535328311789 -0.05406408174556013 +39 0 -0.01940477486593722 -0.04529147544761606 +40 0 0.035455515734431 0.03954134371191712 +41 0 -0.04394548876503229 0.02824205075187563 +42 0 0.02527450182266788 -0.04871704454808684 +43 0 0.0001688540822083871 0.0006468638401974109 +44 0 0.05485826303425721 -0.001421472832662119 +45 0 -0.05342767961103161 -0.01532958638182798 +46 0 -0.008005690957119799 0.05568080365037372 +47 0.4995097539852325 0.08686813489250228 -0.04953712890648818 +48 0.3235294117647064 0.08702422145326316 -0.04926240839071324 +49 0.6764705882352946 0.08702422145329751 -0.04926240839065257 +50 0.7352941176470591 0.08702422145328707 0.049262408390671 +51 0.2647058823529415 0.08702422145328692 0.04926240839067125 +52 0.9513709056668098 -0.08412535328311839 -0.05406408174555935 +53 0.04862909433319011 -0.08412535328311839 -0.05406408174555935 +54 0.9556896744355053 -0.04066159980447372 0.09135991627262376 +55 0.04097088267485007 -0.04059116578695683 0.09139123185544545 +56 0.7941176470588236 0.08702422145326333 -0.04926240839071293 +57 0.2058823529411767 0.08702422145331544 -0.04926240839062088 +58 0.3823529411764713 0.08702422145326047 0.04926240839071799 +59 0.6173150128138352 0.08664586603779184 0.04992488255931138 +60 0.500000000000001 0.08702422145327676 0.04926240839068919 +61 0.04862909433300569 0.01423148382732779 -0.09898214418809338 +62 0.9579706797487429 0.01276758618847549 -0.09918159477907104 +63 0.8529411764705881 0.08702422145325539 0.04926240839072694 +64 0.1314071680317878 0.08426953079454261 0.05383907669776327 +65 0.9582047491548662 0.06557666510491854 0.07549636410925602 +66 0.04862909433319022 0.06548607339452857 0.07557495743542579 +67 0.9117647058823526 0.08702422145328748 -0.04926240839067026 +68 0.08823529411764719 0.08702422145328735 -0.0492624083906705 +69 0.2649851171379276 0.08710621042248232 -0.04911728927612186 +70 0.2941185502665614 0.05206592652942346 -0.0853764563251057 +71 0.3522226165456088 0.05187329200578032 -0.08549363471325248 +72 0.3229450330273794 0.003845005434918707 -0.09992605232473384 +73 0.2649303811858111 0.004085322108153949 -0.09991651586836198 +74 0.3809732198954013 0.003564680775956292 -0.09993644505867481 +75 0.4104514509170664 0.05165458303950837 -0.08562595430717568 +76 0.4390477284615988 0.00324407778601819 -0.09994736594487252 +77 0.7354960570980504 0.08708354275111661 -0.04915746720402148 +78 0.7061204238020218 0.05194341478293424 -0.0854510483299535 +79 0.6457764561179241 0.05136717044072135 -0.08579868181338152 +80 0.7639306528509512 0.05170072903322919 -0.08559809937979122 +81 0.7350395689842719 0.003989285273764727 -0.09992039633130227 +82 0.7926936032177988 0.003687752122312954 -0.09993197928733513 +83 0.7637263764729966 -0.04498686786455872 -0.08930947161268359 +84 0.7051693213887456 -0.04539665891390188 -0.0891018706843737 +85 0.8171304051067461 -0.04464137943994404 -0.08948266447585779 +86 0.7924149162580981 -0.08256534584581579 -0.05641776019447095 +87 0.8499393455111499 -0.08270400556358419 -0.05621429945964493 +88 0.8209560967656235 -0.09954593401891593 -0.009518771995464369 +89 0.7633659620629436 -0.099522724189701 -0.00975845120194309 +90 0.7920600681495141 -0.09172723038652386 0.03982606188939065 +91 0.734236405353393 -0.09185091430669991 0.03953997396336106 +92 0.7630829247872638 -0.06111777506520771 0.07914933714870059 +93 0.7051434544032316 -0.06122339406505076 0.07906766734358306 +94 0.8208135872972634 -0.06097502946652843 0.07925935769078621 +95 0.6764099279526676 -0.09197079629075679 0.03926031876646086 +96 0.6471204665190788 -0.06117470952277754 0.07910534062124878 +97 0.6178925415607651 -0.09211679355975448 0.03891653047574485 +98 0.4097908368208721 -0.04568647355027305 -0.08895361788336775 +99 0.2937539843015589 -0.045044132546728 -0.08928060328600385 +100 0.2359517175691137 -0.04489469857964663 -0.08935583942553882 +101 0.4678791376682618 -0.04597562507410799 -0.08880451508253989 +102 0.4386806909486156 -0.08331243181338371 -0.05530857714080422 +103 0.5888392951588893 -0.06125144455503186 0.07904593942715754 +104 0.4967680608524201 -0.0834907145135743 -0.05503908238708958 +105 0.4673735137127349 -0.09972093330340209 -0.00746561860118997 +106 0.4094520545548131 -0.09968594491003178 -0.007919115316379149 +107 0.264654454701598 -0.08260510482433378 -0.0563595303117479 +108 0.2070225263798397 -0.08252101002805444 -0.05648258938779047 +109 0.4379794211473053 -0.09076307730721817 0.04197694364438578 +110 0.3801503348697831 -0.09096495449450587 0.04153765826105844 +111 0.2355905781859293 -0.0995450516894073 -0.009527994760348471 +112 0.1780318737892158 -0.09952865210060791 -0.009697804444107876 +113 0.2066191396106315 -0.09182478414471092 0.03960061889386637 +114 0.5260110657249072 -0.04623976566285262 -0.08866726606501679 +115 0.1784010691222823 -0.04492526400452543 -0.08934047601240824 +116 0.4086511951057173 -0.05880070364132807 0.08088558123228583 +117 0.3520490491391166 -0.05983996730729275 0.0801197747916339 +118 0.4653403706253139 -0.05981105703383619 0.08014135921292573 +119 0.1492499218611671 -0.09192614021127944 0.03936476528389561 +120 0.177792436681521 -0.06148595260893924 0.07886366483857618 +121 0.6760516743481345 -0.01500260514477466 0.09886820438781106 +122 0.7918685813139669 -0.01502989411687945 0.09886405961134408 +123 0.2352697640611835 -0.06109465867667144 0.07916718184437928 +124 0.2070033705947928 -0.01465833733728268 0.0989198319170955 +125 0.8483399923586705 -0.01469051233064779 0.09891505874973278 +126 0.2641389561034528 -0.01506159133366285 0.09885923561558491 +127 0.437496575665277 -0.0116031165000107 0.09932455732338896 +128 0.4959470572070956 -0.01125173303948072 0.09936497624217629 +129 0.1505158377967384 -0.01478400874046998 0.09890112782755163 +130 0.6455595904192858 -0.09946571938467143 -0.01032330699387551 +131 0.850416516781024 0.003364694733738518 -0.09994337811655535 +132 0.8727519555673909 -0.09980614471213889 -0.006223622554396434 +133 0.5548443654053417 -0.08357674987123864 -0.05490834982915085 +134 0.5841159306797048 -0.04648695664944132 -0.08853791764816341 +135 0.5552627153377886 0.002626469213038606 -0.09996550234692447 +136 0.5602602458058934 -0.09186406584563574 0.03950940908579502 +137 0.2933179809682092 -0.09957728104603704 -0.009185047603499584 +138 0.1280210303765975 -0.09945658015971985 -0.01041098760604489 +139 0.09186994839181216 -0.0920284137652389 0.03912506945494141 +140 0.8699518719958499 -0.06156325943176079 0.07880333170709039 +141 0.8208472480627148 0.03563216272730583 0.09343633650446061 +142 0.8690969891657653 0.03686633913072115 0.09295629639297523 +143 0.1770812342644228 0.03424647955309787 0.09395306614591803 +144 0.1283551270562724 0.03206335669145774 0.09472033127938455 +145 0.7680373619930061 0.03594260895642899 0.09331735562801398 +146 0.4664786333200198 0.03870421320493187 0.09220620304614641 +147 0.4079824480282985 0.03841438826696322 0.09232732409246464 +148 0.5284865217080866 -0.06052461734899037 0.07960383592992423 +149 0.5555549210035682 -0.0130487192056811 0.09914499950623476 +150 0.5258555037428851 0.0395087346008394 0.09186435592894797 +151 0.5850850718428127 0.03885084059623886 0.09214451793224403 +152 0.1989328646158923 0.08113455646073217 0.05845668266263716 +153 0.7943229395996972 0.08047970159469393 0.05935501353069527 +154 0.7023204025688943 0.04939626551329926 0.0869483119637158 +155 0.2482138625690606 0.04611987576153383 0.08872968533552165 +156 0.304845190023653 0.02853626958367239 0.09584196011271877 +157 0.4411189453918692 0.08233438537286973 0.05675428605199591 +158 0.6149714097825913 0.003287527640306929 -0.09994594620100516 +159 0.5857959534818732 0.05114088551171782 -0.0859337525601982 +160 0.6437478055345729 -0.04616467326654351 -0.08870638614098358 +161 0.8527392370195966 0.08708354275111661 -0.04915746720402148 +162 0.1467856822457757 0.08710442421135793 -0.04912045686684727 +163 0.1301894202625898 0.05112846374294661 -0.08594114378623428 +164 0.1826246077695576 0.05168154694166018 -0.08560968231290766 +165 0.2379366144464677 0.05194417285043197 -0.08545058751632108 +166 0.8499520272156765 -0.09158331130687526 0.04015590977761523 +167 0.6758084368453174 0.08676380452635349 0.04971963620253796 +168 0.1517587048416664 -0.08222635434402015 -0.05691069013192195 +169 0.1191356982934504 -0.0436372895322784 -0.08997659119057638 +170 0.3816408632395168 0.08693012368444181 -0.04942826717787759 +171 0.4402609111440492 0.08655789391004763 -0.05007725034241537 +172 0.6176470588235301 0.08702422145327952 -0.04926240839068433 +173 0.2076470892253003 0.003802017546515253 -0.099927697174387 +174 0.8227857382331757 0.05186303132900313 -0.08549985954004159 +175 0.1253120679864443 -0.06221025416578209 0.07829357749284926 +176 0.3234264664113079 0.08734355035144471 0.0486939853781208 +177 0.5585087468753926 0.08670530487383013 0.04982158274017568 +178 0.6428293142605831 0.04937994333306694 0.0869575827425251 +179 0.61140941595627 -0.01297952013109248 0.09915408240292765 +180 0.6129803130233598 -0.08289198255138808 -0.05593674310058083 +181 0.4971576607094487 0.002929841804996669 -0.09995707092045913 +182 0.5273428731078319 0.05132901553806618 -0.08582151340947654 +183 0.4689510038504038 0.05149965586363773 -0.08571922448276632 +184 0.5254264482438818 -0.09973808132388309 -0.007232920145451876 +185 0.70463661324389 -0.09949452922005539 -0.01004184521288516 +186 0.3518715000632664 -0.04529348759881674 -0.0891543604157185 +187 0.3224736041915366 -0.08277269338219891 -0.05611311103705165 +188 0.3806446956232492 -0.08305041976121673 -0.05570123676800816 +189 0.4961950424950697 -0.09085758915915729 0.04177198214336717 +190 0.3831518218825041 -0.01300553842816895 0.09915067306979525 +191 0.7348974588937233 -0.08230749812111079 -0.05679327207551388 +192 0.6758100514948091 -0.08224997050148497 -0.05687655362717448 +193 0.7342076372356942 -0.01425593515864969 0.09897862553477077 +194 0.8694062396249265 0.05069184288440719 -0.08619940292706543 +195 0.3513625084692713 -0.09962952331896782 -0.008599888559466785 +196 0.3220459841725918 -0.09136542281071192 0.04064922526469408 +197 0.2640278326561274 -0.09161480867174332 0.04008399720636488 +198 0.675174950085094 0.003604210355096436 -0.0999350272312777 +199 0.2929883071440967 -0.06069124443182913 0.07947686990134911 +200 0.5585080615155995 0.08705225911393366 -0.04921284571288836 +201 0.1514799844017797 0.003210114884507095 -0.09994846253158808 +202 0.03992856753296748 -0.0999817273020447 0.001911597682455727 +203 0.06109771149171359 -0.04196976267678461 -0.09076639808240922 +204 0.9390793317879118 -0.09999585787519706 -0.0009101691070288352 +205 0.9522342265529276 -0.04172632694427553 -0.09087856534815802 +206 0.9024656939486164 -0.06548607339452889 -0.0755749574354255 +207 0.9020373055685131 -0.008775845516744067 -0.09961417838574108 +208 0.9521099466013875 -0.0846026288310919 0.05331411815709323 +209 0.9586049969961006 0.01307638944309733 0.09914135382943111 +210 0.9047165598328999 -0.01423148382732846 0.09898214418809329 +211 0.06301586157435475 0.01875985585114254 0.0982245784335283 +212 0.354413062202294 0.0534103616676389 0.08454190243028607 +213 0.9059534902247598 0.08750952260964555 0.04839507673960169 +214 0.0828063645238329 0.08870385715781608 0.04616953243564163 +215 0.9614966712685932 0.0654066247371741 -0.07564372703992372 +216 0.03929125319280818 0.06552321574071014 -0.0755427574225111 +217 0.1014785962920351 -0.01570847495315565 0.09875851261864003 +218 0.5848875335182676 -0.09952315409404029 -0.009754065776583233 +219 0.9024194061488952 -0.09291053552312363 0.03698151414972598 +220 0.0428629957634365 -0.08412535328311804 0.05406408174555989 +221 0.09813223665741976 -0.0001238359937812512 -0.09999992332320383 +222 0.1058634130046851 -0.08197595058843014 -0.05727079120392228 +223 0.3201415676360586 -0.02031506394766584 0.09791474953653433 +224 0.8673305683466754 -0.04090853566365724 -0.09124961210797165 +225 0.9095832396467146 -0.09164991793106796 -0.04000365662322022 +226 0.04177767977969658 0.0916711303374029 0.03995502299665077 +227 0.9582223202203033 0.09167113033740303 0.03995502299665048 +228 0.9584210528962739 0.09175489646869056 -0.03976228079499311 +229 0.04157894710372613 0.09175489646869052 -0.03976228079499319 +230 0.07781525722251657 -0.06796945614750687 0.07334952645390523 +231 0.2942185346358137 0.06597092196045773 0.07515209548433893 +232 0.9205356594723 -0.06540192289696711 0.07564779231001503 +233 0.9204242077860862 0.04154150130018877 0.09096319953545179 +234 0.08194356250423716 -0.09667418638040517 -0.02557541177941585 +235 0.09022702150202074 0.06049729683380128 0.07962460094595726 +236 0.9227383751959514 0.04284190684896036 -0.09035801579021645 +237 0.07743870653980139 0.04277569883675997 -0.09038937763380614 +238 0.3453613951978387 0.01444917108190047 0.09895060108481389 +239 1 -0.01940477486593722 -0.04529147544761606 +240 1 0.035455515734431 0.03954134371191712 +241 1 -0.04394548876503229 0.02824205075187563 +242 1 0.02527450182266788 -0.04871704454808684 +243 1 0.0001688540822083871 0.0006468638401974109 +244 1 0.05485826303425721 -0.001421472832662119 +245 1 -0.05342767961103161 -0.01532958638182798 +246 1 -0.008005690957119799 0.05568080365037372 +247 0.2211158470879609 -0.0002107891618496477 3.960405642788878e-05 +248 0.835196731530948 -0.0004640725171416726 0.00022459671766379 +249 0.3664253420332929 -4.463903777057266e-05 -0.000194229482886929 +250 0.4826053702686713 -0.0001433682106215775 -0.0004003660305897938 +251 0.7207216160494458 9.07663943343906e-05 -1.776887443695474e-05 +252 0.1000638383048393 0.0006331190349781468 4.529196033763172e-05 +253 0.6016831961443643 0.001096813091701752 -0.00103996996529919 +254 0.9176373325306389 -0.0153757701655674 0.008052846769293839 +255 0.2956355481960565 -0.02363535508277945 -0.01608072882452322 +256 0.1603539210272851 -0.03365181044075613 0.003286266530293368 +257 0.4245338982423026 -0.02682920524033181 0.02295799145884528 +258 0.4243201720473464 0.009830128180448067 -0.03408611038802055 +259 0.7779025663310484 -0.02364998669340915 -0.02687329103127965 +260 0.5422449085995148 -0.02237877388609912 -0.02630272821325727 +261 0.6608612749189757 -0.03394154271821094 0.005207339715874414 +262 0.3113915066648953 0.03631663426663286 0.007862709639215936 +263 0.7778947614100042 0.001905049729389202 0.03531539548468228 +264 0.6615536630005159 0.03357829752369483 -0.008970566211904181 +265 0.165176168267886 0.02686046798397574 -0.02561287837259233 +266 0.8864142151083747 0.03675838235000423 -0.01603748929831961 +267 0.5420867514500375 0.02060193957004244 0.02759135500253742 +268 0.7648006858354518 0.03750937151556938 -0.02464789706876284 +269 0.9445974289381993 0.03809067242176035 0.01571289942852828 +270 0.05800336238210571 0.03609632410059687 0.02407321569459528 +271 0.2660182085106255 0.02659393278707649 -0.0365739212213171 +272 0.4135865307433196 0.03589262924375527 0.02300513746692377 +273 0.2641030873831018 -0.02506777266423074 0.03749059657051563 +274 0.05886439809224244 -0.04281598547465491 0.01203482230443683 +275 0.8752092015265868 -0.03331569926259692 -0.03151674242727134 +276 0.9423385130896771 -0.00550704022248933 -0.04496189244711323 +277 0.1491791328819491 0.02006699153995805 0.03569844590756165 +278 0.3253720082856359 -0.02543156245649514 0.0372592014446399 +279 0.05541516867143474 0.003457982678112504 -0.04018128058009178 +$EndNodes +$Elements +1305 +1 2 2 1 1 3 44 1 +2 2 2 1 1 1 44 12 +3 2 2 1 1 4 40 3 +4 2 2 1 1 40 44 3 +5 2 2 1 1 5 46 4 +6 2 2 1 1 4 46 40 +7 2 2 1 1 6 46 5 +8 2 2 1 1 7 41 6 +9 2 2 1 1 41 46 6 +10 2 2 1 1 8 45 7 +11 2 2 1 1 7 45 41 +12 2 2 1 1 9 45 8 +13 2 2 1 1 10 39 9 +14 2 2 1 1 39 45 9 +15 2 2 1 1 11 42 10 +16 2 2 1 1 10 42 39 +17 2 2 1 1 12 42 11 +18 2 2 1 1 12 44 42 +19 2 2 1 1 42 43 39 +20 2 2 1 1 43 45 39 +21 2 2 1 1 43 44 40 +22 2 2 1 1 40 46 43 +23 2 2 1 1 41 45 43 +24 2 2 1 1 43 46 41 +25 2 2 1 1 42 44 43 +26 2 2 3 2 1 3 226 +27 2 2 3 2 12 1 229 +28 2 2 3 2 13 1 226 +29 2 2 3 2 1 13 229 +30 2 2 3 2 2 28 227 +31 2 2 3 2 28 2 228 +32 2 2 3 2 29 2 227 +33 2 2 3 2 2 38 228 +34 2 2 3 2 3 4 66 +35 2 2 3 2 3 66 226 +36 2 2 3 2 4 5 211 +37 2 2 3 2 66 4 211 +38 2 2 3 2 5 6 55 +39 2 2 3 2 5 55 211 +40 2 2 3 2 6 7 220 +41 2 2 3 2 55 6 220 +42 2 2 3 2 7 8 202 +43 2 2 3 2 7 202 220 +44 2 2 3 2 8 9 53 +45 2 2 3 2 8 53 202 +46 2 2 3 2 9 10 203 +47 2 2 3 2 53 9 203 +48 2 2 3 2 10 11 61 +49 2 2 3 2 10 61 203 +50 2 2 3 2 11 12 216 +51 2 2 3 2 61 11 216 +52 2 2 3 2 216 12 229 +53 2 2 3 2 13 14 68 +54 2 2 3 2 14 13 214 +55 2 2 3 2 13 68 229 +56 2 2 3 2 214 13 226 +57 2 2 3 2 15 14 64 +58 2 2 3 2 14 15 162 +59 2 2 3 2 64 14 214 +60 2 2 3 2 68 14 162 +61 2 2 3 2 15 16 57 +62 2 2 3 2 16 15 152 +63 2 2 3 2 15 57 162 +64 2 2 3 2 15 64 152 +65 2 2 3 2 17 16 51 +66 2 2 3 2 16 17 69 +67 2 2 3 2 51 16 152 +68 2 2 3 2 57 16 69 +69 2 2 3 2 17 18 48 +70 2 2 3 2 18 17 176 +71 2 2 3 2 17 48 69 +72 2 2 3 2 17 51 176 +73 2 2 3 2 19 18 58 +74 2 2 3 2 18 19 170 +75 2 2 3 2 48 18 170 +76 2 2 3 2 58 18 176 +77 2 2 3 2 20 19 157 +78 2 2 3 2 19 20 171 +79 2 2 3 2 19 58 157 +80 2 2 3 2 170 19 171 +81 2 2 3 2 20 21 47 +82 2 2 3 2 21 20 60 +83 2 2 3 2 20 47 171 +84 2 2 3 2 60 20 157 +85 2 2 3 2 22 21 177 +86 2 2 3 2 21 22 200 +87 2 2 3 2 47 21 200 +88 2 2 3 2 21 60 177 +89 2 2 3 2 23 22 59 +90 2 2 3 2 22 23 172 +91 2 2 3 2 59 22 177 +92 2 2 3 2 22 172 200 +93 2 2 3 2 23 24 49 +94 2 2 3 2 24 23 167 +95 2 2 3 2 23 49 172 +96 2 2 3 2 23 59 167 +97 2 2 3 2 25 24 50 +98 2 2 3 2 24 25 77 +99 2 2 3 2 49 24 77 +100 2 2 3 2 50 24 167 +101 2 2 3 2 25 26 56 +102 2 2 3 2 26 25 153 +103 2 2 3 2 25 50 153 +104 2 2 3 2 25 56 77 +105 2 2 3 2 27 26 63 +106 2 2 3 2 26 27 161 +107 2 2 3 2 56 26 161 +108 2 2 3 2 63 26 153 +109 2 2 3 2 27 28 67 +110 2 2 3 2 28 27 213 +111 2 2 3 2 27 63 213 +112 2 2 3 2 27 67 161 +113 2 2 3 2 67 28 228 +114 2 2 3 2 28 213 227 +115 2 2 3 2 30 29 65 +116 2 2 3 2 65 29 227 +117 2 2 3 2 31 30 209 +118 2 2 3 2 30 65 209 +119 2 2 3 2 32 31 54 +120 2 2 3 2 54 31 209 +121 2 2 3 2 33 32 208 +122 2 2 3 2 32 54 208 +123 2 2 3 2 34 33 204 +124 2 2 3 2 204 33 208 +125 2 2 3 2 35 34 52 +126 2 2 3 2 52 34 204 +127 2 2 3 2 36 35 205 +128 2 2 3 2 35 52 205 +129 2 2 3 2 37 36 62 +130 2 2 3 2 62 36 205 +131 2 2 3 2 38 37 215 +132 2 2 3 2 37 62 215 +133 2 2 3 2 38 215 228 +134 2 2 3 2 171 47 183 +135 2 2 3 2 47 182 183 +136 2 2 3 2 182 47 200 +137 2 2 3 2 69 48 70 +138 2 2 3 2 70 48 71 +139 2 2 3 2 71 48 170 +140 2 2 3 2 49 77 78 +141 2 2 3 2 49 78 79 +142 2 2 3 2 49 79 172 +143 2 2 3 2 50 145 153 +144 2 2 3 2 145 50 154 +145 2 2 3 2 154 50 167 +146 2 2 3 2 51 152 155 +147 2 2 3 2 51 155 231 +148 2 2 3 2 176 51 231 +149 2 2 3 2 52 204 225 +150 2 2 3 2 205 52 206 +151 2 2 3 2 206 52 225 +152 2 2 3 2 202 53 234 +153 2 2 3 2 53 203 222 +154 2 2 3 2 53 222 234 +155 2 2 3 2 208 54 232 +156 2 2 3 2 54 209 210 +157 2 2 3 2 54 210 232 +158 2 2 3 2 211 55 217 +159 2 2 3 2 217 55 230 +160 2 2 3 2 55 220 230 +161 2 2 3 2 77 56 80 +162 2 2 3 2 80 56 174 +163 2 2 3 2 56 161 174 +164 2 2 3 2 57 69 165 +165 2 2 3 2 162 57 164 +166 2 2 3 2 164 57 165 +167 2 2 3 2 58 147 157 +168 2 2 3 2 147 58 212 +169 2 2 3 2 58 176 212 +170 2 2 3 2 151 59 177 +171 2 2 3 2 59 151 178 +172 2 2 3 2 167 59 178 +173 2 2 3 2 60 146 150 +174 2 2 3 2 146 60 157 +175 2 2 3 2 60 150 177 +176 2 2 3 2 203 61 221 +177 2 2 3 2 61 216 237 +178 2 2 3 2 221 61 237 +179 2 2 3 2 62 205 207 +180 2 2 3 2 62 207 236 +181 2 2 3 2 215 62 236 +182 2 2 3 2 63 141 142 +183 2 2 3 2 141 63 153 +184 2 2 3 2 63 142 213 +185 2 2 3 2 143 64 144 +186 2 2 3 2 64 143 152 +187 2 2 3 2 144 64 235 +188 2 2 3 2 64 214 235 +189 2 2 3 2 209 65 233 +190 2 2 3 2 213 65 227 +191 2 2 3 2 65 213 233 +192 2 2 3 2 66 211 235 +193 2 2 3 2 66 214 226 +194 2 2 3 2 214 66 235 +195 2 2 3 2 161 67 194 +196 2 2 3 2 194 67 236 +197 2 2 3 2 215 67 228 +198 2 2 3 2 67 215 236 +199 2 2 3 2 68 162 163 +200 2 2 3 2 68 163 237 +201 2 2 3 2 68 216 229 +202 2 2 3 2 216 68 237 +203 2 2 3 2 69 70 165 +204 2 2 3 2 70 71 72 +205 2 2 3 2 70 72 73 +206 2 2 3 2 70 73 165 +207 2 2 3 2 72 71 74 +208 2 2 3 2 74 71 75 +209 2 2 3 2 75 71 170 +210 2 2 3 2 73 72 99 +211 2 2 3 2 72 74 186 +212 2 2 3 2 99 72 186 +213 2 2 3 2 73 99 100 +214 2 2 3 2 73 100 173 +215 2 2 3 2 165 73 173 +216 2 2 3 2 74 75 76 +217 2 2 3 2 74 76 98 +218 2 2 3 2 74 98 186 +219 2 2 3 2 76 75 183 +220 2 2 3 2 75 170 171 +221 2 2 3 2 75 171 183 +222 2 2 3 2 98 76 101 +223 2 2 3 2 101 76 181 +224 2 2 3 2 181 76 183 +225 2 2 3 2 78 77 80 +226 2 2 3 2 79 78 198 +227 2 2 3 2 78 80 81 +228 2 2 3 2 78 81 198 +229 2 2 3 2 79 158 159 +230 2 2 3 2 158 79 198 +231 2 2 3 2 79 159 172 +232 2 2 3 2 81 80 82 +233 2 2 3 2 82 80 174 +234 2 2 3 2 81 82 83 +235 2 2 3 2 81 83 84 +236 2 2 3 2 81 84 198 +237 2 2 3 2 83 82 85 +238 2 2 3 2 85 82 131 +239 2 2 3 2 131 82 174 +240 2 2 3 2 84 83 191 +241 2 2 3 2 83 85 86 +242 2 2 3 2 83 86 191 +243 2 2 3 2 160 84 192 +244 2 2 3 2 84 160 198 +245 2 2 3 2 84 191 192 +246 2 2 3 2 86 85 87 +247 2 2 3 2 87 85 224 +248 2 2 3 2 85 131 224 +249 2 2 3 2 86 87 88 +250 2 2 3 2 86 88 89 +251 2 2 3 2 86 89 191 +252 2 2 3 2 88 87 132 +253 2 2 3 2 132 87 225 +254 2 2 3 2 206 87 224 +255 2 2 3 2 87 206 225 +256 2 2 3 2 89 88 90 +257 2 2 3 2 90 88 166 +258 2 2 3 2 88 132 166 +259 2 2 3 2 89 90 91 +260 2 2 3 2 89 91 185 +261 2 2 3 2 89 185 191 +262 2 2 3 2 91 90 92 +263 2 2 3 2 92 90 94 +264 2 2 3 2 94 90 166 +265 2 2 3 2 91 92 93 +266 2 2 3 2 91 93 95 +267 2 2 3 2 91 95 185 +268 2 2 3 2 93 92 193 +269 2 2 3 2 92 94 122 +270 2 2 3 2 92 122 193 +271 2 2 3 2 95 93 96 +272 2 2 3 2 96 93 121 +273 2 2 3 2 121 93 193 +274 2 2 3 2 122 94 125 +275 2 2 3 2 125 94 140 +276 2 2 3 2 140 94 166 +277 2 2 3 2 95 96 97 +278 2 2 3 2 95 97 130 +279 2 2 3 2 95 130 185 +280 2 2 3 2 97 96 103 +281 2 2 3 2 103 96 179 +282 2 2 3 2 96 121 179 +283 2 2 3 2 97 103 136 +284 2 2 3 2 130 97 218 +285 2 2 3 2 97 136 218 +286 2 2 3 2 98 101 102 +287 2 2 3 2 98 102 188 +288 2 2 3 2 186 98 188 +289 2 2 3 2 100 99 107 +290 2 2 3 2 107 99 187 +291 2 2 3 2 99 186 187 +292 2 2 3 2 100 107 108 +293 2 2 3 2 100 108 115 +294 2 2 3 2 100 115 173 +295 2 2 3 2 102 101 104 +296 2 2 3 2 104 101 114 +297 2 2 3 2 114 101 181 +298 2 2 3 2 102 104 105 +299 2 2 3 2 102 105 106 +300 2 2 3 2 102 106 188 +301 2 2 3 2 136 103 148 +302 2 2 3 2 148 103 149 +303 2 2 3 2 149 103 179 +304 2 2 3 2 105 104 184 +305 2 2 3 2 104 114 133 +306 2 2 3 2 104 133 184 +307 2 2 3 2 106 105 109 +308 2 2 3 2 109 105 189 +309 2 2 3 2 105 184 189 +310 2 2 3 2 106 109 110 +311 2 2 3 2 106 110 195 +312 2 2 3 2 188 106 195 +313 2 2 3 2 108 107 111 +314 2 2 3 2 111 107 137 +315 2 2 3 2 137 107 187 +316 2 2 3 2 108 111 112 +317 2 2 3 2 108 112 168 +318 2 2 3 2 115 108 168 +319 2 2 3 2 110 109 116 +320 2 2 3 2 116 109 118 +321 2 2 3 2 118 109 189 +322 2 2 3 2 110 116 117 +323 2 2 3 2 110 117 196 +324 2 2 3 2 195 110 196 +325 2 2 3 2 112 111 113 +326 2 2 3 2 113 111 197 +327 2 2 3 2 111 137 197 +328 2 2 3 2 112 113 119 +329 2 2 3 2 112 119 138 +330 2 2 3 2 112 138 168 +331 2 2 3 2 119 113 120 +332 2 2 3 2 120 113 123 +333 2 2 3 2 123 113 197 +334 2 2 3 2 133 114 134 +335 2 2 3 2 134 114 135 +336 2 2 3 2 135 114 181 +337 2 2 3 2 115 168 169 +338 2 2 3 2 115 169 201 +339 2 2 3 2 173 115 201 +340 2 2 3 2 117 116 190 +341 2 2 3 2 116 118 127 +342 2 2 3 2 116 127 190 +343 2 2 3 2 117 190 223 +344 2 2 3 2 196 117 199 +345 2 2 3 2 199 117 223 +346 2 2 3 2 127 118 128 +347 2 2 3 2 128 118 148 +348 2 2 3 2 148 118 189 +349 2 2 3 2 119 120 175 +350 2 2 3 2 138 119 139 +351 2 2 3 2 139 119 175 +352 2 2 3 2 120 123 124 +353 2 2 3 2 120 124 129 +354 2 2 3 2 120 129 175 +355 2 2 3 2 121 154 178 +356 2 2 3 2 154 121 193 +357 2 2 3 2 121 178 179 +358 2 2 3 2 122 125 141 +359 2 2 3 2 122 141 145 +360 2 2 3 2 122 145 193 +361 2 2 3 2 124 123 126 +362 2 2 3 2 126 123 199 +363 2 2 3 2 123 197 199 +364 2 2 3 2 124 126 155 +365 2 2 3 2 129 124 143 +366 2 2 3 2 143 124 155 +367 2 2 3 2 125 140 210 +368 2 2 3 2 141 125 142 +369 2 2 3 2 142 125 210 +370 2 2 3 2 155 126 156 +371 2 2 3 2 156 126 223 +372 2 2 3 2 126 199 223 +373 2 2 3 2 127 128 146 +374 2 2 3 2 127 146 147 +375 2 2 3 2 127 147 190 +376 2 2 3 2 146 128 150 +377 2 2 3 2 128 148 149 +378 2 2 3 2 128 149 150 +379 2 2 3 2 129 143 144 +380 2 2 3 2 129 144 217 +381 2 2 3 2 175 129 217 +382 2 2 3 2 130 180 192 +383 2 2 3 2 180 130 218 +384 2 2 3 2 185 130 192 +385 2 2 3 2 131 174 194 +386 2 2 3 2 131 194 207 +387 2 2 3 2 131 207 224 +388 2 2 3 2 166 132 219 +389 2 2 3 2 132 204 219 +390 2 2 3 2 204 132 225 +391 2 2 3 2 133 134 180 +392 2 2 3 2 133 180 218 +393 2 2 3 2 184 133 218 +394 2 2 3 2 134 135 158 +395 2 2 3 2 134 158 160 +396 2 2 3 2 134 160 180 +397 2 2 3 2 158 135 159 +398 2 2 3 2 159 135 182 +399 2 2 3 2 135 181 182 +400 2 2 3 2 136 148 189 +401 2 2 3 2 184 136 189 +402 2 2 3 2 136 184 218 +403 2 2 3 2 137 187 195 +404 2 2 3 2 137 195 196 +405 2 2 3 2 137 196 197 +406 2 2 3 2 138 139 234 +407 2 2 3 2 168 138 222 +408 2 2 3 2 222 138 234 +409 2 2 3 2 139 175 230 +410 2 2 3 2 202 139 220 +411 2 2 3 2 139 202 234 +412 2 2 3 2 220 139 230 +413 2 2 3 2 140 166 219 +414 2 2 3 2 210 140 232 +415 2 2 3 2 140 219 232 +416 2 2 3 2 145 141 153 +417 2 2 3 2 142 210 233 +418 2 2 3 2 213 142 233 +419 2 2 3 2 152 143 155 +420 2 2 3 2 144 211 217 +421 2 2 3 2 211 144 235 +422 2 2 3 2 145 154 193 +423 2 2 3 2 147 146 157 +424 2 2 3 2 190 147 238 +425 2 2 3 2 147 212 238 +426 2 2 3 2 150 149 151 +427 2 2 3 2 151 149 179 +428 2 2 3 2 150 151 177 +429 2 2 3 2 178 151 179 +430 2 2 3 2 154 167 178 +431 2 2 3 2 155 156 231 +432 2 2 3 2 156 212 231 +433 2 2 3 2 212 156 238 +434 2 2 3 2 156 223 238 +435 2 2 3 2 160 158 198 +436 2 2 3 2 172 159 200 +437 2 2 3 2 159 182 200 +438 2 2 3 2 180 160 192 +439 2 2 3 2 174 161 194 +440 2 2 3 2 163 162 164 +441 2 2 3 2 163 164 201 +442 2 2 3 2 163 201 221 +443 2 2 3 2 163 221 237 +444 2 2 3 2 164 165 173 +445 2 2 3 2 164 173 201 +446 2 2 3 2 169 168 222 +447 2 2 3 2 201 169 221 +448 2 2 3 2 169 203 221 +449 2 2 3 2 203 169 222 +450 2 2 3 2 175 217 230 +451 2 2 3 2 212 176 231 +452 2 2 3 2 182 181 183 +453 2 2 3 2 191 185 192 +454 2 2 3 2 187 186 188 +455 2 2 3 2 187 188 195 +456 2 2 3 2 223 190 238 +457 2 2 3 2 207 194 236 +458 2 2 3 2 197 196 199 +459 2 2 3 2 204 208 219 +460 2 2 3 2 205 206 207 +461 2 2 3 2 207 206 224 +462 2 2 3 2 219 208 232 +463 2 2 3 2 210 209 233 +464 2 2 2 3 29 244 2 +465 2 2 2 3 2 244 38 +466 2 2 2 3 30 240 29 +467 2 2 2 3 240 244 29 +468 2 2 2 3 31 246 30 +469 2 2 2 3 30 246 240 +470 2 2 2 3 32 246 31 +471 2 2 2 3 33 241 32 +472 2 2 2 3 241 246 32 +473 2 2 2 3 34 245 33 +474 2 2 2 3 33 245 241 +475 2 2 2 3 35 245 34 +476 2 2 2 3 36 239 35 +477 2 2 2 3 239 245 35 +478 2 2 2 3 37 242 36 +479 2 2 2 3 36 242 239 +480 2 2 2 3 38 242 37 +481 2 2 2 3 38 244 242 +482 2 2 2 3 242 243 239 +483 2 2 2 3 243 245 239 +484 2 2 2 3 243 244 240 +485 2 2 2 3 240 246 243 +486 2 2 2 3 241 245 243 +487 2 2 2 3 243 246 241 +488 2 2 2 3 242 244 243 +489 4 2 4 1 140 248 125 254 +490 4 2 4 1 72 249 71 262 +491 4 2 4 1 72 255 249 262 +492 4 2 4 1 248 254 166 275 +493 4 2 4 1 70 72 71 262 +494 4 2 4 1 47 182 200 267 +495 4 2 4 1 166 248 140 254 +496 4 2 4 1 47 250 182 267 +497 4 2 4 1 70 72 262 271 +498 4 2 4 1 210 140 125 254 +499 4 2 4 1 250 260 182 267 +500 4 2 4 1 125 248 142 254 +501 4 2 4 1 182 260 200 267 +502 4 2 4 1 158 253 160 264 +503 4 2 4 1 255 262 72 271 +504 4 2 4 1 200 159 253 260 +505 4 2 4 1 84 251 198 261 +506 4 2 4 1 94 166 90 248 +507 4 2 4 1 186 249 72 255 +508 4 2 4 1 158 160 198 264 +509 4 2 4 1 166 88 90 248 +510 4 2 4 1 102 188 257 258 +511 4 2 4 1 198 261 251 264 +512 4 2 4 1 188 186 187 249 +513 4 2 4 1 249 257 188 258 +514 4 2 4 1 160 253 261 264 +515 4 2 4 1 74 72 186 249 +516 4 2 4 1 195 188 187 249 +517 4 2 4 1 74 71 72 249 +518 4 2 4 1 186 188 98 249 +519 4 2 4 1 88 90 248 259 +520 4 2 4 1 200 182 159 260 +521 4 2 4 1 195 106 188 249 +522 4 2 4 1 195 110 106 249 +523 4 2 4 1 131 174 82 248 +524 4 2 4 1 161 56 174 248 +525 4 2 4 1 186 98 74 258 +526 4 2 4 1 48 71 170 249 +527 4 2 4 1 186 249 98 258 +528 4 2 4 1 160 261 198 264 +529 4 2 4 1 189 250 148 260 +530 4 2 4 1 82 248 174 259 +531 4 2 4 1 108 111 107 247 +532 4 2 4 1 108 107 100 247 +533 4 2 4 1 186 74 249 258 +534 4 2 4 1 98 249 188 258 +535 4 2 4 1 131 248 82 259 +536 4 2 4 1 186 187 249 255 +537 4 2 4 1 188 249 106 257 +538 4 2 4 1 200 260 253 267 +539 4 2 4 1 187 195 249 255 +540 4 2 4 1 185 89 191 259 +541 4 2 4 1 21 47 200 267 +542 4 2 4 1 110 106 249 257 +543 4 2 4 1 102 188 106 257 +544 4 2 4 1 71 249 48 262 +545 4 2 4 1 90 94 248 263 +546 4 2 4 1 123 113 120 247 +547 4 2 4 1 103 253 136 267 +548 4 2 4 1 210 125 142 254 +549 4 2 4 1 142 254 248 266 +550 4 2 4 1 160 84 198 261 +551 4 2 4 1 51 247 262 273 +552 4 2 4 1 121 251 261 264 +553 4 2 4 1 100 115 108 247 +554 4 2 4 1 48 249 170 262 +555 4 2 4 1 111 107 247 255 +556 4 2 4 1 107 100 247 255 +557 4 2 4 1 253 260 136 267 +558 4 2 4 1 104 102 105 250 +559 4 2 4 1 104 101 102 250 +560 4 2 4 1 131 85 248 259 +561 4 2 4 1 90 259 91 263 +562 4 2 4 1 101 102 250 258 +563 4 2 4 1 102 98 188 258 +564 4 2 4 1 131 82 85 259 +565 4 2 4 1 100 173 115 247 +566 4 2 4 1 102 105 250 257 +567 4 2 4 1 174 248 56 268 +568 4 2 4 1 201 221 169 265 +569 4 2 4 1 93 92 91 251 +570 4 2 4 1 148 260 250 267 +571 4 2 4 1 185 91 89 251 +572 4 2 4 1 90 248 259 263 +573 4 2 4 1 178 261 253 264 +574 4 2 4 1 90 89 91 259 +575 4 2 4 1 105 184 104 250 +576 4 2 4 1 219 166 254 275 +577 4 2 4 1 108 247 115 256 +578 4 2 4 1 102 257 250 258 +579 4 2 4 1 174 259 248 268 +580 4 2 4 1 181 182 183 250 +581 4 2 4 1 115 201 169 265 +582 4 2 4 1 185 251 89 259 +583 4 2 4 1 183 182 47 250 +584 4 2 4 1 89 251 91 259 +585 4 2 4 1 252 256 169 265 +586 4 2 4 1 142 254 266 269 +587 4 2 4 1 185 191 251 259 +588 4 2 4 1 120 247 113 256 +589 4 2 4 1 170 249 18 262 +590 4 2 4 1 115 169 256 265 +591 4 2 4 1 115 247 173 265 +592 4 2 4 1 78 198 81 251 +593 4 2 4 1 94 125 140 248 +594 4 2 4 1 70 71 48 262 +595 4 2 4 1 248 263 26 268 +596 4 2 4 1 182 250 181 260 +597 4 2 4 1 221 252 169 265 +598 4 2 4 1 47 171 183 250 +599 4 2 4 1 91 259 251 263 +600 4 2 4 1 170 249 71 258 +601 4 2 4 1 219 166 140 254 +602 4 2 4 1 135 158 159 253 +603 4 2 4 1 166 94 140 248 +604 4 2 4 1 198 251 78 264 +605 4 2 4 1 51 262 247 271 +606 4 2 4 1 192 185 191 251 +607 4 2 4 1 88 248 166 275 +608 4 2 4 1 198 84 81 251 +609 4 2 4 1 189 148 136 260 +610 4 2 4 1 135 134 158 260 +611 4 2 4 1 108 111 247 256 +612 4 2 4 1 103 136 148 267 +613 4 2 4 1 79 158 198 264 +614 4 2 4 1 21 250 47 267 +615 4 2 4 1 108 112 111 256 +616 4 2 4 1 183 250 171 258 +617 4 2 4 1 136 260 148 267 +618 4 2 4 1 71 249 74 258 +619 4 2 4 1 92 251 93 263 +620 4 2 4 1 104 250 184 260 +621 4 2 4 1 92 91 251 263 +622 4 2 4 1 200 253 22 267 +623 4 2 4 1 127 250 128 257 +624 4 2 4 1 88 259 248 275 +625 4 2 4 1 135 158 253 260 +626 4 2 4 1 125 248 94 263 +627 4 2 4 1 22 200 172 253 +628 4 2 4 1 179 253 178 261 +629 4 2 4 1 115 256 247 265 +630 4 2 4 1 134 160 158 253 +631 4 2 4 1 97 218 136 253 +632 4 2 4 1 161 26 56 248 +633 4 2 4 1 97 253 103 261 +634 4 2 4 1 135 253 159 260 +635 4 2 4 1 208 54 241 254 +636 4 2 4 1 113 247 111 256 +637 4 2 4 1 142 233 254 269 +638 4 2 4 1 79 159 158 253 +639 4 2 4 1 134 253 158 260 +640 4 2 4 1 48 170 18 262 +641 4 2 4 1 79 172 159 253 +642 4 2 4 1 192 191 84 251 +643 4 2 4 1 200 159 172 253 +644 4 2 4 1 92 90 91 263 +645 4 2 4 1 167 24 251 264 +646 4 2 4 1 21 20 47 250 +647 4 2 4 1 97 136 103 253 +648 4 2 4 1 105 189 184 250 +649 4 2 4 1 185 251 192 261 +650 4 2 4 1 79 253 158 264 +651 4 2 4 1 82 259 174 268 +652 4 2 4 1 247 255 100 271 +653 4 2 4 1 121 154 251 264 +654 4 2 4 1 85 131 248 275 +655 4 2 4 1 96 103 253 261 +656 4 2 4 1 136 253 218 260 +657 4 2 4 1 181 101 250 258 +658 4 2 4 1 189 136 184 260 +659 4 2 4 1 91 93 251 261 +660 4 2 4 1 54 209 246 254 +661 4 2 4 1 101 181 250 260 +662 4 2 4 1 241 54 246 254 +663 4 2 4 1 113 247 123 273 +664 4 2 4 1 111 255 247 273 +665 4 2 4 1 134 180 160 253 +666 4 2 4 1 161 248 174 266 +667 4 2 4 1 110 249 195 278 +668 4 2 4 1 112 113 111 256 +669 4 2 4 1 249 255 195 278 +670 4 2 4 1 172 253 79 264 +671 4 2 4 1 149 253 103 267 +672 4 2 4 1 180 160 253 261 +673 4 2 4 1 96 97 103 261 +674 4 2 4 1 218 253 97 261 +675 4 2 4 1 128 148 118 250 +676 4 2 4 1 189 184 250 260 +677 4 2 4 1 209 246 254 269 +678 4 2 4 1 182 135 159 260 +679 4 2 4 1 170 18 249 272 +680 4 2 4 1 101 114 181 260 +681 4 2 4 1 88 87 259 275 +682 4 2 4 1 104 101 250 260 +683 4 2 4 1 173 247 100 271 +684 4 2 4 1 56 248 26 268 +685 4 2 4 1 47 20 171 250 +686 4 2 4 1 78 251 77 264 +687 4 2 4 1 121 261 178 264 +688 4 2 4 1 192 251 84 261 +689 4 2 4 1 91 251 185 261 +690 4 2 4 1 153 26 248 263 +691 4 2 4 1 20 171 250 258 +692 4 2 4 1 127 128 118 257 +693 4 2 4 1 181 250 183 258 +694 4 2 4 1 113 111 247 273 +695 4 2 4 1 217 270 252 274 +696 4 2 4 1 218 180 253 261 +697 4 2 4 1 84 81 251 259 +698 4 2 4 1 128 148 250 267 +699 4 2 4 1 118 148 189 250 +700 4 2 4 1 91 95 93 261 +701 4 2 4 1 77 251 24 264 +702 4 2 4 1 181 76 101 258 +703 4 2 4 1 245 52 254 276 +704 4 2 4 1 160 192 84 261 +705 4 2 4 1 78 77 251 268 +706 4 2 4 1 128 250 118 257 +707 4 2 4 1 174 131 194 248 +708 4 2 4 1 24 251 77 268 +709 4 2 4 1 54 210 209 254 +710 4 2 4 1 115 169 168 256 +711 4 2 4 1 14 252 68 265 +712 4 2 4 1 110 117 257 278 +713 4 2 4 1 84 251 191 259 +714 4 2 4 1 153 26 263 268 +715 4 2 4 1 189 250 105 257 +716 4 2 4 1 51 155 247 273 +717 4 2 4 1 149 179 103 253 +718 4 2 4 1 20 258 250 272 +719 4 2 4 1 75 170 71 258 +720 4 2 4 1 209 254 233 269 +721 4 2 4 1 218 253 180 260 +722 4 2 4 1 51 262 155 273 +723 4 2 4 1 22 253 172 264 +724 4 2 4 1 104 114 101 260 +725 4 2 4 1 149 103 148 267 +726 4 2 4 1 117 190 257 278 +727 4 2 4 1 123 120 124 247 +728 4 2 4 1 96 103 179 253 +729 4 2 4 1 20 171 258 272 +730 4 2 4 1 165 57 265 271 +731 4 2 4 1 179 96 253 261 +732 4 2 4 1 49 78 77 264 +733 4 2 4 1 249 257 190 278 +734 4 2 4 1 14 270 252 277 +735 4 2 4 1 110 257 249 278 +736 4 2 4 1 146 250 127 257 +737 4 2 4 1 174 248 194 266 +738 4 2 4 1 124 247 120 256 +739 4 2 4 1 121 251 93 261 +740 4 2 4 1 163 252 221 265 +741 4 2 4 1 241 204 208 254 +742 4 2 4 1 212 262 249 278 +743 4 2 4 1 169 252 222 256 +744 4 2 4 1 212 238 249 272 +745 4 2 4 1 127 146 128 250 +746 4 2 4 1 134 180 253 260 +747 4 2 4 1 249 258 170 272 +748 4 2 4 1 193 92 93 263 +749 4 2 4 1 88 87 86 259 +750 4 2 4 1 51 247 16 271 +751 4 2 4 1 190 249 238 272 +752 4 2 4 1 218 130 180 261 +753 4 2 4 1 210 233 209 254 +754 4 2 4 1 84 83 81 259 +755 4 2 4 1 173 165 164 265 +756 4 2 4 1 252 270 217 277 +757 4 2 4 1 78 251 81 268 +758 4 2 4 1 162 14 68 265 +759 4 2 4 1 156 231 262 273 +760 4 2 4 1 179 178 121 261 +761 4 2 4 1 18 249 58 262 +762 4 2 4 1 138 256 252 274 +763 4 2 4 1 91 185 95 261 +764 4 2 4 1 117 190 116 257 +765 4 2 4 1 241 245 204 254 +766 4 2 4 1 68 252 14 270 +767 4 2 4 1 218 97 130 261 +768 4 2 4 1 85 248 259 275 +769 4 2 4 1 20 250 157 272 +770 4 2 4 1 26 248 161 266 +771 4 2 4 1 21 200 22 267 +772 4 2 4 1 121 178 154 264 +773 4 2 4 1 122 125 94 263 +774 4 2 4 1 111 197 137 273 +775 4 2 4 1 181 183 76 258 +776 4 2 4 1 163 221 252 279 +777 4 2 4 1 211 270 217 274 +778 4 2 4 1 58 249 212 262 +779 4 2 4 1 149 179 253 267 +780 4 2 4 1 167 251 154 264 +781 4 2 4 1 50 167 24 251 +782 4 2 4 1 138 139 256 274 +783 4 2 4 1 55 46 270 274 +784 4 2 4 1 75 71 74 258 +785 4 2 4 1 201 163 221 265 +786 4 2 4 1 175 256 252 277 +787 4 2 4 1 193 93 251 263 +788 4 2 4 1 85 259 87 275 +789 4 2 4 1 109 189 105 257 +790 4 2 4 1 21 60 20 250 +791 4 2 4 1 163 237 221 279 +792 4 2 4 1 110 117 116 257 +793 4 2 4 1 21 60 250 267 +794 4 2 4 1 245 52 204 254 +795 4 2 4 1 16 57 247 265 +796 4 2 4 1 49 77 24 264 +797 4 2 4 1 247 265 57 271 +798 4 2 4 1 190 257 249 272 +799 4 2 4 1 241 246 243 254 +800 4 2 4 1 111 137 255 273 +801 4 2 4 1 118 250 189 257 +802 4 2 4 1 219 132 166 275 +803 4 2 4 1 222 252 169 279 +804 4 2 4 1 124 247 256 277 +805 4 2 4 1 68 252 163 265 +806 4 2 4 1 142 233 210 254 +807 4 2 4 1 232 54 208 254 +808 4 2 4 1 169 252 221 279 +809 4 2 4 1 252 265 14 277 +810 4 2 4 1 175 252 217 277 +811 4 2 4 1 58 249 18 272 +812 4 2 4 1 59 253 22 264 +813 4 2 4 1 22 253 59 267 +814 4 2 4 1 124 256 120 277 +815 4 2 4 1 102 106 105 257 +816 4 2 4 1 152 265 247 277 +817 4 2 4 1 186 72 99 255 +818 4 2 4 1 67 215 228 269 +819 4 2 4 1 123 247 124 273 +820 4 2 4 1 22 172 23 264 +821 4 2 4 1 132 88 166 275 +822 4 2 4 1 73 173 100 271 +823 4 2 4 1 101 98 102 258 +824 4 2 4 1 67 215 269 276 +825 4 2 4 1 251 259 81 268 +826 4 2 4 1 250 257 146 272 +827 4 2 4 1 70 262 48 271 +828 4 2 4 1 84 191 83 259 +829 4 2 4 1 155 262 231 273 +830 4 2 4 1 52 225 254 276 +831 4 2 4 1 142 266 213 269 +832 4 2 4 1 222 274 252 279 +833 4 2 4 1 133 218 180 260 +834 4 2 4 1 168 169 222 256 +835 4 2 4 1 63 142 248 266 +836 4 2 4 1 243 245 241 254 +837 4 2 4 1 222 252 138 256 +838 4 2 4 1 137 196 195 255 +839 4 2 4 1 222 53 274 279 +840 4 2 4 1 141 248 125 263 +841 4 2 4 1 88 89 90 259 +842 4 2 4 1 15 247 152 265 +843 4 2 4 1 238 249 190 278 +844 4 2 4 1 212 249 58 272 +845 4 2 4 1 16 247 57 271 +846 4 2 4 1 99 72 73 271 +847 4 2 4 1 140 210 232 254 +848 4 2 4 1 212 249 238 278 +849 4 2 4 1 156 273 262 278 +850 4 2 4 1 85 86 87 259 +851 4 2 4 1 157 250 146 272 +852 4 2 4 1 64 214 14 270 +853 4 2 4 1 153 248 141 263 +854 4 2 4 1 68 252 270 279 +855 4 2 4 1 119 139 175 256 +856 4 2 4 1 232 210 54 254 +857 4 2 4 1 113 197 111 273 +858 4 2 4 1 196 195 255 278 +859 4 2 4 1 111 137 107 255 +860 4 2 4 1 67 269 266 276 +861 4 2 4 1 179 121 96 261 +862 4 2 4 1 142 213 233 269 +863 4 2 4 1 211 55 270 274 +864 4 2 4 1 165 57 164 265 +865 4 2 4 1 93 121 193 251 +866 4 2 4 1 59 22 23 264 +867 4 2 4 1 107 99 100 255 +868 4 2 4 1 99 255 72 271 +869 4 2 4 1 20 60 157 250 +870 4 2 4 1 68 270 229 279 +871 4 2 4 1 178 253 59 264 +872 4 2 4 1 16 247 15 265 +873 4 2 4 1 152 16 51 247 +874 4 2 4 1 246 243 254 269 +875 4 2 4 1 197 196 137 273 +876 4 2 4 1 17 262 16 271 +877 4 2 4 1 115 173 201 265 +878 4 2 4 1 146 128 250 267 +879 4 2 4 1 146 257 127 272 +880 4 2 4 1 242 269 215 276 +881 4 2 4 1 108 115 168 256 +882 4 2 4 1 153 26 63 248 +883 4 2 4 1 196 255 137 273 +884 4 2 4 1 135 182 181 260 +885 4 2 4 1 51 231 155 262 +886 4 2 4 1 50 251 24 268 +887 4 2 4 1 152 51 155 247 +888 4 2 4 1 68 14 13 270 +889 4 2 4 1 134 133 180 260 +890 4 2 4 1 228 215 242 269 +891 4 2 4 1 90 92 94 263 +892 4 2 4 1 219 140 232 254 +893 4 2 4 1 64 270 14 277 +894 4 2 4 1 51 16 262 271 +895 4 2 4 1 79 198 78 264 +896 4 2 4 1 175 139 230 274 +897 4 2 4 1 211 217 55 274 +898 4 2 4 1 50 154 167 251 +899 4 2 4 1 22 59 177 267 +900 4 2 4 1 245 254 243 276 +901 4 2 4 1 162 68 163 265 +902 4 2 4 1 225 275 254 276 +903 4 2 4 1 247 271 262 273 +904 4 2 4 1 154 193 251 263 +905 4 2 4 1 109 118 189 257 +906 4 2 4 1 204 52 225 254 +907 4 2 4 1 16 152 15 247 +908 4 2 4 1 55 46 211 270 +909 4 2 4 1 217 230 55 274 +910 4 2 4 1 44 229 270 279 +911 4 2 4 1 60 146 157 250 +912 4 2 4 1 154 251 50 263 +913 4 2 4 1 63 248 26 266 +914 4 2 4 1 151 253 179 267 +915 4 2 4 1 16 15 57 265 +916 4 2 4 1 178 167 154 264 +917 4 2 4 1 58 212 176 262 +918 4 2 4 1 151 59 253 267 +919 4 2 4 1 255 273 196 278 +920 4 2 4 1 186 99 187 255 +921 4 2 4 1 50 263 251 268 +922 4 2 4 1 170 19 18 272 +923 4 2 4 1 155 124 247 273 +924 4 2 4 1 187 137 195 255 +925 4 2 4 1 179 151 178 253 +926 4 2 4 1 141 142 125 248 +927 4 2 4 1 17 51 16 262 +928 4 2 4 1 153 63 141 248 +929 4 2 4 1 156 155 231 273 +930 4 2 4 1 196 110 195 278 +931 4 2 4 1 152 247 143 277 +932 4 2 4 1 136 218 184 260 +933 4 2 4 1 121 154 193 251 +934 4 2 4 1 81 259 82 268 +935 4 2 4 1 39 45 53 279 +936 4 2 4 1 60 146 250 267 +937 4 2 4 1 67 236 215 276 +938 4 2 4 1 119 138 139 256 +939 4 2 4 1 124 120 129 277 +940 4 2 4 1 64 235 214 270 +941 4 2 4 1 229 68 13 270 +942 4 2 4 1 222 169 203 279 +943 4 2 4 1 151 59 178 253 +944 4 2 4 1 222 203 53 279 +945 4 2 4 1 180 192 160 261 +946 4 2 4 1 149 151 179 267 +947 4 2 4 1 18 58 176 262 +948 4 2 4 1 209 240 246 269 +949 4 2 4 1 129 175 217 277 +950 4 2 4 1 152 155 143 247 +951 4 2 4 1 234 222 53 274 +952 4 2 4 1 266 275 207 276 +953 4 2 4 1 128 149 148 267 +954 4 2 4 1 161 174 194 266 +955 4 2 4 1 67 266 236 276 +956 4 2 4 1 80 81 82 268 +957 4 2 4 1 194 131 207 275 +958 4 2 4 1 45 274 53 279 +959 4 2 4 1 15 265 152 277 +960 4 2 4 1 85 224 131 275 +961 4 2 4 1 124 143 247 277 +962 4 2 4 1 242 244 228 269 +963 4 2 4 1 46 43 270 274 +964 4 2 4 1 155 124 143 247 +965 4 2 4 1 194 207 266 275 +966 4 2 4 1 204 225 219 254 +967 4 2 4 1 262 271 255 273 +968 4 2 4 1 64 235 270 277 +969 4 2 4 1 80 82 174 268 +970 4 2 4 1 153 263 50 268 +971 4 2 4 1 146 150 128 267 +972 4 2 4 1 106 109 105 257 +973 4 2 4 1 225 206 275 276 +974 4 2 4 1 122 141 125 263 +975 4 2 4 1 232 208 219 254 +976 4 2 4 1 101 76 98 258 +977 4 2 4 1 78 81 80 268 +978 4 2 4 1 190 147 127 257 +979 4 2 4 1 207 236 266 276 +980 4 2 4 1 141 63 142 248 +981 4 2 4 1 14 214 13 270 +982 4 2 4 1 15 14 265 277 +983 4 2 4 1 88 86 89 259 +984 4 2 4 1 212 156 231 262 +985 4 2 4 1 44 42 229 279 +986 4 2 4 1 52 206 225 276 +987 4 2 4 1 153 25 26 268 +988 4 2 4 1 190 147 257 272 +989 4 2 4 1 96 121 93 261 +990 4 2 4 1 75 171 170 258 +991 4 2 4 1 133 184 218 260 +992 4 2 4 1 127 257 147 272 +993 4 2 4 1 208 204 219 254 +994 4 2 4 1 108 168 112 256 +995 4 2 4 1 135 181 114 260 +996 4 2 4 1 216 68 229 279 +997 4 2 4 1 81 83 82 259 +998 4 2 4 1 245 239 52 276 +999 4 2 4 1 20 19 171 272 +1000 4 2 4 1 216 229 42 279 +1001 4 2 4 1 209 65 240 269 +1002 4 2 4 1 79 78 49 264 +1003 4 2 4 1 63 213 142 266 +1004 4 2 4 1 21 22 177 267 +1005 4 2 4 1 270 274 43 279 +1006 4 2 4 1 120 119 175 256 +1007 4 2 4 1 168 222 138 256 +1008 4 2 4 1 180 130 192 261 +1009 4 2 4 1 254 269 243 276 +1010 4 2 4 1 73 165 173 271 +1011 4 2 4 1 96 93 95 261 +1012 4 2 4 1 212 231 176 262 +1013 4 2 4 1 69 17 16 271 +1014 4 2 4 1 72 70 73 271 +1015 4 2 4 1 92 122 94 263 +1016 4 2 4 1 203 39 53 279 +1017 4 2 4 1 151 177 59 267 +1018 4 2 4 1 153 50 25 268 +1019 4 2 4 1 113 123 197 273 +1020 4 2 4 1 169 221 203 279 +1021 4 2 4 1 156 223 273 278 +1022 4 2 4 1 40 211 46 270 +1023 4 2 4 1 154 50 145 263 +1024 4 2 4 1 40 66 211 270 +1025 4 2 4 1 242 243 269 276 +1026 4 2 4 1 16 57 69 271 +1027 4 2 4 1 119 120 113 256 +1028 4 2 4 1 239 205 52 276 +1029 4 2 4 1 167 178 59 264 +1030 4 2 4 1 197 199 196 273 +1031 4 2 4 1 154 145 193 263 +1032 4 2 4 1 245 243 239 276 +1033 4 2 4 1 234 139 138 274 +1034 4 2 4 1 173 164 201 265 +1035 4 2 4 1 50 24 25 268 +1036 4 2 4 1 46 41 43 274 +1037 4 2 4 1 27 266 28 269 +1038 4 2 4 1 60 150 146 267 +1039 4 2 4 1 247 255 271 273 +1040 4 2 4 1 246 240 243 269 +1041 4 2 4 1 194 207 236 266 +1042 4 2 4 1 156 126 155 273 +1043 4 2 4 1 190 127 116 257 +1044 4 2 4 1 44 270 43 279 +1045 4 2 4 1 199 196 273 278 +1046 4 2 4 1 55 41 46 274 +1047 4 2 4 1 229 13 44 270 +1048 4 2 4 1 156 223 126 273 +1049 4 2 4 1 133 104 184 260 +1050 4 2 4 1 110 109 106 257 +1051 4 2 4 1 63 26 27 266 +1052 4 2 4 1 68 216 237 279 +1053 4 2 4 1 26 161 27 266 +1054 4 2 4 1 146 127 147 272 +1055 4 2 4 1 187 99 107 255 +1056 4 2 4 1 40 46 43 270 +1057 4 2 4 1 137 187 107 255 +1058 4 2 4 1 98 76 74 258 +1059 4 2 4 1 132 87 88 275 +1060 4 2 4 1 254 275 266 276 +1061 4 2 4 1 220 41 55 274 +1062 4 2 4 1 248 266 254 275 +1063 4 2 4 1 167 59 23 264 +1064 4 2 4 1 183 171 75 258 +1065 4 2 4 1 162 15 14 265 +1066 4 2 4 1 196 117 110 278 +1067 4 2 4 1 165 69 57 271 +1068 4 2 4 1 228 28 67 269 +1069 4 2 4 1 119 113 112 256 +1070 4 2 4 1 89 86 191 259 +1071 4 2 4 1 155 126 124 273 +1072 4 2 4 1 259 263 248 268 +1073 4 2 4 1 209 233 65 269 +1074 4 2 4 1 24 77 25 268 +1075 4 2 4 1 208 241 33 204 +1076 4 2 4 1 244 242 243 269 +1077 4 2 4 1 80 174 56 268 +1078 4 2 4 1 78 80 77 268 +1079 4 2 4 1 70 48 69 271 +1080 4 2 4 1 205 206 52 276 +1081 4 2 4 1 49 172 79 264 +1082 4 2 4 1 28 266 67 269 +1083 4 2 4 1 167 23 24 264 +1084 4 2 4 1 15 64 14 277 +1085 4 2 4 1 114 134 135 260 +1086 4 2 4 1 66 4 40 211 +1087 4 2 4 1 205 239 52 35 +1088 4 2 4 1 19 58 18 272 +1089 4 2 4 1 266 269 254 276 +1090 4 2 4 1 18 17 48 262 +1091 4 2 4 1 131 224 207 275 +1092 4 2 4 1 128 150 149 267 +1093 4 2 4 1 133 114 104 260 +1094 4 2 4 1 241 33 204 245 +1095 4 2 4 1 96 95 97 261 +1096 4 2 4 1 61 39 203 279 +1097 4 2 4 1 262 273 255 278 +1098 4 2 4 1 252 274 270 279 +1099 4 2 4 1 82 83 85 259 +1100 4 2 4 1 130 185 192 261 +1101 4 2 4 1 116 127 118 257 +1102 4 2 4 1 211 4 40 46 +1103 4 2 4 1 44 43 42 279 +1104 4 2 4 1 110 116 109 257 +1105 4 2 4 1 32 241 208 54 +1106 4 2 4 1 27 213 266 269 +1107 4 2 4 1 76 183 75 258 +1108 4 2 4 1 85 87 224 275 +1109 4 2 4 1 76 75 74 258 +1110 4 2 4 1 27 28 213 269 +1111 4 2 4 1 207 275 206 276 +1112 4 2 4 1 52 239 245 35 +1113 4 2 4 1 223 190 117 278 +1114 4 2 4 1 191 86 83 259 +1115 4 2 4 1 250 258 257 272 +1116 4 2 4 1 114 133 134 260 +1117 4 2 4 1 25 56 26 268 +1118 4 2 4 1 130 95 185 261 +1119 4 2 4 1 23 49 24 264 +1120 4 2 4 1 39 53 9 203 +1121 4 2 4 1 153 145 50 263 +1122 4 2 4 1 247 265 256 277 +1123 4 2 4 1 95 130 97 261 +1124 4 2 4 1 27 67 28 266 +1125 4 2 4 1 49 23 172 264 +1126 4 2 4 1 249 262 255 278 +1127 4 2 4 1 10 39 203 61 +1128 4 2 4 1 204 132 219 225 +1129 4 2 4 1 168 138 112 256 +1130 4 2 4 1 129 217 144 277 +1131 4 2 4 1 18 176 17 262 +1132 4 2 4 1 20 157 19 272 +1133 4 2 4 1 61 42 39 279 +1134 4 2 4 1 53 45 202 274 +1135 4 2 4 1 199 273 223 278 +1136 4 2 4 1 62 205 239 276 +1137 4 2 4 1 83 86 85 259 +1138 4 2 4 1 176 51 17 262 +1139 4 2 4 1 124 129 143 277 +1140 4 2 4 1 44 13 226 270 +1141 4 2 4 1 63 27 213 266 +1142 4 2 4 1 109 116 118 257 +1143 4 2 4 1 228 244 28 269 +1144 4 2 4 1 215 62 242 276 +1145 4 2 4 1 223 238 190 278 +1146 4 2 4 1 122 92 193 263 +1147 4 2 4 1 45 53 9 39 +1148 4 2 4 1 54 32 241 246 +1149 4 2 4 1 238 223 156 278 +1150 4 2 4 1 226 66 40 270 +1151 4 2 4 1 199 126 223 273 +1152 4 2 4 1 138 119 112 256 +1153 4 2 4 1 43 41 45 274 +1154 4 2 4 1 236 62 215 276 +1155 4 2 4 1 257 258 249 272 +1156 4 2 4 1 220 202 41 274 +1157 4 2 4 1 176 231 51 262 +1158 4 2 4 1 6 55 220 41 +1159 4 2 4 1 30 209 65 240 +1160 4 2 4 1 44 12 229 42 +1161 4 2 4 1 228 244 242 38 +1162 4 2 4 1 21 177 60 267 +1163 4 2 4 1 226 40 44 270 +1164 4 2 4 1 230 220 55 274 +1165 4 2 4 1 205 36 62 239 +1166 4 2 4 1 201 164 163 265 +1167 4 2 4 1 15 152 64 277 +1168 4 2 4 1 256 265 252 277 +1169 4 2 4 1 12 216 229 42 +1170 4 2 4 1 147 212 58 272 +1171 4 2 4 1 38 242 228 215 +1172 4 2 4 1 251 263 259 268 +1173 4 2 4 1 162 57 15 265 +1174 4 2 4 1 67 194 236 266 +1175 4 2 4 1 123 124 126 273 +1176 4 2 4 1 44 40 43 270 +1177 4 2 4 1 162 164 57 265 +1178 4 2 4 1 10 39 61 42 +1179 4 2 4 1 240 227 244 269 +1180 4 2 4 1 242 239 243 276 +1181 4 2 4 1 242 62 239 276 +1182 4 2 4 1 235 211 66 270 +1183 4 2 4 1 7 220 202 41 +1184 4 2 4 1 207 206 205 276 +1185 4 2 4 1 209 30 246 240 +1186 4 2 4 1 61 216 42 279 +1187 4 2 4 1 227 240 65 269 +1188 4 2 4 1 28 244 227 269 +1189 4 2 4 1 202 45 41 274 +1190 4 2 4 1 157 146 147 272 +1191 4 2 4 1 224 206 207 275 +1192 4 2 4 1 149 150 151 267 +1193 4 2 4 1 235 64 144 277 +1194 4 2 4 1 53 202 234 274 +1195 4 2 4 1 204 245 34 52 +1196 4 2 4 1 44 13 1 226 +1197 4 2 4 1 213 65 233 269 +1198 4 2 4 1 226 3 40 66 +1199 4 2 4 1 199 197 123 273 +1200 4 2 4 1 55 6 46 41 +1201 4 2 4 1 73 70 165 271 +1202 4 2 4 1 199 117 196 278 +1203 4 2 4 1 229 13 1 44 +1204 4 2 4 1 61 237 216 279 +1205 4 2 4 1 240 244 243 269 +1206 4 2 4 1 161 67 27 266 +1207 4 2 4 1 28 2 227 244 +1208 4 2 4 1 161 194 67 266 +1209 4 2 4 1 145 153 141 263 +1210 4 2 4 1 9 10 39 203 +1211 4 2 4 1 242 62 36 239 +1212 4 2 4 1 216 11 61 42 +1213 4 2 4 1 28 2 244 228 +1214 4 2 4 1 221 237 61 279 +1215 4 2 4 1 77 80 56 268 +1216 4 2 4 1 240 227 29 244 +1217 4 2 4 1 40 44 3 226 +1218 4 2 4 1 203 221 61 279 +1219 4 2 4 1 164 162 163 265 +1220 4 2 4 1 202 45 7 41 +1221 4 2 4 1 45 8 53 202 +1222 4 2 4 1 150 177 151 267 +1223 4 2 4 1 60 177 150 267 +1224 4 2 4 1 235 66 214 270 +1225 4 2 4 1 70 69 165 271 +1226 4 2 4 1 132 225 87 275 +1227 4 2 4 1 39 42 43 279 +1228 4 2 4 1 33 204 245 34 +1229 4 2 4 1 122 193 145 263 +1230 4 2 4 1 46 211 5 55 +1231 4 2 4 1 13 214 226 270 +1232 4 2 4 1 5 4 211 46 +1233 4 2 4 1 202 139 234 274 +1234 4 2 4 1 25 77 56 268 +1235 4 2 4 1 199 123 126 273 +1236 4 2 4 1 207 62 236 276 +1237 4 2 4 1 31 246 54 209 +1238 4 2 4 1 61 11 10 42 +1239 4 2 4 1 225 206 87 275 +1240 4 2 4 1 37 242 215 62 +1241 4 2 4 1 213 227 65 269 +1242 4 2 4 1 227 29 65 240 +1243 4 2 4 1 145 141 122 263 +1244 4 2 4 1 62 207 205 276 +1245 4 2 4 1 157 147 58 272 +1246 4 2 4 1 239 205 36 35 +1247 4 2 4 1 53 9 8 45 +1248 4 2 4 1 220 139 202 274 +1249 4 2 4 1 152 143 64 277 +1250 4 2 4 1 199 223 117 278 +1251 4 2 4 1 28 227 213 269 +1252 4 2 4 1 87 206 224 275 +1253 4 2 4 1 246 54 32 31 +1254 4 2 4 1 245 34 52 35 +1255 4 2 4 1 157 58 19 272 +1256 4 2 4 1 208 33 241 32 +1257 4 2 4 1 3 4 40 66 +1258 4 2 4 1 227 2 29 244 +1259 4 2 4 1 1 3 44 226 +1260 4 2 4 1 220 7 6 41 +1261 4 2 4 1 220 230 139 274 +1262 4 2 4 1 214 66 226 270 +1263 4 2 4 1 62 37 242 36 +1264 4 2 4 1 229 1 12 44 +1265 4 2 4 1 2 244 228 38 +1266 4 2 4 1 64 143 144 277 +1267 4 2 4 1 31 30 246 209 +1268 4 2 4 1 143 129 144 277 +1269 4 2 4 1 7 8 45 202 +1270 4 2 4 1 29 30 65 240 +1271 4 2 4 1 216 12 11 42 +1272 4 2 4 1 215 38 242 37 +1273 4 2 4 1 46 5 6 55 +1274 4 2 4 1 265 271 173 165 +1275 4 2 4 1 173 271 265 247 +1276 4 2 4 1 274 175 217 230 +1277 4 2 4 1 274 217 175 252 +1278 4 2 4 1 279 163 68 252 +1279 4 2 4 1 279 68 163 237 +1280 4 2 4 1 256 274 175 252 +1281 4 2 4 1 175 274 256 139 +1282 4 2 4 1 274 222 138 234 +1283 4 2 4 1 274 138 222 252 +1284 4 2 4 1 275 194 248 266 +1285 4 2 4 1 275 248 194 131 +1286 4 2 4 1 277 120 175 256 +1287 4 2 4 1 277 175 120 129 +1288 4 2 4 1 278 212 156 238 +1289 4 2 4 1 278 156 212 262 +1290 4 2 4 1 275 219 225 254 +1291 4 2 4 1 275 225 219 132 +1292 4 2 4 1 271 99 100 73 +1293 4 2 4 1 271 100 99 255 +1294 4 2 4 1 272 171 170 19 +1295 4 2 4 1 272 170 171 258 +1296 4 2 4 1 271 17 48 69 +1297 4 2 4 1 271 48 17 262 +1298 4 2 4 1 270 211 277 235 +1299 4 2 4 1 270 277 211 217 +1300 4 2 4 1 144 277 211 235 +1301 4 2 4 1 144 211 277 217 +1302 4 2 4 1 279 45 43 39 +1303 4 2 4 1 279 43 45 274 +1304 4 2 4 1 238 147 272 212 +1305 4 2 4 1 238 272 147 190 +$EndElements diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh_gen.py b/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh_gen.py new file mode 100644 index 00000000..2396321e --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/mesh_gen.py @@ -0,0 +1,72 @@ +import json +import os +import sys +import gmsh + +MESH_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mesh") +DEFAULT_MESH_FILENAME = "beam3d_circular_tet.msh" + + +def generate_beam3D_circular_tet(length, radius, mesh_size, filename=None): + + if filename is None: + filename = DEFAULT_MESH_FILENAME + + gmsh.initialize() + gmsh.model.add("beam3d_circular_tet") + + + disk_fixed = gmsh.model.occ.addDisk(0, 0, 0, radius, radius, + zAxis=[1, 0, 0], xAxis=[0, 1, 0]) + gmsh.model.occ.synchronize() + + out = gmsh.model.occ.extrude([(2, disk_fixed)], length, 0, 0) + gmsh.model.occ.synchronize() + + vol_tag = [e[1] for e in out if e[0] == 3][0] + surf_tags = [e[1] for e in out if e[0] == 2] + + disk_loaded = None + lateral = None + for s in surf_tags: + xmin, ymin, zmin, xmax, ymax, zmax = gmsh.model.occ.getBoundingBox(2, s) + if abs(xmax - xmin) < 1e-6: + disk_loaded = s + else: + lateral = s + assert disk_loaded is not None and lateral is not None, \ + "Verify the faces " + gmsh.model.addPhysicalGroup(2, [disk_fixed], tag=1, name="Fixed") + gmsh.model.addPhysicalGroup(2, [disk_loaded], tag=2, name="Loaded") + gmsh.model.addPhysicalGroup(2, [lateral], tag=3, name="Lateral") + gmsh.model.addPhysicalGroup(3, [vol_tag], tag=4, name="Beam") + + gmsh.model.mesh.setSize(gmsh.model.getEntities(0), mesh_size) + + gmsh.model.mesh.generate(3) + gmsh.model.mesh.setOrder(1) + _, node_coords, _ = gmsh.model.mesh.getNodes() + + os.makedirs(MESH_DIR, exist_ok=True) + msh_path = os.path.join(MESH_DIR, filename) + gmsh.option.setNumber("Mesh.MshFileVersion", 2.2) + gmsh.write(msh_path) + gmsh.finalize() + + return msh_path, len(node_coords) // 3 + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else "params.json" + with open(config_file) as f: + all_cfg = json.load(f) + cfg = all_cfg["beam3d_circle_tet"] + + msh_path, n_nodes = generate_beam3D_circular_tet( + length=float(cfg["length"]), + radius=float(cfg["radius"]), + mesh_size=float(cfg["mesh_size"]), + filename=cfg.get("meshfile", DEFAULT_MESH_FILENAME), + ) + print("Wrote:", msh_path) + print("Number of nodes:", n_nodes) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/params_beam3d_torsion.json b/examples/Freefem/projet_validation/cases/case_3d/torsion/params_beam3d_torsion.json new file mode 100644 index 00000000..f9947124 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/params_beam3d_torsion.json @@ -0,0 +1,6 @@ +{ + "T": 0.09, + "radius": 0.1, + "youngModulus": 10000.0, + "poissonRatio": 0.3 +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/params_mesh.json b/examples/Freefem/projet_validation/cases/case_3d/torsion/params_mesh.json new file mode 100644 index 00000000..f4f14328 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/params_mesh.json @@ -0,0 +1,8 @@ +{ + "beam3d_circle_tet": { + "length": 1.0, + "radius": 0.1, + "mesh_size": 0.06, + "meshfile": "beam3d_circular_tet.msh" + } +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/results/freefem_beam3d_torsion_raw.txt b/examples/Freefem/projet_validation/cases/case_3d/torsion/results/freefem_beam3d_torsion_raw.txt new file mode 100644 index 00000000..295d9d08 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/results/freefem_beam3d_torsion_raw.txt @@ -0,0 +1,279 @@ +0 0.1 0 3.61037261472e-33 -3.41599081408e-33 4.72319643149e-32 +1 0.1 0 0.000296921390625 -0.00193410205204 0.00915960377585 +0 0.0841253532831 0.0540640817456 6.37271748996e-33 -2.56793127688e-32 4.91386219158e-32 +0 0.0415415013002 0.0909631995355 1.06007362568e-32 -5.91959567498e-32 1.03629853235e-32 +0 -0.0142314838273 0.0989821441881 1.5090261351e-33 -4.36755216902e-32 -1.14371165669e-32 +0 -0.0654860733945 0.0755749574354 -1.06909241369e-32 -5.23592519745e-32 -2.75629086285e-32 +0 -0.0959492973614 0.0281732556841 -5.27073671425e-33 -1.08724970174e-32 -5.19523249973e-32 +0 -0.0959492973614 -0.0281732556841 -2.50071674953e-33 8.59179486586e-33 -3.7789940445e-32 +0 -0.0654860733945 -0.0755749574354 -1.23139201332e-32 3.46898937551e-32 -5.28825798201e-32 +0 -0.0142314838273 -0.0989821441881 -1.31058198656e-33 6.24303304192e-32 2.07243442244e-33 +0 0.0415415013002 -0.0909631995355 3.79861537317e-33 3.81021320924e-32 2.03442814066e-32 +0 0.0841253532831 -0.0540640817456 1.39076244127e-32 2.32997414485e-32 5.79102976452e-32 +0.0588235294118 0.1 0 3.14488809555e-05 5.47222207181e-06 0.000587644936305 +0.117647058824 0.1 0 8.10028233765e-05 -7.7117657089e-05 0.0011702203618 +0.176470588235 0.1 0 7.73435455897e-05 -0.000153901546274 0.00186348955671 +0.235294117647 0.1 0 0.000127490963762 -0.00016054636868 0.00224213866335 +0.294117647059 0.1 0 0.00015226787603 -0.000215580046522 0.00272862230009 +0.352941176471 0.1 0 0.000176909652197 -0.000332650008604 0.00338540185493 +0.411764705882 0.1 0 0.000145502843037 -0.000432577836517 0.00385148900358 +0.470588235294 0.1 0 0.000190800049484 -0.00053197702036 0.00434083711633 +0.529411764706 0.1 0 0.000223046827386 -0.00065839398998 0.00481408529205 +0.588235294118 0.1 0 0.000230350678797 -0.000861584512653 0.00541574738637 +0.647058823529 0.1 0 0.000246427158397 -0.000941715883698 0.00588313759606 +0.705882352941 0.1 0 0.000258333019986 -0.0010634844251 0.00645635124998 +0.764705882353 0.1 0 0.00029371918296 -0.00124753806863 0.00694571333656 +0.823529411765 0.1 0 0.000277497748594 -0.00143317273777 0.00740758646698 +0.882352941176 0.1 0 0.000269854906238 -0.001544246868 0.00805317557002 +0.941176470588 0.1 0 0.00030466102277 -0.00178373429626 0.00850887786052 +1 0.0841253532831 0.0540640817456 0.000254931647417 -0.00703782711346 0.00766430534247 +1 0.0415415013002 0.0909631995355 0.00014355627014 -0.0104310986445 0.00372841049615 +1 -0.0142314838273 0.0989821441881 -2.57636432719e-05 -0.0111603540993 -0.0015276432121 +1 -0.0654860733945 0.0755749574354 -0.000156410506462 -0.00896685229865 -0.00635083277384 +1 -0.0959492973614 0.0281732556841 -0.000280709487479 -0.00459329454547 -0.00916286193987 +1 -0.0959492973614 -0.0281732556841 -0.000283455147778 0.000688746350187 -0.00914654283062 +1 -0.0654860733945 -0.0755749574354 -0.00021187162895 0.00517181316164 -0.0063083409146 +1 -0.0142314838273 -0.0989821441881 -6.23742862387e-05 0.00736820638075 -0.00158979179071 +1 0.0415415013002 -0.0909631995355 0.000101905354632 0.00659654309051 0.0037178839806 +1 0.0841253532831 -0.0540640817456 0.000228464756392 0.00313990616322 0.00767859028317 +0 -0.0194047748659 -0.0452914754476 1.82909217093e-32 1.41077269325e-32 3.60500048342e-32 +0 0.0354555157344 0.0395413437119 -9.88832153355e-33 2.72223129663e-32 3.9119225709e-32 +0 -0.043945488765 0.0282420507519 8.36050192145e-33 1.59052002296e-32 -2.36454940153e-32 +0 0.0252745018227 -0.0487170445481 -1.22550622736e-32 6.63813913044e-32 -1.16677479728e-32 +0 0.000168854082208 0.000646863840197 1.77025174736e-33 3.8929596062e-32 7.88123717945e-33 +0 0.0548582630343 -0.00142147283266 1.34782961941e-32 -1.78466647131e-32 8.95397979529e-32 +0 -0.053427679611 -0.0153295863818 -2.01938435027e-32 6.3931485811e-33 -1.21088626027e-31 +0 -0.00800569095712 0.0556808036504 -7.27495682437e-33 -1.28416882462e-31 -2.16593970053e-32 +0.499509753985 0.0868681348925 -0.0495371289065 0.000149581357933 0.00176200227982 0.00406851115826 +0.323529411765 0.0870242214533 -0.0492624083907 0.000162463540932 0.001318576814 0.0027497589928 +0.676470588235 0.0870242214533 -0.0492624083907 0.000182390672613 0.00207486211257 0.00534425452741 +0.735294117647 0.0870242214533 0.0492624083907 0.0002441136067 -0.00447427760467 0.00578616630169 +0.264705882353 0.0870242214533 0.0492624083907 0.000127539244934 -0.00142514234525 0.00211121581298 +0.951370905667 -0.0841253532831 -0.0540640817456 -0.000244581360833 0.00298393568608 -0.00761554996373 +0.0486290943332 -0.0841253532831 -0.0540640817456 -2.56621449994e-05 0.00029621413992 -0.000405910020833 +0.955689674436 -0.0406615998045 0.0913599162726 -8.48555210512e-05 -0.00991901337025 -0.00377029706183 +0.0409708826749 -0.040591165787 0.0913912318554 -5.98828795584e-06 -0.000426150620835 -0.000204109135097 +0.794117647059 0.0870242214533 -0.0492624083907 0.000214170236838 0.00232510935984 0.00631828186141 +0.205882352941 0.0870242214533 -0.0492624083906 8.41336118836e-05 0.000893339622635 0.00182025223721 +0.382352941176 0.0870242214533 0.0492624083907 0.000166867935822 -0.00210941546242 0.00306650294455 +0.617315012814 0.0866458660378 0.0499248825593 0.000208849121741 -0.00377923098744 0.00483552852226 +0.5 0.0870242214533 0.0492624083907 0.000173930733806 -0.00284930892699 0.00399492916832 +0.048629094333 0.0142314838273 -0.0989821441881 -4.93158702038e-06 0.000485485998108 5.43227878064e-05 +0.957970679749 0.0127675861885 -0.0991815947791 1.42918775884e-05 0.00707528917747 0.00095814965028 +0.852941176471 0.0870242214533 0.0492624083907 0.000246671194997 -0.00539565743714 0.00666077650794 +0.131407168032 0.0842695307945 0.0538390766978 4.68963663607e-05 -0.000731686254606 0.00104678509896 +0.958204749155 0.0655766651049 0.0754963641093 0.000210619855221 -0.00851031119733 0.00564761406782 +0.0486290943332 0.0654860733945 0.0755749574354 6.75366058088e-06 -0.000434663203896 0.000311092401978 +0.911764705882 0.0870242214533 -0.0492624083907 0.000221693295368 0.00252706318448 0.00724164169586 +0.0882352941176 0.0870242214533 -0.0492624083907 5.61784093047e-05 0.000434423028086 0.000834183826696 +0.264985117138 0.0871062104225 -0.0491172892761 0.000106610020708 0.0010456511686 0.00220397861287 +0.294118550267 0.0520659265294 -0.0853764563251 5.59688076172e-05 0.0023039274984 0.00152634390914 +0.352222616546 0.0518732920058 -0.0854936347133 6.87078262082e-05 0.00252643658634 0.00172824056971 +0.322945033027 0.00384500543492 -0.0999260523247 -1.70456973286e-05 0.00288622752351 8.89718220918e-05 +0.264930381186 0.00408532210815 -0.0999165158684 -1.78535989679e-05 0.00238665367048 8.06945957406e-05 +0.380973219895 0.00356468077596 -0.0999364450587 -1.71576243679e-06 0.00314656382998 8.56956255091e-05 +0.410451450917 0.0516545830395 -0.0856259543072 9.4767666166e-05 0.00287593332434 0.00191584835963 +0.439047728462 0.00324407778602 -0.0999473659449 -1.66548959963e-05 0.00367195769478 7.25684068952e-05 +0.735496057098 0.0870835427511 -0.049157467204 0.000201866654534 0.00212056770122 0.00573694449362 +0.706120423802 0.0519434147829 -0.08545104833 0.000101119164623 0.00445407699364 0.00332498049677 +0.645776456118 0.0513671704407 -0.0857986818134 0.000117595670695 0.00408450980336 0.0029201942131 +0.763930652851 0.0517007290332 -0.0855980993798 6.58963780545e-05 0.0048119263765 0.0035351529746 +0.735039568984 0.00398928527376 -0.0999203963313 -9.14983879675e-06 0.00556261760937 0.000187782283599 +0.792693603218 0.00368775212231 -0.0999319792873 -4.13843601773e-05 0.0061082820733 0.000181130046692 +0.763726376473 -0.0449868678646 -0.0893094716127 -0.000117160128832 0.00500231264283 -0.00332036119526 +0.705169321389 -0.0453966589139 -0.0891018706844 -0.000100998104495 0.00467737888054 -0.00305615253905 +0.817130405107 -0.0446413794399 -0.0894826644759 -0.000156250798521 0.00540069310496 -0.00355065638145 +0.792414916258 -0.0825653458458 -0.0564177601945 -0.000244916400467 0.00277288646382 -0.00619600386929 +0.849939345511 -0.0827040055636 -0.0562142994596 -0.000249421815094 0.00291237442367 -0.00655686719543 +0.820956096766 -0.0995459340189 -0.00951877199546 -0.000287750186624 -0.000654822936416 -0.00770232768361 +0.763365962063 -0.0995227241897 -0.00975845120194 -0.000256776247704 -0.000592598140668 -0.00701923059399 +0.79206006815 -0.0917272303865 0.0398260618894 -0.000229058370373 -0.00425379684788 -0.00685429292434 +0.734236405353 -0.0918509143067 0.0395399739634 -0.000235694664351 -0.00386268642506 -0.0063811001337 +0.763082924787 -0.0611177750652 0.0791493371487 -0.000148468783192 -0.00672211772488 -0.00436349080115 +0.705143454403 -0.0612233940651 0.0790676673436 -0.000122428121406 -0.00625120833326 -0.00421304901915 +0.820813587297 -0.0609750294665 0.0792593576908 -0.000131131540941 -0.00748431874224 -0.00474797621234 +0.676409927953 -0.0919707962908 0.0392603187665 -0.000243175777844 -0.0035109539721 -0.00588104069688 +0.647120466519 -0.0611747095228 0.0791053406212 -0.000100604336373 -0.00554423207169 -0.00365823803913 +0.617892541561 -0.0921167935598 0.0389165304757 -0.000193317375633 -0.00307046385069 -0.00528204653787 +0.409790836821 -0.0456864735503 -0.0889536178834 -8.14189139396e-05 0.00289969666148 -0.00176100009462 +0.293753984302 -0.0450441325467 -0.089280603286 -8.95653741033e-05 0.00231543952435 -0.00127815330572 +0.235951717569 -0.0448946985796 -0.0893558394255 -4.93711134327e-05 0.00190058727345 -0.00108495016464 +0.467879137668 -0.0459756250741 -0.0888045150825 -0.000107141277108 0.0034199246306 -0.00204849126406 +0.438680690949 -0.0833124318134 -0.0553085771408 -0.00017192091779 0.00181403150822 -0.00351962718974 +0.588839295159 -0.061251444555 0.0790459394272 -0.000103226635789 -0.00518638420066 -0.00341701684325 +0.496768060852 -0.0834907145136 -0.0550390823871 -0.000188607798749 0.00188948458276 -0.00395389829495 +0.467373513713 -0.0997209333034 -0.00746561860119 -0.000213815973371 -0.00029233837665 -0.00448697578226 +0.409452054555 -0.09968594491 -0.00791911531638 -0.000209742896448 -0.00012586917525 -0.00385709943113 +0.264654454702 -0.0826051048243 -0.0563595303117 -0.000111880015105 0.0011832627808 -0.00203782786935 +0.20702252638 -0.0825210100281 -0.0564825893878 -8.12931651219e-05 0.00100045403508 -0.00174923409844 +0.437979421147 -0.0907630773072 0.0419769436444 -0.000171559459959 -0.00223488639267 -0.00385190337408 +0.38015033487 -0.0909649544945 0.0415376582611 -0.000140927424943 -0.00183465946591 -0.00332178068319 +0.235590578186 -0.0995450516894 -0.00952799476035 -0.000131224120255 8.29308674716e-05 -0.00227517224825 +0.178031873789 -0.0995286521006 -0.00969780444411 -9.01945561796e-05 9.70565357679e-05 -0.00178141546318 +0.206619139611 -0.0918247841447 0.0396006188939 -9.63957780812e-05 -0.000867820262311 -0.00191043640893 +0.526011065725 -0.0462397656629 -0.088667266065 -0.000104759591812 0.00369561970531 -0.00236169007896 +0.178401069122 -0.0449252640045 -0.0893404760124 -4.33052978823e-05 0.00152259653198 -0.00084192921798 +0.408651195106 -0.0588007036413 0.0808855812323 -0.000103137807653 -0.00354481210393 -0.00234103467272 +0.352049049139 -0.0598399673073 0.0801197747916 -8.14055645768e-05 -0.00308342735651 -0.00208667157422 +0.465340370625 -0.0598110570338 0.0801413592129 -9.2362137066e-05 -0.00413694613539 -0.00277515644268 +0.149249921861 -0.0919261402113 0.0393647652839 -7.46987169581e-05 -0.000609723293873 -0.00131911479705 +0.177792436682 -0.0614859526089 0.0788636648386 -3.67124511862e-05 -0.001524793795 -0.00107747363434 +0.676051674348 -0.0150026051448 0.0988682043878 4.76575706737e-06 -0.00720322437176 -0.00107910347014 +0.791868581314 -0.0150298941169 0.0988640596113 -5.0733747336e-08 -0.00857755560028 -0.00125838199398 +0.235269764061 -0.0610946586767 0.0791671818444 -6.60303386369e-05 -0.00186839192881 -0.00134468035004 +0.207003370595 -0.0146583373373 0.0989198319171 -1.56943043146e-05 -0.00204898323893 -0.000295281751032 +0.848339992359 -0.0146905123306 0.0989150587497 -1.73934058356e-05 -0.00927862455666 -0.00129650895616 +0.264138956103 -0.0150615913337 0.0988592356156 -1.2814634541e-05 -0.00269998657008 -0.00037589581656 +0.437496575665 -0.0116031165 0.0993245573234 2.40829730296e-05 -0.00473030892397 -0.000529223587462 +0.495947057207 -0.0112517330395 0.0993649762422 -8.66447514911e-06 -0.00516685984985 -0.000665054856931 +0.150515837797 -0.0147840087405 0.0989011278276 1.9274079019e-05 -0.00153207667514 -0.000222579653615 +0.645559590419 -0.0994657193847 -0.0103233069939 -0.000248085100624 -0.000353037484178 -0.00604527971978 +0.850416516781 0.00336469473374 -0.0999433781166 -2.21744988606e-05 0.00624038928377 8.94879128781e-05 +0.872751955567 -0.0998061447121 -0.0062236225544 -0.000278346405944 -0.00101641596096 -0.00820470953407 +0.554844365405 -0.0835767498712 -0.0549083498292 -0.000198930364738 0.00211208228292 -0.00444722341164 +0.58411593068 -0.0464869566494 -0.0885379176482 -0.000137167600406 0.00412832099268 -0.00266447998116 +0.555262715338 0.00262646921304 -0.0999655023469 -3.6794269572e-05 0.00462933798166 5.74881590177e-05 +0.560260245806 -0.0918640658456 0.0395094090858 -0.000197604081427 -0.00280963434531 -0.00491135756291 +0.293317980968 -0.099577281046 -0.0091850476035 -0.000122333489771 -1.55061813899e-05 -0.00280444140299 +0.128021030377 -0.0994565801597 -0.010410987606 -5.66407107493e-05 8.41291400689e-05 -0.001162096459 +0.0918699483918 -0.0920284137652 0.0391250694549 -4.28516363767e-05 -0.000424394326097 -0.000897115461815 +0.869951871996 -0.0615632594318 0.0788033317071 -0.000149244483891 -0.00782323557056 -0.00506433151526 +0.820847248063 0.0356321627273 0.0934363365045 0.000122547154181 -0.00858009312246 0.00251263813487 +0.869096989166 0.0368663391307 0.092956296393 0.000126296920082 -0.00902285882042 0.00279305747707 +0.177081234264 0.0342464795531 0.0939530661459 3.73671076551e-05 -0.00179459993764 0.000617668699809 +0.128355127056 0.0320633566915 0.0947203312794 3.60683355884e-05 -0.00119860176602 0.000398997861222 +0.768037361993 0.0359426089564 0.093317355628 0.000131017329473 -0.00786693218529 0.00237022452122 +0.46647863332 0.0387042132049 0.0922062030461 9.72218212904e-05 -0.00460801783273 0.00161209607755 +0.407982448028 0.038414388267 0.0923273240925 0.000114382898182 -0.00405300334913 0.00147943810972 +0.528486521708 -0.060524617349 0.0796038359299 -0.000122801282805 -0.00459394346861 -0.00309695384037 +0.555554921004 -0.0130487192057 0.0991449995062 -2.39687024838e-05 -0.00606963900193 -0.000785279027069 +0.525855503743 0.0395087346008 0.0918643559289 0.000135150585604 -0.00517589168776 0.00188450719868 +0.585085071843 0.0388508405962 0.0921445179322 0.000101934956431 -0.00591850432155 0.00208933914827 +0.198932864616 0.0811345564607 0.0584566826626 0.000104739617522 -0.00125069907898 0.00159460311474 +0.7943229396 0.0804797015947 0.0593550135307 0.000256138015028 -0.00570066721168 0.00582670776583 +0.702320402569 0.0493962655133 0.0869483119637 0.000161002741352 -0.00668733042835 0.00311793616207 +0.248213862569 0.0461198757615 0.0887296853355 9.03101500673e-05 -0.00230154562076 0.00107888327392 +0.304845190024 0.0285362695837 0.0958419601127 4.51193304483e-05 -0.00304225280684 0.000804285456522 +0.441118945392 0.0823343853729 0.056754286052 0.000171358878502 -0.00289999734883 0.00344849275357 +0.614971409783 0.00328752764031 -0.099945946201 -2.01350344099e-05 0.00483397568986 4.98508215025e-05 +0.585795953482 0.0511408855117 -0.0859337525602 0.000110449277843 0.00389102304927 0.00267429824158 +0.643747805535 -0.0461646732665 -0.088706386141 -0.000125925027293 0.00434709120668 -0.00283395897994 +0.85273923702 0.0870835427511 -0.049157467204 0.000243291294778 0.00231831639815 0.00659028952613 +0.146785682246 0.0871044242114 -0.0491204568668 8.15333903566e-05 0.00064354545135 0.00123354443278 +0.130189420263 0.0511284637429 -0.0859411437862 2.47131569073e-05 0.00099805016118 0.000580983037191 +0.18262460777 0.0516815469417 -0.0856096823129 3.70346196765e-05 0.001486990637 0.000907715808662 +0.237936614446 0.0519441728504 -0.0854505875163 4.58074711776e-05 0.0017405078923 0.0011714748876 +0.849952027216 -0.0915833113069 0.0401559097776 -0.000221194330763 -0.00466068378927 -0.00737343683081 +0.675808436845 0.0867638045264 0.0497196362025 0.000216763742789 -0.00416363184986 0.00540386123504 +0.151758704842 -0.082226354344 -0.0569106901319 -5.54693183481e-05 0.000789575527923 -0.00124589609008 +0.119135698293 -0.0436372895323 -0.0899765911906 -4.09933702491e-05 0.00104773150775 -0.00053744152412 +0.38164086324 0.0869301236844 -0.0494282671779 0.000140823567921 0.00134849683711 0.00306177884474 +0.440260911144 0.08655789391 -0.0500772503424 0.000131439261077 0.00160246310872 0.00362780604909 +0.617647058824 0.0870242214533 -0.0492624083907 0.000185352148956 0.00194283057167 0.00483009715079 +0.207647089225 0.00380201754652 -0.0999276971744 -2.35668389461e-05 0.00193790593063 7.32288719724e-05 +0.822785738233 0.051863031329 -0.08549985954 0.00011183875871 0.00510826929928 0.00375216968746 +0.125312067986 -0.0622102541658 0.0782935774928 -5.54144598532e-05 -0.000956697168285 -0.000728318162813 +0.323426466411 0.0873435503514 0.0486939853781 0.000154890960274 -0.0018103606899 0.00264176935815 +0.558508746875 0.0867053048738 0.0498215827402 0.000186400097738 -0.00333309670039 0.0044782118746 +0.642829314261 0.0493799433331 0.0869575827425 0.00014682354135 -0.00611001944478 0.0028332852992 +0.611409415956 -0.0129795201311 0.0991540824029 -1.20260870837e-05 -0.00647892945027 -0.000773507824966 +0.612980313023 -0.0828919825514 -0.0559367431006 -0.000213492309315 0.00237566042512 -0.00477647364719 +0.497157660709 0.002929841805 -0.0999570709205 -1.39542360838e-05 0.0040423654557 0.000138233130685 +0.527342873108 0.0513290155381 -0.0858215134095 8.4805466728e-05 0.00355907277883 0.00250442616513 +0.46895100385 0.0514996558636 -0.0857192244828 0.000108309437479 0.00330973675257 0.00222341989119 +0.525426448244 -0.0997380813239 -0.00723292014545 -0.000202917190231 -0.000346098986533 -0.00490705471959 +0.704636613244 -0.0994945292201 -0.0100418452129 -0.000268372308486 -0.000515069906128 -0.00671159439367 +0.351871500063 -0.0452934875988 -0.0891543604157 -9.90626266069e-05 0.0027064080478 -0.00160478098429 +0.322473604192 -0.0827726933822 -0.0561131110371 -0.000139357088892 0.00153712988614 -0.00270553971735 +0.380644695623 -0.0830504197612 -0.055701236768 -0.000166882700727 0.00167610917018 -0.00309012421659 +0.496195042495 -0.0908575891592 0.0417719821434 -0.000197523157329 -0.00261831281219 -0.00433720547556 +0.383151821883 -0.0130055384282 0.0991506730698 -7.65527751998e-06 -0.00396939238653 -0.000521457553309 +0.734897458894 -0.0823074981211 -0.0567932720755 -0.000209094289689 0.00259206921291 -0.00566097537488 +0.675810051495 -0.0822499705015 -0.0568765536272 -0.000225255077578 0.00256939422321 -0.00535536586863 +0.734207637236 -0.0142559351586 0.0989786255348 -6.44989656644e-06 -0.00778818350259 -0.00110193789218 +0.869406239625 0.0506918428844 -0.0861994029271 0.000119109128747 0.00523727617214 0.00382875524543 +0.351362508469 -0.099629523319 -0.00859988855947 -0.000175210167329 -4.13596375692e-05 -0.00339427767019 +0.322045984173 -0.0913654228107 0.0406492252647 -0.000113607892005 -0.00151613942643 -0.00283671483688 +0.264027832656 -0.0916148086717 0.0400839972064 -0.00010485794897 -0.0012086082328 -0.00232959929305 +0.675174950085 0.0036042103551 -0.0999350272313 -5.83530798259e-06 0.00522771569401 0.000156200428872 +0.292988307144 -0.0606912444318 0.0794768699013 -7.626882142e-05 -0.00251773672726 -0.00175037037892 +0.558508061516 0.0870522591139 -0.0492128457129 0.000178560182688 0.0018125491517 0.0044935219493 +0.151479984402 0.00321011488451 -0.0999484625316 -3.59084279884e-05 0.001426599862 2.2055202838e-05 +0.039928567533 -0.099981727302 0.00191159768246 -1.48705292877e-05 -2.71586285305e-05 -0.000395743881414 +0.0610977114917 -0.0419697626768 -0.0907663980824 -2.27556272055e-05 0.000571279714254 -0.000286097264273 +0.939079331788 -0.0999958578752 -0.000910169107029 -0.000305207097196 -0.00163717141025 -0.0089252032626 +0.952234226553 -0.0417263269443 -0.0908785653482 -0.000136876289473 0.00626951576378 -0.00386852645362 +0.902465693949 -0.0654860733945 -0.0755749574354 -0.000202565174829 0.00468477780395 -0.00564550099881 +0.902037305569 -0.00877584551674 -0.0996141783857 -3.4642254713e-05 0.00661365570118 -0.000903036813576 +0.952109946601 -0.0846026288311 0.0533141181571 -0.000228138550866 -0.00649776581004 -0.00763487839853 +0.958604996996 0.0130763894431 0.0991413538294 4.85100601426e-05 -0.0106084370675 0.000950155829107 +0.904716559833 -0.0142314838273 0.0989821441881 -1.20965793926e-05 -0.00989427264041 -0.00135805234866 +0.0630158615744 0.0187598558511 0.0982245784335 6.31367720607e-07 -0.000674361725663 8.79863101077e-05 +0.354413062202 0.0534103616676 0.0845419024303 0.000101360300531 -0.00318584453498 0.00178698856358 +0.905953490225 0.0875095226096 0.0483950767396 0.000260701369253 -0.00565747536822 0.00712961861863 +0.0828063645238 0.0887038571578 0.0461695324356 3.22377483325e-05 -0.000422340058486 0.000759594280998 +0.961496671269 0.0654066247372 -0.0756437270399 0.000159020638676 0.00495815793849 0.00563223314531 +0.0392912531928 0.0655232157407 -0.0755427574225 1.82388609593e-05 0.000321780081256 0.000303679501221 +0.101478596292 -0.0157084749532 0.0987585126186 2.77355228694e-06 -0.000939755677746 -0.000158043323585 +0.584887533518 -0.099523154094 -0.00975406577658 -0.000221216183168 -0.000205421442395 -0.00552934975202 +0.902419406149 -0.0929105355231 0.0369815141497 -0.000258048557734 -0.00468451487446 -0.00787707013461 +0.0428629957634 -0.0841253532831 0.0540640817456 -1.3078102376e-05 -0.000271823192602 -0.000379430472158 +0.0981322366574 -0.000123835993781 -0.0999999233232 -2.30608483577e-05 0.00104944523673 -3.36103042493e-05 +0.105863413005 -0.0819759505884 -0.0572707912039 -3.67391644025e-05 0.000601946656875 -0.000872124743426 +0.320141567636 -0.0203150639477 0.0979147495365 -2.24779371937e-05 -0.00327886521706 -0.000638413547729 +0.867330568347 -0.0409085356637 -0.091249612108 -0.000126002801661 0.00571037140529 -0.00343315055047 +0.909583239647 -0.0916499179311 -0.0400036566232 -0.000281713025138 0.00170831956861 -0.00794858993899 +0.0417776797797 0.0916711303374 0.0399550229967 1.92613576687e-05 -0.000184230544953 0.0003815988801 +0.95822232022 0.0916711303374 0.0399550229967 0.000273406534955 -0.00539436413797 0.00796502128132 +0.958421052896 0.0917548964687 -0.039762280795 0.000256340598231 0.00172686639374 0.00798821037105 +0.0415789471037 0.0917548964687 -0.039762280795 1.91263841121e-05 0.000205036272825 0.000415305368186 +0.0778152572225 -0.0679694561475 0.0733495264539 -2.65802829351e-05 -0.000620748549267 -0.000523290098128 +0.294218534636 0.0659709219605 0.0751520954843 9.9196177224e-05 -0.00230855768646 0.00175048102746 +0.920535659472 -0.065401922897 0.07564779231 -0.000167887007281 -0.00813192470969 -0.00571557396291 +0.920424207786 0.0415415013002 0.0909631995355 0.000142478204511 -0.00940866967375 0.00336061104818 +0.0819435625042 -0.0966741863804 -0.0255754117794 -1.95554371112e-05 0.000236691259031 -0.000809738287867 +0.090227021502 0.0604972968338 0.079624600946 2.4079305042e-05 -0.00073090397246 0.00058354302506 +0.922738375196 0.042841906849 -0.0903580157902 8.56463317984e-05 0.00600205021986 0.00346874118456 +0.0774387065398 0.0427756988368 -0.0903893776338 -4.46019444445e-06 0.000725370954551 0.00038001599759 +0.345361395198 0.0144491710819 0.0989506010848 4.38675153623e-05 -0.00365499850823 0.00043651425899 +1 -0.0194047748659 -0.0452914754476 -5.97283140764e-05 0.00235451930945 -0.00207024569097 +1 0.0354555157344 0.0395413437119 0.000103779367138 -0.00569924944799 0.00315494749784 +1 -0.043945488765 0.0282420507519 -0.000112561575186 -0.00458660646731 -0.00434248514593 +1 0.0252745018227 -0.0487170445481 5.73366989384e-05 0.00263662329977 0.00220153626767 +1 0.000168854082208 0.000646863840197 -2.37384745349e-06 -0.00199144074306 -0.000212701324104 +1 0.0548582630343 -0.00142147283266 0.000160092608936 -0.00180404616083 0.0050090134222 +1 -0.053427679611 -0.0153295863818 -0.000147370863627 -0.000501239816188 -0.00518442634049 +1 -0.00800569095712 0.0556808036504 -1.52196952502e-05 -0.00712201789624 -0.000945514969698 +0.221115847088 -0.00021078916185 3.96040564279e-05 -3.76008108369e-06 -0.000146133446595 -2.02801976028e-05 +0.835196731531 -0.000464072517142 0.000224596717664 -3.83520045466e-06 -0.00143457925911 -0.000197722579873 +0.366425342033 -4.46390377706e-05 -0.000194229482887 3.67925135952e-06 -0.00032224637728 4.99568888207e-06 +0.482605370269 -0.000143368210622 -0.00040036603059 9.81185922796e-06 -0.00057300175071 -6.33999174175e-05 +0.720721616049 9.07663943344e-05 -1.7768874437e-05 -8.89851363231e-06 -0.00112213830501 -8.22347253242e-05 +0.100063838305 0.000633119034978 4.52919603376e-05 2.83650671826e-06 -5.16267639862e-05 8.97806376879e-06 +0.601683196144 0.0010968130917 -0.0010399699653 3.36817346239e-06 -0.000767955068043 -1.88698761173e-05 +0.917637332531 -0.0153757701656 0.00805284676929 -3.84821106216e-05 -0.00238765376152 -0.00147202566862 +0.295635548196 -0.0236353550828 -0.0160807288245 -3.99249227545e-05 0.000216851045162 -0.000704757959008 +0.160353921027 -0.0336518104408 0.00328626653029 -2.77496581222e-05 -0.000108739790728 -0.000560166591136 +0.424533898242 -0.0268292052403 0.0229579914588 -4.55563247087e-05 -0.00134349624942 -0.00114580751084 +0.424320172047 0.00983012818045 -0.034086110388 1.78302361993e-05 0.000943353139821 0.000312044946791 +0.777902566331 -0.0236499866934 -0.0268732910313 -7.43333004565e-05 0.000605007260125 -0.00187111399449 +0.5422449086 -0.0223787738861 -0.0263027282133 -5.15178839672e-05 0.000590202635472 -0.00123570821222 +0.660861274919 -0.0339415427182 0.00520733971587 -8.45011274883e-05 -0.00135505073119 -0.00218425086036 +0.311391506665 0.0363166342666 0.00786270963922 5.76882987601e-05 -0.000544139650246 0.00104305693474 +0.77789476141 0.00190504972939 0.0353153954847 1.61789615173e-05 -0.00385324311706 -4.22984024863e-05 +0.661553663001 0.0335782975237 -0.0089705662119 7.52722655596e-05 -0.000400783005251 0.00195654706485 +0.165176168268 0.026860467984 -0.0256128783726 1.73724919113e-05 0.000360294897563 0.000387920927029 +0.886414215108 0.03675838235 -0.0160374892983 9.09737280897e-05 -0.000264344288388 0.00284040969106 +0.54208675145 0.02060193957 0.0275913550025 5.59159334483e-05 -0.00206503721268 0.00100154133573 +0.764800685835 0.0375093715156 -0.0246478970688 8.39338697658e-05 0.00049697280933 0.00253933809602 +0.944597428938 0.0380906724218 0.0157128994285 0.000107596138606 -0.00320031463058 0.00320529038569 +0.0580033623821 0.0360963241006 0.0240732156946 1.19728752324e-05 -0.000142576518934 0.000188163707502 +0.266018208511 0.0265939327871 -0.0365739212213 2.549408017e-05 0.000703122019649 0.000663598340766 +0.413586530743 0.0358926292438 0.0230051374669 7.80771973554e-05 -0.00132831213335 0.00137629119588 +0.264103087383 -0.0250677726642 0.0374905965705 -2.29401746374e-05 -0.00114412810242 -0.000633701159098 +0.0588643980922 -0.0428159854747 0.0120348223044 -5.00912396928e-06 -9.15625451044e-05 -0.000248421503427 +0.875209201527 -0.0333156992626 -0.0315167424273 -9.65228992379e-05 0.00101205021715 -0.00283245223123 +0.94233851309 -0.00550704022249 -0.0449618924471 -2.35030250703e-05 0.00221962111754 -0.000673945357161 +0.149179132882 0.02006699154 0.0356984459076 1.99834080095e-05 -0.000619790136738 0.000291097828184 +0.325372008286 -0.0254315624565 0.0372592014446 -4.26368237082e-05 -0.00146168989314 -0.000805845048444 +0.0554151686714 0.00345798267811 -0.0401812805801 -8.90973935449e-07 0.000201545701112 1.93935597109e-05 diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/run.py b/examples/Freefem/projet_validation/cases/case_3d/torsion/run.py new file mode 100644 index 00000000..93b33e54 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/run.py @@ -0,0 +1,165 @@ +import json +import os +import numpy as np +from common import env_setup # noqa: F401 -- corrige PATH pour stdbuf (Windows) +from pyfreefem import FreeFemRunner +from .mesh_gen import generate_beam3D_circular_tet +from .sofa_scene import sofaRun, MESH_DIR, DEFAULT_MESH_FILENAME + +HERE = os.path.dirname(os.path.abspath(__file__)) + +LABEL = "3D — Circular beam, pure torsion" + +MATH_DESCRIPTION = """ +Poutre 3D a section circulaire (rayon r), encastree en x=xmin (deplacement +nul), soumise a un couple de torsion pur T sur la face x=xmax (traction +tangentielle tau = (T/J)*(-(z-zc), (y-yc)) integree sur la face). + + J = pi*r^4/2 (moment d'inertie polaire, section circulaire) + G = E / (2(1+nu)) + theta' = T / (G*J) (angle de torsion par unite de longueur) + +Solution analytique EXACTE (une section circulaire ne se gauchit pas sous +torsion pure -> valable sur tout le domaine, contrairement aux cas +traction/compression qui ont une couche limite de Saint-Venant) : + + ux(x,y,z) = 0 + uy(x,y,z) = -theta' * x * (z - zc) + uz(x,y,z) = theta' * x * (y - yc) + +avec (yc, zc) le centre de la section. Hypothese petites deformations : +valide si theta'*L < 0.1 rad (verifie automatiquement par la scene SOFA). +""" + + +def _load_mesh_cfg(): + with open(os.path.join(HERE, "params_mesh.json")) as f: + return json.load(f)["beam3d_circle_tet"] + + +def _load_phys_cfg(): + with open(os.path.join(HERE, "params_beam3d_torsion.json")) as f: + return json.load(f) + + +def _to_freefem_path(path): + """FreeFEM string literals on Windows can choke on backslashes; use forward slashes.""" + return path.replace(os.sep, "/") + + +def _pair_by_coordinates(x_a, y_a, z_a, x_b, y_b, z_b, tol=1e-6, snap=1e-6): + """Appariement robuste par snapping (fidele a compare_beam3d_torsion.py, + meme technique que cases/case_3d/three_point_bending).""" + x_a, y_a, z_a = map(np.asarray, (x_a, y_a, z_a)) + x_b, y_b, z_b = map(np.asarray, (x_b, y_b, z_b)) + + if x_a.size != x_b.size: + raise ValueError( + f"Node COUNT mismatch: SOFA has {x_a.size} nodes, " + f"FreeFEM has {x_b.size} nodes." + ) + + def snap_(v): + return np.round(v / snap) * snap + + xs_a, ys_a, zs_a = snap_(x_a), snap_(y_a), snap_(z_a) + xs_b, ys_b, zs_b = snap_(x_b), snap_(y_b), snap_(z_b) + + order_a = np.lexsort((zs_a, ys_a, xs_a)) + order_b = np.lexsort((zs_b, ys_b, xs_b)) + + if not (np.allclose(x_a[order_a], x_b[order_b], atol=tol) + and np.allclose(y_a[order_a], y_b[order_b], atol=tol) + and np.allclose(z_a[order_a], z_b[order_b], atol=tol)): + raise ValueError("Node coordinates don't match between SOFA and FreeFEM meshes.") + perm = np.empty_like(order_b) + perm[order_b] = order_a + return perm + + +def _analytical_displacement(x0, torque, radius, young_modulus, poisson_ratio, yc, zc): + G = young_modulus / (2.0 * (1.0 + poisson_ratio)) + J = np.pi * radius**4 / 2.0 + theta_prime = torque / (G * J) + + x, y, z = x0[:, 0], x0[:, 1], x0[:, 2] + ux = np.zeros_like(x) + uy = -theta_prime * x * (z - zc) + uz = theta_prime * x * (y - yc) + return np.column_stack([ux, uy, uz]), theta_prime + + +def run_case(): + mesh_cfg = _load_mesh_cfg() + phys_cfg = _load_phys_cfg() + + T = float(phys_cfg["T"]) + radius = float(phys_cfg["radius"]) + young_modulus = float(phys_cfg["youngModulus"]) + poisson_ratio = float(phys_cfg["poissonRatio"]) + + # --- Maillage : genere s'il n'existe pas deja --- + meshfile = mesh_cfg.get("meshfile", DEFAULT_MESH_FILENAME) + mesh_path = os.path.join(MESH_DIR, meshfile) + if not os.path.isfile(mesh_path): + generate_beam3D_circular_tet( + length=float(mesh_cfg["length"]), + radius=float(mesh_cfg["radius"]), + mesh_size=float(mesh_cfg["mesh_size"]), + filename=meshfile, + ) + + os.makedirs(os.path.join(HERE, "results"), exist_ok=True) + ff_out_path = os.path.join(HERE, "results", "freefem_beam3d_torsion_raw.txt") + + # --- FreeFem++ (ecrit directement un fichier texte, pas d'exportArray) --- + runner = FreeFemRunner(os.path.join(HERE, "freefem_beam3d_torsion.edp")) + runner.execute({ + 'T': T, + 'radius': radius, + 'youngModulus': young_modulus, + 'poissonRatio': poisson_ratio, + 'meshFile': _to_freefem_path(mesh_path), + 'outFile': _to_freefem_path(ff_out_path), + }, verbosity=0) + + if not os.path.isfile(ff_out_path): + raise RuntimeError( + f"FreeFEM did not produce the expected output file: {ff_out_path}\n" + f"Check the FreeFEM console output above for compile/runtime errors." + ) + + raw = np.loadtxt(ff_out_path) + x_ff, y_ff, z_ff = raw[:, 0], raw[:, 1], raw[:, 2] + ux_ff, uy_ff, uz_ff = raw[:, 3], raw[:, 4], raw[:, 5] + + # --- SOFA (fait aussi une verification interne "est-ce une vraie torsion") --- + pos0_sofa, u_sofa = sofaRun(mesh_file=mesh_path, T=T, radius=radius, + young_modulus=young_modulus, + poisson_ratio=poisson_ratio) + x_sofa, y_sofa, z_sofa = pos0_sofa[:, 0], pos0_sofa[:, 1], pos0_sofa[:, 2] + + # --- Reordonner FreeFem sur l'ordre des noeuds SOFA (meme maillage) --- + perm = _pair_by_coordinates(x_sofa, y_sofa, z_sofa, x_ff, y_ff, z_ff) + u_ff = np.column_stack([ux_ff[perm], uy_ff[perm], uz_ff[perm]]) + + # --- Solution analytique EXACTE (valable partout, cf MATH_DESCRIPTION) --- + yc = 0.5 * (y_sofa.min() + y_sofa.max()) + zc = 0.5 * (z_sofa.min() + z_sofa.max()) + u_ana, theta_prime = _analytical_displacement( + pos0_sofa, T, radius, young_modulus, poisson_ratio, yc, zc + ) + length = x_sofa.max() - x_sofa.min() + + return { + "label": LABEL, + "dim": 3, + "coords_ff": np.column_stack([x_sofa, y_sofa, z_sofa]), # meme ordre que u_ff apres pairing + "u_ff": u_ff, + "coords_sofa": np.column_stack([x_sofa, y_sofa, z_sofa]), + "u_sofa": u_sofa, + "u_ana": u_ana, # exact partout, pas de masque necessaire + "component_names": ["ux", "uy", "uz"], + "theta_prime": theta_prime, + "theta_total": theta_prime * length, + } diff --git a/examples/Freefem/projet_validation/cases/case_3d/torsion/sofa_scene.py b/examples/Freefem/projet_validation/cases/case_3d/torsion/sofa_scene.py new file mode 100644 index 00000000..3e6619d1 --- /dev/null +++ b/examples/Freefem/projet_validation/cases/case_3d/torsion/sofa_scene.py @@ -0,0 +1,247 @@ +import json +import os +import sys +import numpy as np +import Sofa +import Sofa.Core +import Sofa.Simulation + +RESULTS_DIR = "results" +MESH_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mesh") +DEFAULT_MESH_FILENAME = "beam3d_circular_tet.msh" + + +def torsion_consistent_forces(nodes, end_faces, T, J, yc, zc): + N = len(nodes) + F = np.zeros((N, 3)) + for tri in end_faces: + pts = nodes[tri, :] + v1 = pts[1] - pts[0] + v2 = pts[2] - pts[0] + area = 0.5 * np.linalg.norm(np.cross(v1, v2)) + for nid in tri: + y, z = nodes[nid, 1], nodes[nid, 2] + dy, dz = y - yc, z - zc + ty = -(T / J) * dz + tz = (T / J) * dy + F[nid, 1] += ty * area / 3.0 + F[nid, 2] += tz * area / 3.0 + return F + + +def _check_small_strain(T, radius, young_modulus, poisson_ratio, length, + theta_length_limit=0.1): + J = np.pi * radius**4 / 2.0 + G = young_modulus / (2.0 * (1.0 + poisson_ratio)) + theta = T / (G * J) + theta_total = theta * length + if abs(theta_total) > theta_length_limit: + print( + f"estimated total Torsion's Angle = {theta_total:.3g} rad " + f"(> {theta_length_limit} rad). small-strain linear modal it's not validated", + file=sys.stderr, + ) + return theta, theta_total + + +def _verify_torsion(x0, u, radius, yc, zc, theta_total, tol_x=1e-6, + radius_rel_tol=0.05, angle_abs_tol=0.05): + x = x0[:, 0] + x_max = x.max() + end_mask = np.isclose(x, x_max, atol=tol_x) + + y0e, z0e = x0[end_mask, 1], x0[end_mask, 2] + uxe, uye, uze = u[end_mask, 0], u[end_mask, 1], u[end_mask, 2] + + y1e, z1e = y0e + uye, z0e + uze + + r0 = np.sqrt((y0e - yc) ** 2 + (z0e - zc) ** 2) + r1 = np.sqrt((y1e - yc) ** 2 + (z1e - zc) ** 2) + valid = r0 > 0.1 * radius + + r_rel_err = np.abs(r1[valid] - r0[valid]) / r0[valid] + + angle0 = np.arctan2(z0e[valid] - zc, y0e[valid] - yc) + angle1 = np.arctan2(z1e[valid] - zc, y1e[valid] - yc) + dangle = np.mod(angle1 - angle0 + np.pi, 2 * np.pi) - np.pi + + + ok_radius = r_rel_err.max() < radius_rel_tol + ok_angle = abs(dangle.mean() - theta_total) < angle_abs_tol + + if ok_radius and ok_angle: + print(" It's a real torsion ") + else: + print( + " The deformation it's not a torsion ===> verify the T & youngModulus ", + file=sys.stderr, + ) + + return { + "r0": r0, "r1": r1, "r_rel_err": r_rel_err, + "dangle_mean": dangle.mean(), "dangle_std": dangle.std(), + "ux_mean": uxe.mean(), "ux_max_abs": np.abs(uxe).max(), + "ok": ok_radius and ok_angle, + } + +def _default_mesh_path(): + return os.path.join(MESH_DIR, DEFAULT_MESH_FILENAME) + + +def _default_params_path(): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), "params_beam3d_torsion.json") + + +def create_scene_args(rootNode, mesh_file, T, radius, young_modulus, poisson_ratio, tol=1e-6): + if not os.path.isfile(mesh_file): + raise FileNotFoundError() + + requiredPlugins = [ + "Elasticity", + "Sofa.Component.Constraint.Projective", + "Sofa.Component.IO.Mesh", + "Sofa.Component.LinearSolver.Direct", + "Sofa.Component.MechanicalLoad", + "Sofa.Component.ODESolver.Backward", + "Sofa.Component.StateContainer", + "Sofa.Component.Topology.Container.Dynamic", + "Sofa.Component.Visual", + "Sofa.GL.Component.Rendering3D", + ] + rootNode.addObject('RequiredPlugin', pluginName=requiredPlugins) + rootNode.addObject('DefaultAnimationLoop') + rootNode.addObject('VisualStyle', displayFlags=["showBehaviorModels", "showForceFields"]) + + template = "Vec3d" + + with rootNode.addChild('Beam') as Beam: + Beam.addObject('NewtonRaphsonSolver' + , name="newtonSolver" + , printLog=True + , maxNbIterationsNewton=30 + , absoluteResidualStoppingThreshold=1e-12) + Beam.addObject('SparseLDLSolver' + , name="linearSolver" + , template="CompressedRowSparseMatrixd") + Beam.addObject('StaticSolver' + , name="staticSolver" + , newtonSolver="@newtonSolver" + , linearSolver="@linearSolver") + + loader = Beam.addObject('MeshGmshLoader', name="loader", filename=mesh_file) + + nodes = np.array(loader.position.value) + tets = np.array(loader.tetrahedra.value) + tris = np.array(loader.triangles.value) + N = len(nodes) + + x_min = nodes[:, 0].min() + x_max = nodes[:, 0].max() + length = x_max - x_min + fixed_idx = np.where(np.isclose(nodes[:, 0], x_min, atol=tol))[0].tolist() + + end_mask = np.all(np.isclose(nodes[tris, 0], x_max, atol=tol), axis=1) + end_faces = tris[end_mask] + + if len(fixed_idx) == 0: + raise RuntimeError() + if len(end_faces) == 0: + raise RuntimeError() + + _check_small_strain(T, radius, young_modulus, poisson_ratio, length) + + yc = 0.5 * (nodes[:, 1].min() + nodes[:, 1].max()) + zc = 0.5 * (nodes[:, 2].min() + nodes[:, 2].max()) + J = np.pi * radius**4 / 2.0 + + F_nodal = torsion_consistent_forces(nodes, end_faces, T, J, yc, zc) + forces_list = F_nodal.tolist() + + dofs = Beam.addObject('MechanicalObject' + , name="dofs" + , template=template + , position="@loader.position" + , showObject=True + , showObjectScale=0.01) + + Beam.addObject('TetrahedronSetTopologyContainer' + , name="topology" + , src="@loader") + Beam.addObject('TetrahedronSetTopologyModifier') + + Beam.addObject('LinearSmallStrainFEMForceField' + , name="FEM" + , template=template + , youngModulus=young_modulus + , poissonRatio=poisson_ratio + , topology="@topology") + + Beam.addObject('FixedProjectiveConstraint' + , name="dirichlet" + , indices=fixed_idx) + + Beam.addObject('ConstantForceField' + , name="TorqueTraction" + , indices=list(range(N)) + , forces=forces_list + , showArrowSize=0.0 + , showColor=[1.0, 0.2, 0.0, 1.0]) + + + return rootNode, dofs, nodes.copy() + + +def createScene(rootNode): + with open(_default_params_path()) as f: + cfg = json.load(f) + create_scene_args(rootNode + , mesh_file=_default_mesh_path() + , T=float(cfg["T"]) + , radius=float(cfg["radius"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) + return rootNode + + +def sofaRun(mesh_file, T, radius, young_modulus, poisson_ratio): + root = Sofa.Core.Node("root") + _, dofs, pos0 = create_scene_args(root + , mesh_file=mesh_file + , T=T + , radius=radius + , young_modulus=young_modulus + , poisson_ratio=poisson_ratio) + Sofa.Simulation.init(root) + Sofa.Simulation.animate(root, root.dt.value) + + pos_final = np.array(dofs.position.toList()) + u = pos_final[:, :3] - pos0[:, :3] + x0 = pos0[:, :3] + + os.makedirs(RESULTS_DIR, exist_ok=True) + out_path = os.path.join(RESULTS_DIR, "sofa_beam3d_torsion_results.txt") + with open(out_path, 'w') as f: + f.write(f"{'x0':>12} {'y0':>12} {'z0':>12} {'ux':>12} {'uy':>12} {'uz':>12}\n") + f.write("-" * 78 + "\n") + for (xi, yi, zi), (uxi, uyi, uzi) in zip(x0, u): + f.write(f"{xi:12.6f} {yi:12.6f} {zi:12.6f} {uxi:12.6f} {uyi:12.6f} {uzi:12.6f}\n") + + yc = 0.5 * (x0[:, 1].min() + x0[:, 1].max()) + zc = 0.5 * (x0[:, 2].min() + x0[:, 2].max()) + length = x0[:, 0].max() - x0[:, 0].min() + _, theta_total = _check_small_strain(T, radius, young_modulus, poisson_ratio, length) + _verify_torsion(x0, u, radius, yc, zc, theta_total) + + return x0, u + + +if __name__ == "__main__": + config_file = sys.argv[1] if len(sys.argv) > 1 else _default_params_path() + with open(config_file) as f: + cfg = json.load(f) + + sofaRun(mesh_file=_default_mesh_path() + , T=float(cfg["T"]) + , radius=float(cfg["radius"]) + , young_modulus=float(cfg["youngModulus"]) + , poisson_ratio=float(cfg["poissonRatio"])) \ No newline at end of file diff --git a/examples/Freefem/projet_validation/common/__init__.py b/examples/Freefem/projet_validation/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/common/env_setup.py b/examples/Freefem/projet_validation/common/env_setup.py new file mode 100644 index 00000000..f8d34119 --- /dev/null +++ b/examples/Freefem/projet_validation/common/env_setup.py @@ -0,0 +1,39 @@ +""" +Correctif Windows : pyfreefem invoque en interne l'utilitaire Unix `stdbuf` +pour capturer la sortie de FreeFem++ en temps reel. Cet utilitaire n'existe +pas nativement sous Windows, mais Git for Windows en fournit une version +dans son propre dossier (Git\\usr\\bin). + +Importer ce module (import common.env_setup, ou depuis un run.py : +from . import env_setup en remontant jusqu'a common) applique le correctif +automatiquement, sans dependre d'une cellule de notebook executee au bon +moment / dans le bon kernel. +""" +import os + +# Chemins candidats, dans l'ordre de priorite. Le premier qui existe est +# utilise. Si aucun n'existe, le correctif est silencieusement ignore +# (sur Linux/Mac, stdbuf existe deja nativement -> rien a faire). +_CANDIDATE_PATHS = [ + r"C:\Program Files\Git\usr\bin", + r"C:\Program Files (x86)\Git\usr\bin", +] + + +def ensure_stdbuf_available(): + """Ajoute le dossier contenant stdbuf.exe au PATH du processus courant, + si ce n'est pas deja fait. Sans effet si aucun chemin candidat n'existe + (ex: sur Linux/Mac) ou si le PATH le contient deja.""" + if os.name != "nt": + return + current_path = os.environ.get("PATH", "") + for candidate in _CANDIDATE_PATHS: + if candidate in current_path: + return + if os.path.isfile(os.path.join(candidate, "stdbuf.exe")): + os.environ["PATH"] = current_path + os.pathsep + candidate + return + + +# Applique le correctif des l'import de ce module. +ensure_stdbuf_available() diff --git a/examples/Freefem/projet_validation/common/metrics.py b/examples/Freefem/projet_validation/common/metrics.py new file mode 100644 index 00000000..31f858ad --- /dev/null +++ b/examples/Freefem/projet_validation/common/metrics.py @@ -0,0 +1,160 @@ +""" +Métriques génériques de comparaison, utilisées par tous les cas de validation +(1D, 2D, 3D, torsion...). +""" +import numpy as np + + +def rms(a, b): + """Norme RMS entre deux champs : ||a - b||_2 / sqrt(n).""" + a = np.asarray(a) + b = np.asarray(b) + return np.linalg.norm(a - b) / np.sqrt(a.size) + + +def compare_and_report(results): + """ + Affiche les normes RMS pertinentes à partir d'un dict de résultats + produit par un run_case() (voir cases/bar_1d/run.py pour le format 1D, + cases/case_2d/distributed_load/run.py pour le format vectoriel 2D/3D). + + Clés attendues : 'label', 'u_ff', 'u_sofa', et optionnellement 'u_ana'. + Si 'u_sofa'/'u_ff' sont des tableaux (n, dim) avec dim > 1, un RMS est + aussi affiché composante par composante (ux, uy, ... ou 'component_names' + si fourni dans le dict), comme dans comparaison_script_2d.py. + """ + label = results.get("label", "Cas") + u_ff = np.asarray(results["u_ff"]) + u_sofa = np.asarray(results["u_sofa"]) + u_ana = results.get("u_ana") + + print(f"--- {label} ---") + print(f"RMS(sofa, ff) = {rms(u_sofa, u_ff):.6e}") + if u_ana is not None: + print(f"RMS(sofa, exact) = {rms(u_sofa, u_ana):.6e}") + print(f"RMS(ff, exact) = {rms(u_ff, u_ana):.6e}") + + if u_sofa.ndim > 1 and u_sofa.shape[1] > 1: + names = results.get("component_names", [f"u{i}" for i in range(u_sofa.shape[1])]) + print("RMS par composante (SOFA vs FreeFem) :") + for i, name in enumerate(names): + print(f" RMS_{name} (sofa, ff) = {rms(u_sofa[:, i], u_ff[:, i]):.6e}") + + +def compare_far_field(results, mean_shift_components=("uy",)): + """ + Vérification analytique en zone lointaine, pour les cas où le champ + exact n'est valable qu'à distance du bord encastré (effet Saint-Venant, + ex: cases/case_2d/compression/run.py). + + Clés attendues dans `results` : 'coords_sofa', 'u_sofa', + 'u_far_field_ana', 'saint_venant_x'. Ne fait rien si ces clés sont + absentes (cas qui n'a pas de champ lointain). + + `mean_shift_components` : noms de composantes (parmi 'component_names') + à recentrer sur leur moyenne avant comparaison (utile quand une + translation/rotation rigide n'est pas fixée par les conditions aux + limites, ex: uy dans le cas compression). + """ + u_ana = results.get("u_far_field_ana") + threshold = results.get("saint_venant_x") + if u_ana is None or threshold is None: + return + + coords = np.asarray(results["coords_sofa"]) + u_sofa = np.asarray(results["u_sofa"]) + u_ana = np.asarray(u_ana) + names = results.get("component_names", [f"u{i}" for i in range(u_sofa.shape[1])]) + + mask = coords[:, 0] >= threshold + if not mask.any(): + print(f"Aucun noeud au-dela du seuil Saint-Venant (x >= {threshold:.3f}).") + return + + print(f"Far-field analytical check (x >= {threshold:.3f}) :") + for i, name in enumerate(names): + a = u_sofa[mask, i] + b = u_ana[mask, i] + if name in mean_shift_components: + a = a - a.mean() + b = b - b.mean() + print(f" RMS_{name} (sofa, analytique, mean-shifted) = {rms(a, b):.6e}") + else: + print(f" RMS_{name} (sofa, analytique) = {rms(a, b):.6e}") + + +def report_eb_check(results): + """ + Affiche la vérification Euler-Bernoulli indicative à mi-portée, pour + les cas qui en fournissent une (ex: cases/case_2d/three_point_bending). + + Ne fait rien si 'eb_check' est absent du dict de résultats. Rappel + explicite : ce n'est PAS une cible de validation stricte (poutre + courte, effets de cisaillement et concentrations de contrainte non + captés par la théorie de poutre 1D) — voir MATH_DESCRIPTION du cas. + """ + eb = results.get("eb_check") + if eb is None: + return + print("Verification Euler-Bernoulli (INDICATIVE uniquement, pas une " + "cible de validation stricte) :") + print(f" w_sofa (mi-portee) = {eb['w_sofa']:.6e}") + print(f" w_ff (mi-portee) = {eb['w_ff']:.6e}") + print(f" w_EB (analytique, poutre 1D) = {eb['w_eb']:.6e}") + print(f" ratio SOFA/EB = {eb['ratio_sofa_eb']:.4f} " + f"(un ecart ici est ATTENDU, pas un signe d'erreur)") + + +def report_midspan_deflection(results): + """ + Affiche la fleche au point milieu (SOFA vs FreeFem), pour les cas qui + fournissent 'midspan_deflection' (ex: cases/case_3d/three_point_bending). + Ne fait rien si la clé est absente. + """ + mid = results.get("midspan_deflection") + if mid is None: + return + print("Fleche au point le plus proche du milieu :") + print(f" w_sofa = {mid['w_sofa']:.6e}") + print(f" w_ff = {mid['w_ff']:.6e}") + + +def report_relative_error(results): + """ + Affiche les erreurs relatives (norme globale, en %) entre SOFA, + FreeFem et la solution analytique, quand elle est disponible. + Complementaire de compare_and_report (qui donne le RMS absolu) -- + utile quand les deplacements sont petits et que le RMS brut est peu + parlant seul. Ex: cases/case_3d/torsion. + + Clés attendues : 'u_sofa', 'u_ff', optionnellement 'u_ana'. + """ + u_sofa = np.asarray(results["u_sofa"]) + u_ff = np.asarray(results["u_ff"]) + u_ana = results.get("u_ana") + + def rel(ref, test): + denom = np.linalg.norm(ref) + return float(np.linalg.norm(test - ref) / denom) if denom > 0 else float("nan") + + print("Erreurs relatives (norme globale) :") + print(f" SOFA vs FreeFem = {rel(u_sofa, u_ff):.3%}") + if u_ana is not None: + u_ana = np.asarray(u_ana) + print(f" SOFA vs Analytique = {rel(u_ana, u_sofa):.3%}") + print(f" FreeFem vs Analytique = {rel(u_ana, u_ff):.3%}") + + +def report_torsion_angle(results): + """ + Affiche l'angle de torsion analytique (theta' et theta_total), pour + les cas qui le fournissent (ex: cases/case_3d/torsion). Ne fait rien + si les clés sont absentes. + """ + theta_prime = results.get("theta_prime") + theta_total = results.get("theta_total") + if theta_prime is None: + return + print(f"theta' (analytique) = {theta_prime:.6g} rad/m") + if theta_total is not None: + print(f"theta_total (analytique, sur toute la longueur) = {theta_total:.6g} rad") diff --git a/examples/Freefem/projet_validation/common/plotting.py b/examples/Freefem/projet_validation/common/plotting.py new file mode 100644 index 00000000..85832a82 --- /dev/null +++ b/examples/Freefem/projet_validation/common/plotting.py @@ -0,0 +1,157 @@ +""" +Fonctions de tracé génériques, utilisées par tous les cas de validation +(1D, 2D, 3D...). Un seul fichier pour tous les cas : + + - plot_displacement / plot_geometry -> cas 1D (champ scalaire, un axe x) + - plot_deformed_mesh_2d / plot_displacement_field_2d -> cas 2D/3D (champ vectoriel, maillage) + +Contrat attendu du dict `results` (retourné par run_case() de chaque cas) : + - "label" : str + - pour le 1D : "x_ff", "u_ff", "x_sofa", "u_sofa", "u_ana" (ou None) + - pour 2D/3D : "dim" (2 ou 3), "coords_sofa", "u_sofa", "coords_ff", "u_ff", + "u_ana" (ou None), "triangles" (optionnel, pour un rendu maillage) +""" +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.tri as mtri + + +# ------------------------------------------------------------------ +# Cas 1D — champ scalaire, un seul axe x +# ------------------------------------------------------------------ + +def plot_displacement(results): + """ + Trace u(x) pour les 3 approches (analytique, FreeFem, SOFA) à partir + d'un dict de résultats produit par un run_case() 1D. + """ + x_ff = results["x_ff"] + u_ff = results["u_ff"] + x_sofa = results["x_sofa"] + u_sofa = results["u_sofa"] + u_ana = results.get("u_ana") + title = results.get("label", "Comparaison des déplacements") + + fig, ax = plt.subplots(figsize=(7, 4.5)) + if u_ana is not None: + ax.plot(x_ff, u_ana, label="Analytique", linestyle="--", color="black") + ax.plot(x_ff, u_ff, label="FreeFEM", marker="o", markersize=4, linestyle="none") + ax.plot(x_sofa, u_sofa, label="SOFA", marker="x", markersize=5, linestyle="none") + ax.set_xlabel("x") + ax.set_ylabel("Déplacement u(x)") + ax.set_title(title) + ax.legend() + fig.tight_layout() + plt.show() + + +def plot_geometry(results, scale=None): + """ + Trace la géométrie repos vs déformée (schématique 1D) à partir + d'un dict de résultats produit par un run_case() 1D. + """ + x0 = results["x_sofa"] + u = results["u_sofa"] + title = results.get("label", "Géométrie — repos vs déformée") + + if scale is None: + span = x0[-1] - x0[0] + max_disp = np.max(np.abs(u)) or 1e-12 + scale = 0.15 * span / max_disp + + fig, ax = plt.subplots(figsize=(9, 2.5)) + y_rest, y_def = 1.0, 0.0 + ax.plot(x0, [y_rest] * len(x0), 'o-', color="gray", label="Configuration au repos") + ax.plot(x0 + scale * u, [y_def] * len(x0), 'o-', color="crimson", + label=f"Déformée (SOFA, ×{scale:.1f})") + ax.plot([0, 0], [y_def - 0.3, y_rest + 0.3], 'k-', linewidth=3) + ax.set_yticks([y_def, y_rest]) + ax.set_yticklabels(["déformée", "repos"]) + ax.set_xlabel("x") + ax.set_title(title) + ax.legend(loc="upper right", fontsize=8) + ax.set_ylim(y_def - 0.6, y_rest + 0.6) + fig.tight_layout() + plt.show() + + +# ------------------------------------------------------------------ +# Cas 2D/3D — champ vectoriel, maillage +# ------------------------------------------------------------------ +# Fidèle à comparaison_script_2d.py : une grille [SOFA | FreeFem | Diff] +# par composante du déplacement (ux, uy, ...), tripcolor sur le maillage. + +def _triangulation(results): + """Renvoie une Triangulation matplotlib à partir de 'triangles' + 'coords_sofa'.""" + tris = results.get("triangles") + if tris is None: + return None + coords = results["coords_sofa"] + return mtri.Triangulation(coords[:, 0], coords[:, 1], tris) + + +def plot_fields_2d(results): + """ + Grille [SOFA | FreeFem | Diff] x [une ligne par composante], comme dans + comparaison_script_2d.py (ex: ux en haut, uy en bas). + + Si 'vline_x' est présent dans `results` (ex: seuil Saint-Venant du cas + compression), un trait pointillé vertical est tracé sur chaque sous-plot. + """ + u_sofa = np.asarray(results["u_sofa"]) + u_ff = np.asarray(results["u_ff"]) + names = results.get("component_names", [f"u{i}" for i in range(u_sofa.shape[1])]) + triang = _triangulation(results) + coords = results["coords_sofa"] + vline_x = results.get("vline_x") + + def _plot_field(ax, vals, title, cmap="viridis"): + if triang is not None: + tc = ax.tripcolor(triang, vals, shading="gouraud", cmap=cmap) + else: + tc = ax.scatter(coords[:, 0], coords[:, 1], c=vals, cmap=cmap, s=10) + plt.colorbar(tc, ax=ax) + ax.set_title(title) + ax.set_aspect("equal") + if vline_x is not None: + ax.axvline(vline_x, color="k", ls="--", lw=0.8) + + n_comp = len(names) + fig, axes = plt.subplots(n_comp, 3, figsize=(16, 4 * n_comp), squeeze=False) + fig.suptitle(results.get("label", "Comparaison des champs"), fontsize=14) + for row, name in enumerate(names): + vs = u_sofa[:, row] + vf = u_ff[:, row] + _plot_field(axes[row, 0], vs, f"SOFA : {name}") + _plot_field(axes[row, 1], vf, f"FreeFEM : {name}") + _plot_field(axes[row, 2], vs - vf, f"Diff {name}", "RdBu") + plt.tight_layout() + plt.show() + + +def plot_parity(results): + """ + Nuage de points SOFA vs FreeFem par composante, avec la diagonale y=x + en référence (comme comparaison_script3d.py). Utile en 3D, où une + carte de couleur sur le maillage (tripcolor) ne s'applique pas + directement (tétraèdres). Fonctionne pour n'importe quelle dimension. + """ + u_sofa = np.asarray(results["u_sofa"]) + u_ff = np.asarray(results["u_ff"]) + names = results.get("component_names", [f"u{i}" for i in range(u_sofa.shape[1])]) + + n_comp = len(names) + fig, axes = plt.subplots(1, n_comp, figsize=(5 * n_comp, 5), squeeze=False) + fig.suptitle(results.get("label", "SOFA vs FreeFem (parité)"), fontsize=14) + for i, name in enumerate(names): + ax = axes[0, i] + a, b = u_sofa[:, i], u_ff[:, i] + ax.scatter(a, b, s=8, alpha=0.6) + lims = [min(a.min(), b.min()), max(a.max(), b.max())] + ax.plot(lims, lims, 'r--', linewidth=1) + ax.set_xlabel(f"{name}_sofa") + ax.set_ylabel(f"{name}_ff") + ax.set_title(name) + ax.set_aspect('equal') + plt.tight_layout() + plt.show() diff --git a/examples/Freefem/projet_validation/notebook_validation.ipynb b/examples/Freefem/projet_validation/notebook_validation.ipynb new file mode 100644 index 00000000..c45cc9c1 --- /dev/null +++ b/examples/Freefem/projet_validation/notebook_validation.ipynb @@ -0,0 +1,536 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Validation des solveurs — SOFA vs FreeFem++ vs analytique\n", + "\n", + "## Objectif\n", + "\n", + "Valider le solveur éléments finis de SOFA (`LinearSmallStrainFEMForceField`) en le comparant,\n", + "cas par cas, à FreeFem++ (référence numérique indépendante) et, quand elle existe, à la\n", + "solution analytique (référence exacte).\n", + "\n", + "## Organisation du projet\n", + "\n", + "```\n", + "projet_validation/\n", + "├── notebook_validation.ipynb <- ce fichier\n", + "├── common/ <- métriques et tracés génériques\n", + "└── cases/\n", + " ├── bar_1d/ <- ce notebook l'utilise\n", + " ├── case_2d/ <- à ajouter selon le même schéma\n", + " ├── case_3d/\n", + " └── case_3d_torsion/\n", + "```\n", + "\n", + "Chaque cas expose une seule fonction `run_case()` qui encapsule tout le détail\n", + "(paramètres, appel FreeFem, appel SOFA, calcul analytique). Le notebook ne fait\n", + "qu'importer et appeler — aucun détail d'implémentation ne traîne ici." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Imports — tous les cas et utilitaires, en un seul endroit" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os\n", + "sys.path.insert(0, os.getcwd())\n", + "\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams[\"figure.dpi\"] = 110\n", + "\n", + "from common.metrics import compare_and_report, compare_far_field, report_eb_check, report_midspan_deflection, report_relative_error, report_torsion_angle\n", + "from common.plotting import plot_displacement, plot_geometry, plot_fields_2d, plot_parity\n", + "\n", + "from cases.bar_1d.run import run_case as run_bar_1d, MATH_DESCRIPTION as MATH_1D\n", + "from cases.case_2d.distributed_load.run import run_case as run_2d_dist, MATH_DESCRIPTION as MATH_2D_DIST\n", + "from cases.case_2d.compression.run import run_case as run_2d_compression, MATH_DESCRIPTION as MATH_2D_COMPRESSION\n", + "from cases.case_2d.three_point_bending.run import run_case as run_3pt_bending, MATH_DESCRIPTION as MATH_2D_3PT\n", + "from cases.case_3d.distributed_load.run import run_case as run_3d_dist, MATH_DESCRIPTION as MATH_3D_DIST\n", + "from cases.case_3d.three_point_bending.run import run_case as run_3d_3pt, MATH_DESCRIPTION as MATH_3D_3PT\n", + "from cases.case_3d.circular_traction.run import run_case as run_3d_circular, MATH_DESCRIPTION as MATH_3D_CIRCULAR\n", + "from cases.case_3d.circular_bending.run import run_case as run_3d_circular_bending, MATH_DESCRIPTION as MATH_3D_CIRCULAR_BENDING\n", + "from cases.case_3d.torsion.run import run_case as run_3d_torsion, MATH_DESCRIPTION as MATH_3D_TORSION\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 1 — Barre 1D, charge répartie" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_1D)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_1d = run_bar_1d()\n", + "compare_and_report(results_1d)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_displacement(results_1d)\n", + "plot_geometry(results_1d)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 2 — Poutre 2D, charge distribuée\n", + "\n", + "Le mode se choisit à l'appel de `run_2d_dist(mode=...)` : `\"plane_strain\"` (défaut) ou `\"plane_stress\"`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_2D_DIST)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_2d_dist = run_2d_dist(mode=\"plane_strain\") # ou mode=\"plane_stress\"\n", + "compare_and_report(results_2d_dist)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pas de solution analytique pour ce cas : la validation se fait uniquement par cross-comparaison SOFA vs FreeFem (RMS global + RMS par composante ux/uy, et visuel du champ)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_fields_2d(results_2d_dist)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 3 — Poutre 2D, compression (traction en bord droit)\n", + "\n", + "Le mode se choisit à l'appel de `run_2d_compression(mode=...)` : `\"plane_strain\"` (défaut) ou `\"plane_stress\"` — la solution analytique en champ lointain change aussi selon le mode." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_2D_COMPRESSION)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_2d_compression = run_2d_compression(mode=\"plane_strain\") # ou mode=\"plane_stress\"\n", + "compare_and_report(results_2d_compression)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "En plus du RMS SOFA vs FreeFem (valable partout), une vérification analytique en champ lointain est possible : la solution exacte de compression uniforme n'est valable qu'à distance du bord encastré (effet Saint-Venant, seuil marqué en pointillés sur les graphiques ci-dessous)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compare_far_field(results_2d_compression)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_fields_2d(results_2d_compression)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 4 — Poutre 2D, flexion 3 points\n", + "\n", + "Le mode se choisit à l'appel de `run_3pt_bending(mode=...)` : `\"plane_strain\"` (défaut) ou `\"plane_stress\"`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_2D_3PT)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3pt = run_3pt_bending(mode=\"plane_strain\") # ou mode=\"plane_stress\"\n", + "compare_and_report(results_3pt)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Une vérification Euler-Bernoulli de la flèche à mi-portée est fournie **à titre indicatif seulement** — la poutre est courte et épaisse (L/H = 5), donc un écart avec la théorie de poutre 1D est attendu, pas un signe d'erreur." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "report_eb_check(results_3pt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_fields_2d(results_3pt)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 5 — Poutre 3D, charge distribuée (face supérieure)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_3D_DIST)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3d_dist = run_3d_dist()\n", + "compare_and_report(results_3d_dist)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pas de solution analytique pour ce cas : cross-validation SOFA vs FreeFem uniquement. En 3D, une carte de couleur sur le maillage (tripcolor) ne s'applique pas directement (tétraèdres) — on utilise un graphique de parité à la place (points proches de la diagonale = bon accord)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_parity(results_3d_dist)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 6 — Poutre 3D, flexion 3 points" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_3D_3PT)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3d_3pt = run_3d_3pt()\n", + "compare_and_report(results_3d_3pt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "report_midspan_deflection(results_3d_3pt)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_parity(results_3d_3pt)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 7 — Poutre 3D circulaire, traction axiale" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_3D_CIRCULAR)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3d_circular = run_3d_circular()\n", + "compare_and_report(results_3d_circular)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Vérification analytique en champ lointain (traction uniaxiale simple, valable pour x >= exclusionFactor·r). Ici pas de recentrage de moyenne nécessaire : la face x=0 est entièrement encastrée (ux=uy=uz=0 sur toute la face), donc aucune translation/rotation rigide résiduelle contrairement au cas compression 2D." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compare_far_field(results_3d_circular, mean_shift_components=())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_parity(results_3d_circular)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 8 — Poutre 3D circulaire, flexion (charge transverse vers le bas)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_3D_CIRCULAR_BENDING)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3d_circular_bending = run_3d_circular_bending()\n", + "compare_and_report(results_3d_circular_bending)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pas de référence analytique pour ce cas (cf. MATH_DESCRIPTION) : cross-validation SOFA vs FreeFem uniquement." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_parity(results_3d_circular_bending)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Cas 9 — Poutre 3D circulaire, torsion pure (dernier cas)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(MATH_3D_TORSION)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results_3d_torsion = run_3d_torsion()\n", + "compare_and_report(results_3d_torsion)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Contrairement aux autres cas 3D, la solution analytique est ici **exacte sur tout le domaine** (une section circulaire ne se gauchit pas sous torsion pure — pas de couche limite de Saint-Venant à exclure)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "report_relative_error(results_3d_torsion)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "report_torsion_angle(results_3d_torsion)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_parity(results_3d_torsion)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Écart visible sur ce cas** : contrairement aux cas de traction/flexion 3D, l'écart entre SOFA/FreeFem et l'analytique reste ici franchement perceptible sur le graphique de parité (points nettement décalés sous la diagonale pour uy/uz), pas seulement dans les RMS. Ce n'est pas un bug de script ni des formules `T/J` — la cause identifiée est le **locking numérique des tétraèdres P1** en régime de flexion/torsion, combiné à un **maillage encore trop grossier** pour ce mode de déformation (une étude de convergence sur le cas rectangulaire équivalent donne un ordre effectif ~0.26, très en dessous du O(h) attendu, et l'écart se réduit franchement en raffinant : 43%→31%→21%→17% de 105 à 1889 noeuds). Le cas de traction axiale pure n'est pas concerné par ce mode de locking, d'où l'accord quasi-exact obtenu au Cas 7.\n", + "\n", + "Piste d'action : raffiner le maillage circulaire (voir `mesh_size` dans `params.json`) et refaire cette cellule pour vérifier que l'écart SOFA/FreeFem/analytique diminue de façon monotone." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Conclusion\n", + "\n", + "- Les RMS et les visuels ci-dessus mesurent l'écart entre SOFA, FreeFem et (quand elle existe) l'analytique, pour chaque cas.\n", + "- Ce format (un module par cas + notebook qui n'orchestre que l'appel) permet d'ajouter de nouveaux cas de validation sans complexifier le notebook lui-même.\n", + "- Campagne de validation complète : 1D (barre), 2D (charge distribuée, compression, flexion 3 points — chacun en plane strain/stress), 3D (charge distribuée, flexion 3 points, traction circulaire, flexion circulaire, torsion).\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/examples/Freefem/projet_validation/results/.gitkeep b/examples/Freefem/projet_validation/results/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/examples/Freefem/projet_validation/results/sofa_beam2d_compression_plane_strain_results.txt b/examples/Freefem/projet_validation/results/sofa_beam2d_compression_plane_strain_results.txt new file mode 100644 index 00000000..35fcfe36 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam2d_compression_plane_strain_results.txt @@ -0,0 +1,107 @@ + x0 y0 ux uy +------------------------------------------------------ + 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.000000 -0.090836 -0.009105 + 1.000000 0.200000 -0.089762 -0.001305 + 0.000000 0.200000 0.000000 0.000000 + 0.000000 0.150000 0.000000 0.000000 + 0.000000 0.100000 0.000000 0.000000 + 0.000000 0.050000 0.000000 0.000000 + 0.050000 0.000000 -0.004911 -0.003069 + 0.100000 0.000000 -0.009279 -0.004033 + 0.150000 0.000000 -0.013663 -0.004496 + 0.200000 0.000000 -0.018117 -0.004811 + 0.250000 0.000000 -0.022620 -0.005085 + 0.300000 0.000000 -0.027149 -0.005351 + 0.350000 0.000000 -0.031691 -0.005616 + 0.400000 0.000000 -0.036238 -0.005883 + 0.450000 0.000000 -0.040787 -0.006151 + 0.500000 0.000000 -0.045336 -0.006419 + 0.550000 0.000000 -0.049886 -0.006688 + 0.600000 0.000000 -0.054436 -0.006956 + 0.650000 0.000000 -0.058986 -0.007225 + 0.700000 0.000000 -0.063536 -0.007493 + 0.750000 0.000000 -0.068086 -0.007762 + 0.800000 0.000000 -0.072636 -0.008030 + 0.850000 0.000000 -0.077186 -0.008299 + 0.900000 0.000000 -0.081736 -0.008568 + 0.950000 0.000000 -0.086286 -0.008836 + 1.000000 0.050000 -0.090568 -0.007155 + 1.000000 0.100000 -0.090299 -0.005205 + 1.000000 0.150000 -0.090031 -0.003255 + 0.950000 0.200000 -0.085212 -0.001036 + 0.900000 0.200000 -0.080662 -0.000768 + 0.850000 0.200000 -0.076112 -0.000499 + 0.800000 0.200000 -0.071562 -0.000230 + 0.750000 0.200000 -0.067012 0.000038 + 0.700000 0.200000 -0.062462 0.000307 + 0.650000 0.200000 -0.057912 0.000575 + 0.600000 0.200000 -0.053362 0.000844 + 0.550000 0.200000 -0.048812 0.001112 + 0.500000 0.200000 -0.044262 0.001381 + 0.450000 0.200000 -0.039712 0.001651 + 0.400000 0.200000 -0.035161 0.001921 + 0.350000 0.200000 -0.030612 0.002195 + 0.300000 0.200000 -0.026066 0.002473 + 0.250000 0.200000 -0.021529 0.002756 + 0.200000 0.200000 -0.017019 0.003031 + 0.150000 0.200000 -0.012571 0.003242 + 0.100000 0.200000 -0.008231 0.003224 + 0.050000 0.200000 -0.004013 0.002571 + 0.050000 0.150000 -0.003815 0.001152 + 0.100000 0.150000 -0.008133 0.001445 + 0.150000 0.150000 -0.012643 0.001331 + 0.200000 0.150000 -0.017205 0.001080 + 0.250000 0.150000 -0.021769 0.000799 + 0.300000 0.150000 -0.026326 0.000518 + 0.350000 0.150000 -0.030879 0.000243 + 0.400000 0.150000 -0.035431 -0.000029 + 0.450000 0.150000 -0.039981 -0.000300 + 0.500000 0.150000 -0.044531 -0.000569 + 0.550000 0.150000 -0.049081 -0.000838 + 0.600000 0.150000 -0.053631 -0.001106 + 0.650000 0.150000 -0.058181 -0.001375 + 0.700000 0.150000 -0.062731 -0.001643 + 0.750000 0.150000 -0.067281 -0.001912 + 0.800000 0.150000 -0.071831 -0.002180 + 0.850000 0.150000 -0.076381 -0.002449 + 0.900000 0.150000 -0.080931 -0.002718 + 0.950000 0.150000 -0.085481 -0.002986 + 0.050000 0.100000 -0.003813 -0.000056 + 0.100000 0.100000 -0.008215 -0.000309 + 0.150000 0.100000 -0.012821 -0.000615 + 0.200000 0.100000 -0.017432 -0.000900 + 0.250000 0.100000 -0.022018 -0.001173 + 0.300000 0.100000 -0.026587 -0.001444 + 0.350000 0.100000 -0.031145 -0.001713 + 0.400000 0.100000 -0.035698 -0.001982 + 0.450000 0.100000 -0.040249 -0.002250 + 0.500000 0.100000 -0.044799 -0.002519 + 0.550000 0.100000 -0.049349 -0.002788 + 0.600000 0.100000 -0.053899 -0.003056 + 0.650000 0.100000 -0.058449 -0.003325 + 0.700000 0.100000 -0.062999 -0.003593 + 0.750000 0.100000 -0.067549 -0.003862 + 0.800000 0.100000 -0.072099 -0.004130 + 0.850000 0.100000 -0.076649 -0.004399 + 0.900000 0.100000 -0.081199 -0.004668 + 0.950000 0.100000 -0.085749 -0.004936 + 0.050000 0.050000 -0.003977 -0.001297 + 0.100000 0.050000 -0.008583 -0.002154 + 0.150000 0.050000 -0.013176 -0.002581 + 0.200000 0.050000 -0.017748 -0.002876 + 0.250000 0.050000 -0.022309 -0.003141 + 0.300000 0.050000 -0.026864 -0.003403 + 0.350000 0.050000 -0.031416 -0.003667 + 0.400000 0.050000 -0.035967 -0.003933 + 0.450000 0.050000 -0.040517 -0.004201 + 0.500000 0.050000 -0.045068 -0.004469 + 0.550000 0.050000 -0.049618 -0.004738 + 0.600000 0.050000 -0.054168 -0.005006 + 0.650000 0.050000 -0.058718 -0.005275 + 0.700000 0.050000 -0.063268 -0.005543 + 0.750000 0.050000 -0.067818 -0.005812 + 0.800000 0.050000 -0.072368 -0.006080 + 0.850000 0.050000 -0.076918 -0.006349 + 0.900000 0.050000 -0.081468 -0.006618 + 0.950000 0.050000 -0.086018 -0.006886 diff --git a/examples/Freefem/projet_validation/results/sofa_beam2d_distributed_plane_strain_results.txt b/examples/Freefem/projet_validation/results/sofa_beam2d_distributed_plane_strain_results.txt new file mode 100644 index 00000000..1ac917eb --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam2d_distributed_plane_strain_results.txt @@ -0,0 +1,107 @@ + x0 y0 ux uy +------------------------------------------------------ + 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.000000 -3.626553 -28.618040 + 1.000000 0.200000 3.674850 -28.616651 + 0.000000 0.200000 0.000000 0.000000 + 0.000000 0.150000 0.000000 0.000000 + 0.000000 0.100000 0.000000 0.000000 + 0.000000 0.050000 0.000000 0.000000 + 0.050000 0.000000 -0.478439 -0.362433 + 0.100000 0.000000 -0.954188 -0.848350 + 0.150000 0.000000 -1.381804 -1.541498 + 0.200000 0.000000 -1.759377 -2.428873 + 0.250000 0.000000 -2.090623 -3.487566 + 0.300000 0.000000 -2.379614 -4.695605 + 0.350000 0.000000 -2.629713 -6.033013 + 0.400000 0.000000 -2.843897 -7.481309 + 0.450000 0.000000 -3.024993 -9.023331 + 0.500000 0.000000 -3.175779 -10.643238 + 0.550000 0.000000 -3.299023 -12.326528 + 0.600000 0.000000 -3.397488 -14.060068 + 0.650000 0.000000 -3.473941 -15.832098 + 0.700000 0.000000 -3.531149 -17.632238 + 0.750000 0.000000 -3.571885 -19.451492 + 0.800000 0.000000 -3.598924 -21.282251 + 0.850000 0.000000 -3.615061 -23.118295 + 0.900000 0.000000 -3.623120 -24.954819 + 0.950000 0.000000 -3.625985 -26.788518 + 1.000000 0.050000 -1.798131 -28.616610 + 1.000000 0.100000 0.025699 -28.615579 + 1.000000 0.150000 1.848800 -28.616160 + 0.950000 0.200000 3.674257 -26.789261 + 0.900000 0.200000 3.671254 -24.957129 + 0.850000 0.200000 3.662683 -23.121922 + 0.800000 0.200000 3.645686 -21.287104 + 0.750000 0.200000 3.617490 -19.457552 + 0.700000 0.200000 3.575328 -17.639504 + 0.650000 0.200000 3.516430 -15.840573 + 0.600000 0.200000 3.438027 -14.069754 + 0.550000 0.200000 3.337350 -12.337428 + 0.500000 0.200000 3.211632 -10.655360 + 0.450000 0.200000 3.058109 -9.036703 + 0.400000 0.200000 2.874029 -7.496003 + 0.350000 0.200000 2.656671 -6.049200 + 0.300000 0.200000 2.403395 -4.713634 + 0.250000 0.200000 2.111749 -3.508023 + 0.200000 0.200000 1.779682 -2.452324 + 0.150000 0.200000 1.405872 -1.567189 + 0.100000 0.200000 0.989926 -0.872007 + 0.050000 0.200000 0.530419 -0.376083 + 0.050000 0.050000 -0.224328 -0.230149 + 0.050000 0.100000 -0.008985 -0.188937 + 0.050000 0.150000 0.210248 -0.223086 + 0.100000 0.050000 -0.453663 -0.712243 + 0.100000 0.100000 -0.006941 -0.670872 + 0.100000 0.150000 0.453655 -0.725622 + 0.150000 0.050000 -0.663109 -1.418201 + 0.150000 0.100000 0.000665 -1.382902 + 0.150000 0.150000 0.671904 -1.434363 + 0.200000 0.050000 -0.849606 -2.319822 + 0.200000 0.100000 0.006285 -2.288222 + 0.200000 0.150000 0.865193 -2.333534 + 0.250000 0.050000 -1.014662 -3.391748 + 0.250000 0.100000 0.010014 -3.363418 + 0.250000 0.150000 1.035518 -3.402932 + 0.300000 0.050000 -1.159475 -4.612167 + 0.300000 0.100000 0.012638 -4.587203 + 0.300000 0.150000 1.184628 -4.621593 + 0.350000 0.050000 -1.285226 -5.961164 + 0.350000 0.100000 0.014677 -5.939589 + 0.350000 0.150000 1.314083 -5.969419 + 0.400000 0.050000 -1.393184 -7.420226 + 0.400000 0.100000 0.016398 -7.401921 + 0.400000 0.150000 1.425350 -7.427631 + 0.450000 0.050000 -1.484683 -8.972158 + 0.450000 0.100000 0.017918 -8.956910 + 0.450000 0.150000 1.519850 -8.978862 + 0.500000 0.050000 -1.561090 -10.601098 + 0.500000 0.100000 0.019286 -10.588645 + 0.500000 0.150000 1.598984 -10.607163 + 0.550000 0.050000 -1.623784 -12.292537 + 0.550000 0.100000 0.020518 -12.282595 + 0.550000 0.150000 1.664143 -12.297987 + 0.600000 0.050000 -1.674149 -14.033337 + 0.600000 0.100000 0.021619 -14.025613 + 0.600000 0.150000 1.716713 -14.038180 + 0.650000 0.050000 -1.713570 -15.811737 + 0.650000 0.100000 0.022590 -15.805936 + 0.650000 0.150000 1.758079 -15.815975 + 0.700000 0.050000 -1.743429 -17.617358 + 0.700000 0.100000 0.023431 -17.613185 + 0.700000 0.150000 1.789625 -17.620994 + 0.750000 0.050000 -1.765107 -19.441203 + 0.750000 0.100000 0.024144 -19.438367 + 0.750000 0.150000 1.812733 -19.444242 + 0.800000 0.050000 -1.779980 -21.275661 + 0.800000 0.100000 0.024730 -21.273876 + 0.800000 0.150000 1.828780 -21.278113 + 0.850000 0.050000 -1.789408 -23.114509 + 0.850000 0.100000 0.025197 -23.113500 + 0.850000 0.150000 1.839128 -23.116388 + 0.900000 0.050000 -1.794723 -24.952933 + 0.900000 0.100000 0.025556 -24.952433 + 0.900000 0.150000 1.845101 -24.954223 + 0.950000 0.050000 -1.797195 -26.787591 + 0.950000 0.100000 0.025791 -26.787253 + 0.950000 0.150000 1.847923 -26.788139 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3d_circle_bending_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3d_circle_bending_results.txt new file mode 100644 index 00000000..739c2129 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3d_circle_bending_results.txt @@ -0,0 +1,455 @@ + x0 y0 z0 ux uy uz +------------------------------------------------------------------------------ + 0.000000 0.100000 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.100000 0.000000 0.011868 -0.080165 -0.000554 + 0.000000 0.088546 0.046472 0.000000 0.000000 0.000000 + 0.000000 0.056806 0.082298 0.000000 0.000000 0.000000 + 0.000000 0.012054 0.099271 0.000000 0.000000 0.000000 + 0.000000 -0.035460 0.093502 0.000000 0.000000 0.000000 + 0.000000 -0.074851 0.066312 0.000000 0.000000 0.000000 + 0.000000 -0.097094 0.023932 0.000000 0.000000 0.000000 + 0.000000 -0.097094 -0.023932 0.000000 0.000000 0.000000 + 0.000000 -0.074851 -0.066312 0.000000 0.000000 0.000000 + 0.000000 -0.035460 -0.093502 0.000000 0.000000 0.000000 + 0.000000 0.012054 -0.099271 0.000000 0.000000 0.000000 + 0.000000 0.056806 -0.082298 0.000000 0.000000 0.000000 + 0.000000 0.088546 -0.046472 0.000000 0.000000 0.000000 + 0.050000 0.100000 0.000000 0.001059 -0.000626 0.000001 + 0.100000 0.100000 0.000000 0.002086 -0.001557 -0.000099 + 0.150000 0.100000 0.000000 0.003137 -0.002972 -0.000009 + 0.200000 0.100000 0.000000 0.004188 -0.004874 -0.000088 + 0.250000 0.100000 0.000000 0.005131 -0.007242 -0.000068 + 0.300000 0.100000 0.000000 0.005906 -0.010115 -0.000151 + 0.350000 0.100000 0.000000 0.006753 -0.013354 -0.000133 + 0.400000 0.100000 0.000000 0.007583 -0.016982 -0.000147 + 0.450000 0.100000 0.000000 0.008188 -0.020974 -0.000151 + 0.500000 0.100000 0.000000 0.008785 -0.025262 -0.000242 + 0.550000 0.100000 0.000000 0.009381 -0.029965 -0.000279 + 0.600000 0.100000 0.000000 0.009880 -0.034778 -0.000287 + 0.650000 0.100000 0.000000 0.010386 -0.039910 -0.000324 + 0.700000 0.100000 0.000000 0.010736 -0.045278 -0.000355 + 0.750000 0.100000 0.000000 0.011096 -0.050803 -0.000398 + 0.800000 0.100000 0.000000 0.011347 -0.056506 -0.000426 + 0.850000 0.100000 0.000000 0.011588 -0.062277 -0.000453 + 0.900000 0.100000 0.000000 0.011730 -0.068193 -0.000499 + 0.950000 0.100000 0.000000 0.011831 -0.074146 -0.000525 + 1.000000 0.088546 0.046472 0.010533 -0.080144 -0.000565 + 1.000000 0.056806 0.082298 0.006789 -0.080116 -0.000560 + 1.000000 0.012054 0.099271 0.001494 -0.080103 -0.000534 + 1.000000 -0.035460 0.093502 -0.004145 -0.080102 -0.000506 + 1.000000 -0.074851 0.066312 -0.008817 -0.080126 -0.000491 + 1.000000 -0.097094 0.023932 -0.011492 -0.080151 -0.000493 + 1.000000 -0.097094 -0.023932 -0.011514 -0.080166 -0.000511 + 1.000000 -0.074851 -0.066312 -0.008909 -0.080161 -0.000531 + 1.000000 -0.035460 -0.093502 -0.004257 -0.080154 -0.000531 + 1.000000 0.012054 -0.099271 0.001372 -0.080152 -0.000528 + 1.000000 0.056806 -0.082298 0.006693 -0.080161 -0.000527 + 1.000000 0.088546 -0.046472 0.010479 -0.080170 -0.000538 + 0.000000 0.059035 -0.015090 0.000000 0.000000 0.000000 + 0.000000 -0.049270 0.025859 0.000000 0.000000 0.000000 + 0.000000 -0.006707 -0.055238 0.000000 0.000000 0.000000 + 0.000000 0.022489 0.052426 0.000000 0.000000 0.000000 + 0.000000 -0.049270 -0.025859 0.000000 0.000000 0.000000 + 0.000000 -0.041572 -0.060228 0.000000 0.000000 0.000000 + 0.000000 -0.011181 -0.007010 0.000000 0.000000 0.000000 + 0.000000 -0.004613 0.030407 0.000000 0.000000 0.000000 + 0.000000 0.023823 -0.030419 0.000000 0.000000 0.000000 + 0.000000 0.025401 0.008627 0.000000 0.000000 0.000000 + 0.000000 0.058713 0.029122 0.000000 0.000000 0.000000 + 0.000000 -0.021609 0.061296 0.000000 0.000000 0.000000 + 0.000000 0.052972 -0.047906 0.000000 0.000000 0.000000 + 0.000000 -0.073182 0.000000 0.000000 0.000000 0.000000 + 0.000000 0.026479 -0.065312 0.000000 0.000000 0.000000 + 0.525000 0.090625 -0.042274 0.008229 -0.027515 -0.000123 + 0.325000 0.090625 -0.042274 0.005753 -0.011532 0.000008 + 0.724732 0.090601 -0.042325 0.009867 -0.047968 -0.000296 + 0.224909 0.090649 0.042223 0.004222 -0.005837 -0.000248 + 0.374961 0.090479 0.042586 0.006423 -0.015076 -0.000286 + 0.524696 0.090516 0.042506 0.008271 -0.027489 -0.000365 + 0.675000 0.090625 0.042274 0.009578 -0.042522 -0.000416 + 0.036667 -0.088917 -0.045758 -0.000733 -0.000352 -0.000164 + 0.960964 -0.088549 0.046465 -0.010441 -0.075442 -0.000468 + 0.958651 -0.056806 -0.082298 -0.006765 -0.075185 -0.000503 + 0.045446 -0.055609 0.083112 -0.000530 -0.000255 0.000241 + 0.175000 0.090625 -0.042274 0.003279 -0.003718 0.000126 + 0.825000 0.090625 0.042274 0.010414 -0.059339 -0.000489 + 0.824893 0.090591 -0.042346 0.010372 -0.059351 -0.000390 + 0.625000 0.090625 -0.042274 0.009142 -0.037285 -0.000200 + 0.425000 0.090625 -0.042274 0.007074 -0.018873 -0.000038 + 0.125001 0.090706 0.042100 0.002384 -0.002129 -0.000247 + 0.958651 0.035460 -0.093502 0.004140 -0.075183 -0.000501 + 0.041642 0.031911 -0.094772 0.000250 -0.000178 0.000066 + 0.965890 0.034814 0.093744 0.004184 -0.076004 -0.000525 + 0.038275 0.030804 0.095137 0.000312 -0.000076 -0.000153 + 0.925000 0.090625 -0.042274 0.010662 -0.071165 -0.000486 + 0.075000 0.090625 -0.042274 0.001425 -0.000976 0.000147 + 0.925000 0.090625 0.042274 0.010708 -0.071144 -0.000526 + 0.675232 0.090683 -0.042150 0.009525 -0.042569 -0.000268 + 0.700062 0.064666 -0.076278 0.006914 -0.045190 -0.000236 + 0.749899 0.064561 -0.076367 0.007109 -0.050710 -0.000309 + 0.724542 0.026931 -0.096305 0.002889 -0.047838 -0.000308 + 0.773743 0.026685 -0.096374 0.002934 -0.053366 -0.000353 + 0.748905 -0.015668 -0.098765 -0.001798 -0.050549 -0.000393 + 0.699628 -0.015430 -0.098802 -0.001716 -0.045067 -0.000361 + 0.797869 -0.015993 -0.098713 -0.001858 -0.056139 -0.000413 + 0.773182 -0.055346 -0.083288 -0.006247 -0.053344 -0.000436 + 0.821950 -0.055468 -0.083207 -0.006411 -0.058967 -0.000454 + 0.797472 -0.084917 -0.052811 -0.009649 -0.056194 -0.000445 + 0.748473 -0.084798 -0.053003 -0.009411 -0.050586 -0.000416 + 0.772682 -0.099158 -0.012948 -0.011111 -0.053389 -0.000392 + 0.723604 -0.099135 -0.013127 -0.010811 -0.047851 -0.000371 + 0.748038 -0.095558 0.029473 -0.010544 -0.050563 -0.000311 + 0.698758 -0.095620 0.029272 -0.010230 -0.045119 -0.000260 + 0.797230 -0.095486 0.029707 -0.010803 -0.056147 -0.000341 + 0.772471 -0.074581 0.066616 -0.008299 -0.053247 -0.000302 + 0.821601 -0.074400 0.066818 -0.008451 -0.058921 -0.000334 + 0.846357 -0.085072 -0.052562 -0.009857 -0.061843 -0.000456 + 0.796937 -0.039986 0.091657 -0.004456 -0.055996 -0.000347 + 0.747656 -0.040110 0.091604 -0.004381 -0.050380 -0.000296 + 0.846007 -0.039875 0.091706 -0.004546 -0.061714 -0.000389 + 0.846867 -0.016336 -0.098657 -0.001940 -0.061853 -0.000452 + 0.674296 -0.099097 -0.013406 -0.010466 -0.042474 -0.000320 + 0.649399 -0.095681 0.029071 -0.009856 -0.039829 -0.000206 + 0.624888 -0.099059 -0.013689 -0.010014 -0.037316 -0.000292 + 0.600009 -0.095744 0.028862 -0.009417 -0.034801 -0.000171 + 0.575386 -0.099019 -0.013974 -0.009514 -0.032381 -0.000226 + 0.550574 -0.095961 0.028134 -0.009051 -0.029934 -0.000129 + 0.525822 -0.098979 -0.014253 -0.009063 -0.027603 -0.000250 + 0.500696 -0.096069 0.027762 -0.008433 -0.025296 -0.000071 + 0.476246 -0.098934 -0.014562 -0.008388 -0.023171 -0.000205 + 0.451271 -0.096171 0.027406 -0.007882 -0.021020 -0.000094 + 0.426703 -0.098889 -0.014864 -0.007780 -0.019057 -0.000202 + 0.401388 -0.096235 0.027182 -0.007227 -0.017104 -0.000036 + 0.377116 -0.098845 -0.015154 -0.007086 -0.015252 -0.000185 + 0.352015 -0.096328 0.026851 -0.006474 -0.013374 -0.000009 + 0.327527 -0.098809 -0.015390 -0.006299 -0.011815 -0.000159 + 0.302577 -0.096294 0.026971 -0.005718 -0.010281 0.000054 + 0.278213 -0.098782 -0.015561 -0.005439 -0.008798 -0.000117 + 0.253409 -0.096346 0.026786 -0.005068 -0.007448 0.000064 + 0.228917 -0.098759 -0.015708 -0.004628 -0.006159 -0.000158 + 0.204418 -0.096445 0.026426 -0.004147 -0.005000 0.000079 + 0.253717 -0.083330 -0.055283 -0.004310 -0.007361 -0.000325 + 0.204670 -0.083234 -0.055426 -0.003569 -0.004916 -0.000265 + 0.277608 -0.076187 0.064773 -0.004174 -0.008646 0.000118 + 0.424057 -0.076994 0.063811 -0.006015 -0.018693 0.000018 + 0.600218 -0.084273 -0.053833 -0.008381 -0.034766 -0.000356 + 0.629427 -0.075407 0.065680 -0.007623 -0.037665 -0.000151 + 0.352669 -0.083391 -0.055190 -0.005693 -0.013432 -0.000332 + 0.451657 -0.083655 -0.054789 -0.006853 -0.021004 -0.000323 + 0.229277 -0.052893 -0.084867 -0.002570 -0.005865 -0.000288 + 0.180350 -0.052767 -0.084945 -0.002081 -0.003731 -0.000265 + 0.523425 -0.076761 0.064091 -0.006920 -0.027239 -0.000035 + 0.155835 -0.083087 -0.055647 -0.002746 -0.003105 -0.000309 + 0.131577 -0.052679 -0.084999 -0.001498 -0.002059 -0.000221 + 0.772183 0.001903 0.099982 0.000278 -0.053133 -0.000387 + 0.204958 -0.012816 -0.099175 -0.000607 -0.004606 -0.000106 + 0.254113 -0.012953 -0.099158 -0.000715 -0.007046 -0.000189 + 0.722723 0.001776 0.099984 0.000270 -0.047572 -0.000351 + 0.229641 0.029540 -0.095537 0.001304 -0.005831 0.000047 + 0.747359 0.043578 0.090005 0.004882 -0.050347 -0.000439 + 0.870305 -0.074142 0.067104 -0.008587 -0.064626 -0.000391 + 0.894759 -0.039701 0.091781 -0.004594 -0.067492 -0.000429 + 0.870307 0.001296 0.099992 0.000215 -0.064564 -0.000455 + 0.278967 0.029368 -0.095590 0.001640 -0.008467 0.000001 + 0.303419 -0.013188 -0.099127 -0.000877 -0.009893 -0.000171 + 0.698492 -0.040397 0.091477 -0.004265 -0.044945 -0.000234 + 0.673158 0.001598 0.099987 0.000255 -0.042158 -0.000318 + 0.328259 0.029099 -0.095673 0.001823 -0.011522 0.000003 + 0.352841 -0.013444 -0.099092 -0.000935 -0.013193 -0.000176 + 0.377483 0.028906 -0.095731 0.002018 -0.014966 -0.000000 + 0.402296 -0.013692 -0.099058 -0.001054 -0.016854 -0.000197 + 0.426957 0.028756 -0.095776 0.002169 -0.018817 -0.000068 + 0.451781 -0.013992 -0.099016 -0.001190 -0.020830 -0.000222 + 0.476485 0.028453 -0.095867 0.002337 -0.022928 -0.000108 + 0.501283 -0.014197 -0.098987 -0.001311 -0.025132 -0.000240 + 0.525983 0.028316 -0.095907 0.002498 -0.027399 -0.000148 + 0.550743 -0.014449 -0.098951 -0.001430 -0.029702 -0.000277 + 0.575572 0.028079 -0.095977 0.002638 -0.032124 -0.000184 + 0.600233 -0.014700 -0.098914 -0.001499 -0.034584 -0.000309 + 0.625161 0.027802 -0.096057 0.002759 -0.037147 -0.000234 + 0.180358 0.029742 -0.095475 0.001083 -0.003584 0.000107 + 0.525822 -0.054455 -0.083873 -0.004955 -0.027449 -0.000338 + 0.254289 0.065767 -0.075331 0.003357 -0.007315 0.000144 + 0.792194 0.042883 0.090339 0.004933 -0.055453 -0.000462 + 0.111839 -0.082722 -0.056188 -0.001964 -0.001719 -0.000188 + 0.131148 -0.098598 -0.016684 -0.002695 -0.002337 -0.000083 + 0.085492 -0.052857 -0.084889 -0.000953 -0.000898 -0.000223 + 0.107454 -0.013261 -0.099117 -0.000332 -0.001197 -0.000069 + 0.772046 0.077372 0.063353 0.008682 -0.053225 -0.000472 + 0.082654 -0.098557 -0.016930 -0.001826 -0.001149 -0.000113 + 0.106698 -0.096801 0.025091 -0.002207 -0.001778 0.000093 + 0.054684 -0.096940 0.024549 -0.001167 -0.000617 0.000138 + 0.725817 0.076916 0.063905 0.008455 -0.048016 -0.000461 + 0.917104 0.002073 0.099979 0.000307 -0.070140 -0.000477 + 0.885800 0.042128 0.090693 0.004983 -0.066418 -0.000505 + 0.941083 -0.038013 0.092493 -0.004426 -0.073029 -0.000465 + 0.082293 -0.078142 0.062401 -0.001246 -0.000978 0.000241 + 0.130546 -0.078002 0.062576 -0.002151 -0.002124 0.000196 + 0.106227 -0.045500 0.089049 -0.001008 -0.001267 0.000207 + 0.154798 -0.045209 0.089197 -0.001507 -0.002655 0.000171 + 0.127764 -0.003902 0.099924 -0.000073 -0.001686 -0.000044 + 0.178257 -0.004278 0.099908 -0.000113 -0.003460 -0.000014 + 0.203110 -0.044829 0.089389 -0.001868 -0.004632 0.000189 + 0.223241 -0.004716 0.099889 -0.000188 -0.005453 -0.000031 + 0.151941 0.036869 0.092955 0.001255 -0.002538 -0.000201 + 0.113836 0.038303 0.092374 0.001010 -0.001414 -0.000227 + 0.065614 -0.012347 0.099235 -0.000177 -0.000307 0.000063 + 0.774336 0.090459 -0.042628 0.010120 -0.053537 -0.000359 + 0.066096 -0.013117 -0.099136 -0.000139 -0.000396 -0.000064 + 0.649635 -0.014924 -0.098880 -0.001597 -0.039693 -0.000333 + 0.575218 0.090679 -0.042157 0.008736 -0.032317 -0.000175 + 0.875236 0.090684 -0.042148 0.010531 -0.065254 -0.000447 + 0.849752 0.064516 -0.076405 0.007412 -0.062238 -0.000400 + 0.799611 0.064534 -0.076390 0.007287 -0.056383 -0.000351 + 0.889249 0.063831 -0.076978 0.007418 -0.066887 -0.000444 + 0.874918 0.027087 -0.096261 0.003105 -0.065170 -0.000436 + 0.474805 0.090674 -0.042170 0.007626 -0.023018 -0.000077 + 0.374814 0.090671 -0.042175 0.006444 -0.015070 0.000054 + 0.124769 0.090683 -0.042150 0.002560 -0.002125 0.000185 + 0.110710 0.063924 -0.076900 0.001501 -0.001449 0.000215 + 0.155413 0.064653 -0.076289 0.002038 -0.002910 0.000222 + 0.874947 0.090841 0.041807 0.010627 -0.065201 -0.000505 + 0.855795 0.070081 0.071335 0.008175 -0.062903 -0.000511 + 0.846278 -0.095373 0.030068 -0.011007 -0.061853 -0.000382 + 0.890756 -0.095401 0.029977 -0.011133 -0.067077 -0.000419 + 0.174876 0.090819 0.041856 0.003369 -0.003823 -0.000308 + 0.202820 0.064448 0.076462 0.002785 -0.004690 -0.000292 + 0.251511 0.064742 0.076213 0.003329 -0.007088 -0.000377 + 0.823971 0.026834 -0.096333 0.003008 -0.059176 -0.000397 + 0.890033 -0.017901 -0.098385 -0.002145 -0.066959 -0.000472 + 0.155167 -0.096725 0.025384 -0.003059 -0.003056 0.000092 + 0.179719 -0.098632 -0.016482 -0.003637 -0.004095 -0.000172 + 0.303117 -0.083368 -0.055224 -0.005011 -0.010082 -0.000260 + 0.075136 0.090659 0.042201 0.001589 -0.000988 -0.000238 + 0.275000 0.090625 0.042274 0.005079 -0.008559 -0.000239 + 0.300221 0.064230 0.076645 0.003903 -0.009868 -0.000324 + 0.274136 0.026126 0.096527 0.001483 -0.008129 -0.000196 + 0.323773 0.025782 0.096619 0.001673 -0.011229 -0.000235 + 0.298653 -0.016959 0.098551 -0.001003 -0.009566 -0.000017 + 0.349006 -0.016779 0.098582 -0.001062 -0.012897 -0.000042 + 0.373476 0.025472 0.096701 0.001865 -0.014597 -0.000248 + 0.397928 -0.017731 0.098415 -0.001255 -0.016441 -0.000079 + 0.423146 0.025099 0.096799 0.002027 -0.018433 -0.000259 + 0.447524 -0.017671 0.098426 -0.001353 -0.020409 -0.000103 + 0.472882 0.024744 0.096890 0.002150 -0.022567 -0.000278 + 0.448318 0.063376 0.077353 0.005216 -0.020581 -0.000366 + 0.497796 -0.017854 0.098393 -0.001516 -0.024754 -0.000133 + 0.522669 0.024391 0.096980 0.002311 -0.027036 -0.000288 + 0.547585 -0.018154 0.098338 -0.001620 -0.029386 -0.000186 + 0.572447 0.024023 0.097072 0.002387 -0.031827 -0.000318 + 0.596972 -0.019297 0.098120 -0.001821 -0.034226 -0.000186 + 0.373972 -0.056744 0.082341 -0.003961 -0.014757 0.000063 + 0.622174 0.023591 0.097177 0.002462 -0.036794 -0.000358 + 0.597635 0.062463 0.078092 0.006190 -0.034400 -0.000429 + 0.473495 -0.055014 0.083507 -0.004648 -0.022709 -0.000015 + 0.647435 0.062154 0.078338 0.006497 -0.039498 -0.000417 + 0.566372 -0.055488 0.083193 -0.005226 -0.031276 -0.000113 + 0.324879 0.090401 0.042751 0.005761 -0.011566 -0.000340 + 0.224881 0.090655 -0.042211 0.004201 -0.005929 0.000119 + 0.675287 0.027133 -0.096249 0.002783 -0.042430 -0.000260 + 0.674537 -0.054961 -0.083542 -0.005831 -0.042405 -0.000416 + 0.402085 -0.083554 -0.054943 -0.006301 -0.017054 -0.000286 + 0.821070 0.001292 0.099992 0.000215 -0.058768 -0.000426 + 0.424820 0.090545 0.042445 0.007016 -0.018813 -0.000292 + 0.474583 0.090510 0.042520 0.007728 -0.022969 -0.000328 + 0.625181 0.090380 0.042795 0.009186 -0.037324 -0.000420 + 0.575014 0.090275 0.043017 0.008698 -0.032238 -0.000381 + 0.326943 -0.075904 0.065105 -0.004832 -0.011597 0.000091 + 0.156151 -0.013079 -0.099141 -0.000532 -0.002711 -0.000071 + 0.699048 -0.084629 -0.053272 -0.009112 -0.045155 -0.000425 + 0.398568 0.063631 0.077144 0.004867 -0.016646 -0.000329 + 0.547940 0.062795 0.077826 0.005971 -0.029539 -0.000378 + 0.498085 0.063069 0.077604 0.005561 -0.024924 -0.000375 + 0.723190 -0.074708 0.066474 -0.008080 -0.047726 -0.000243 + 0.723964 -0.055150 -0.083417 -0.006073 -0.047799 -0.000420 + 0.821591 -0.099169 -0.012867 -0.011366 -0.058968 -0.000412 + 0.871070 -0.099300 -0.011813 -0.011555 -0.064780 -0.000427 + 0.919684 -0.099355 -0.011339 -0.011682 -0.070528 -0.000463 + 0.895426 -0.086557 -0.050078 -0.010174 -0.067637 -0.000467 + 0.697790 0.043446 0.090069 0.004714 -0.044877 -0.000442 + 0.349087 0.063820 0.076987 0.004315 -0.013080 -0.000399 + 0.676280 -0.075020 0.066121 -0.007867 -0.042616 -0.000177 + 0.650472 0.064959 -0.076028 0.006685 -0.039860 -0.000203 + 0.868487 -0.055917 -0.082906 -0.006558 -0.064422 -0.000479 + 0.278588 -0.053059 -0.084763 -0.003010 -0.008516 -0.000254 + 0.654392 -0.041432 0.091013 -0.004229 -0.040178 -0.000223 + 0.178891 -0.077590 0.063086 -0.002917 -0.003765 0.000283 + 0.918522 -0.073654 0.067639 -0.008616 -0.070345 -0.000434 + 0.575414 -0.054577 -0.083793 -0.005301 -0.032184 -0.000366 + 0.649665 -0.084470 -0.053525 -0.008773 -0.039830 -0.000391 + 0.625275 -0.054705 -0.083710 -0.005591 -0.037208 -0.000388 + 0.327965 -0.053248 -0.084645 -0.003434 -0.011554 -0.000283 + 0.600625 0.065161 -0.075855 0.006437 -0.034738 -0.000160 + 0.377430 -0.053418 -0.084537 -0.003868 -0.015077 -0.000288 + 0.948402 -0.088136 -0.047244 -0.010426 -0.073964 -0.000492 + 0.963125 -0.010257 -0.099473 -0.001270 -0.075718 -0.000505 + 0.500903 -0.084033 -0.054208 -0.007483 -0.025285 -0.000347 + 0.476485 -0.053747 -0.084328 -0.004581 -0.023009 -0.000335 + 0.550554 -0.084287 -0.053811 -0.007884 -0.029919 -0.000333 + 0.426983 -0.053574 -0.084438 -0.004242 -0.018899 -0.000350 + 0.550230 0.065363 -0.075681 0.006084 -0.029761 -0.000118 + 0.228225 -0.077060 0.063732 -0.003636 -0.005917 0.000179 + 0.251848 -0.044157 0.089723 -0.002163 -0.007010 0.000115 + 0.500366 0.065447 -0.075608 0.005725 -0.025143 -0.000032 + 0.450809 0.065609 -0.075468 0.005311 -0.020856 -0.000021 + 0.400740 0.065734 -0.075359 0.004888 -0.016823 0.000012 + 0.351965 0.065313 -0.075725 0.004374 -0.013260 0.000056 + 0.033646 0.074411 0.066806 0.000455 -0.000202 -0.000205 + 0.966598 0.074878 -0.066282 0.008828 -0.076144 -0.000514 + 0.033427 0.074593 -0.066603 0.000479 -0.000249 0.000164 + 0.964490 0.074644 0.066545 0.008874 -0.075856 -0.000540 + 0.303478 0.065355 -0.075688 0.003913 -0.010061 0.000086 + 0.277315 0.091194 -0.041032 0.005047 -0.008753 0.000082 + 0.037991 -0.056806 -0.082298 -0.000484 -0.000203 -0.000210 + 0.131510 0.026971 -0.096294 0.000749 -0.001940 0.000125 + 0.203982 0.065301 -0.075735 0.002774 -0.004756 0.000186 + 0.960612 -0.100000 -0.000133 -0.011817 -0.075420 -0.000479 + 0.914474 -0.059025 -0.080722 -0.006988 -0.069897 -0.000485 + 0.086550 0.024394 -0.096979 0.000438 -0.000753 0.000098 + 0.917923 0.020360 -0.097905 0.002344 -0.070293 -0.000472 + 0.962712 -0.004728 0.099888 -0.000495 -0.075618 -0.000502 + 0.107533 0.071503 0.069910 0.001651 -0.001526 -0.000297 + 0.149985 0.071596 0.069814 0.002265 -0.002673 -0.000308 + 0.036722 -0.099650 -0.008355 -0.000765 -0.000457 -0.000016 + 0.203436 0.028801 0.095763 0.001286 -0.004578 -0.000222 + 0.036286 -0.083934 0.054361 -0.000599 -0.000296 0.000209 + 0.927880 0.057578 0.081760 0.006841 -0.071458 -0.000522 + 0.302010 -0.053042 0.084773 -0.003204 -0.009923 0.000085 + 0.836575 0.040049 0.091630 0.004678 -0.060605 -0.000473 + 0.028208 -0.012054 0.099271 -0.000055 -0.000004 0.000023 + 0.964818 -0.065575 0.075498 -0.007698 -0.075887 -0.000475 + 0.897259 0.073538 0.067766 0.008665 -0.067824 -0.000525 + 0.730514 0.095252 0.030447 0.010474 -0.048603 -0.000444 + 0.775000 0.095556 0.029481 0.010736 -0.053616 -0.000441 + 0.375655 -0.083669 0.054767 -0.005911 -0.015077 0.000085 + 0.964747 0.094055 -0.033965 0.011120 -0.075924 -0.000524 + 0.035253 0.094055 -0.033965 0.000657 -0.000402 0.000114 + 0.964747 0.094055 0.033965 0.011156 -0.075904 -0.000540 + 0.035259 0.094053 0.033970 0.000663 -0.000360 -0.000132 + 0.422555 -0.045571 0.089013 -0.003504 -0.018447 -0.000008 + 0.931344 -0.097243 0.023321 -0.011436 -0.071923 -0.000449 + 0.474978 -0.083833 0.054516 -0.007107 -0.022999 -0.000008 + 0.070715 0.057873 0.081552 0.000863 -0.000594 -0.000267 + 0.522098 -0.045600 0.088998 -0.004093 -0.027033 -0.000082 + 0.575367 -0.081963 0.057289 -0.007839 -0.032258 -0.000117 + 0.072018 -0.078212 -0.062313 -0.001221 -0.000792 -0.000215 + 0.813928 0.070348 0.071072 0.008089 -0.058008 -0.000486 + 0.239162 0.034483 0.093867 0.001777 -0.006287 -0.000203 + 0.934157 0.057817 -0.081592 0.006770 -0.072249 -0.000483 + 0.260137 -0.007402 0.099726 -0.000391 -0.007377 -0.000088 + 0.925760 -0.026069 -0.096542 -0.003125 -0.071235 -0.000487 + 0.081291 0.023952 0.097089 0.000459 -0.000634 -0.000113 + 0.065835 0.057776 -0.081621 0.000788 -0.000552 0.000171 + 0.684196 0.070254 0.071164 0.007514 -0.043463 -0.000448 + 0.024453 -0.012017 -0.099275 -0.000011 -0.000040 -0.000013 + 0.337740 -0.049421 0.086934 -0.003246 -0.012186 0.000064 + 0.631131 -0.013814 0.099041 -0.001333 -0.037715 -0.000246 + 0.604898 -0.051052 0.085986 -0.004972 -0.035079 -0.000131 + 1.000000 0.059035 -0.015090 0.006978 -0.080157 -0.000540 + 1.000000 -0.049270 0.025859 -0.005798 -0.080141 -0.000511 + 1.000000 -0.006707 -0.055238 -0.000819 -0.080154 -0.000528 + 1.000000 0.022489 0.052426 0.002698 -0.080126 -0.000538 + 1.000000 -0.049270 -0.025859 -0.005833 -0.080153 -0.000522 + 1.000000 -0.041572 -0.060228 -0.004950 -0.080156 -0.000527 + 1.000000 -0.011181 -0.007010 -0.001316 -0.080145 -0.000526 + 1.000000 -0.004613 0.030407 -0.000524 -0.080130 -0.000526 + 1.000000 0.023823 -0.030419 0.002797 -0.080150 -0.000530 + 1.000000 0.025401 0.008627 0.003007 -0.080143 -0.000538 + 1.000000 0.058713 0.029122 0.006964 -0.080142 -0.000551 + 1.000000 -0.021609 0.061296 -0.002518 -0.080118 -0.000517 + 1.000000 0.052972 -0.047906 0.006244 -0.080160 -0.000532 + 1.000000 -0.073182 0.000000 -0.008654 -0.080152 -0.000509 + 1.000000 0.026479 -0.065312 0.003098 -0.080155 -0.000528 + 0.809744 -0.000254 -0.000219 -0.000019 -0.057526 -0.000410 + 0.691994 0.000050 -0.000018 0.000007 -0.044277 -0.000333 + 0.266123 -0.000235 -0.000266 -0.000028 -0.007840 -0.000086 + 0.143461 -0.000348 -0.000158 -0.000009 -0.002384 -0.000027 + 0.591760 -0.000073 -0.000115 -0.000014 -0.033808 -0.000265 + 0.905637 0.004167 0.001910 0.000493 -0.068823 -0.000472 + 0.488787 0.000053 -0.000023 0.000006 -0.024057 -0.000198 + 0.388263 -0.000015 -0.000062 0.000000 -0.015854 -0.000143 + 0.070722 0.011893 -0.010382 0.000133 -0.000583 -0.000004 + 0.750771 -0.018096 -0.030279 -0.002002 -0.050794 -0.000372 + 0.750940 0.004622 0.034079 0.000550 -0.050799 -0.000375 + 0.204813 -0.018305 -0.029029 -0.000779 -0.004819 -0.000092 + 0.327256 -0.003927 -0.034033 -0.000282 -0.011517 -0.000119 + 0.325266 -0.004985 0.034905 -0.000273 -0.011418 -0.000087 + 0.204630 0.000530 0.043935 0.000058 -0.004690 -0.000058 + 0.859801 -0.036888 -0.013539 -0.004266 -0.063396 -0.000435 + 0.641934 -0.037765 -0.010934 -0.003869 -0.038961 -0.000299 + 0.641838 0.001685 0.038591 0.000198 -0.038922 -0.000304 + 0.641858 0.032735 -0.021780 0.003322 -0.038956 -0.000293 + 0.855692 0.036418 0.019327 0.004222 -0.062903 -0.000457 + 0.540313 0.004263 0.038395 0.000409 -0.028791 -0.000236 + 0.540224 -0.014621 -0.035586 -0.001356 -0.028805 -0.000235 + 0.438555 -0.036354 -0.014262 -0.002886 -0.019804 -0.000185 + 0.438507 0.003290 0.038953 0.000294 -0.019796 -0.000162 + 0.438513 0.031430 -0.023214 0.002501 -0.019814 -0.000148 + 0.736623 0.038452 -0.014014 0.004201 -0.049233 -0.000358 + 0.853148 0.017897 -0.038125 0.002049 -0.062599 -0.000437 + 0.949122 0.036475 -0.011375 0.004288 -0.074034 -0.000505 + 0.217515 0.039169 -0.006812 0.001720 -0.005400 -0.000062 + 0.096614 -0.035923 0.019351 -0.000699 -0.001163 0.000044 + 0.944537 0.005697 0.045405 0.000701 -0.073459 -0.000497 + 0.942858 -0.015204 -0.040459 -0.001809 -0.073281 -0.000491 + 0.867354 -0.017042 0.041583 -0.001935 -0.064261 -0.000437 + 0.539672 0.040840 -0.010341 0.003765 -0.028794 -0.000220 + 0.726164 -0.044027 0.015128 -0.004781 -0.048059 -0.000328 + 0.325000 0.045067 0.001159 0.002869 -0.011478 -0.000136 + 0.107644 -0.021036 -0.041299 -0.000490 -0.001345 -0.000061 + 0.301474 -0.046579 -0.003622 -0.002775 -0.010001 -0.000098 + 0.104200 0.023416 0.036426 0.000493 -0.001319 -0.000076 + 0.940605 -0.041188 0.011403 -0.004831 -0.073006 -0.000480 + 0.055346 -0.004385 0.041417 -0.000045 -0.000305 0.000020 + 0.525646 -0.045674 0.011759 -0.004120 -0.027455 -0.000191 + 0.780984 -0.047502 0.006076 -0.005329 -0.054235 -0.000368 + 0.047472 -0.047324 -0.000074 -0.000377 -0.000348 0.000014 + 0.232773 -0.044694 0.013351 -0.002095 -0.006175 -0.000025 + 0.782959 0.025453 -0.041103 0.002839 -0.054460 -0.000384 + 0.357442 -0.046002 -0.011409 -0.003174 -0.013650 -0.000135 + 0.176633 -0.046932 0.010367 -0.001701 -0.003633 -0.000008 + 0.667572 -0.007366 -0.048070 -0.000801 -0.041645 -0.000320 + 0.795434 0.032991 0.038425 0.003767 -0.055875 -0.000425 + 0.042351 0.044293 -0.029334 0.000297 -0.000260 0.000021 + 0.800381 -0.032750 -0.040735 -0.003728 -0.056455 -0.000417 + 0.701219 0.046449 0.025869 0.005000 -0.045293 -0.000377 + 0.701496 0.000594 0.051790 0.000120 -0.045279 -0.000336 + 0.815656 -0.014011 0.050078 -0.001569 -0.058191 -0.000402 + 0.172039 0.025259 -0.040561 0.000918 -0.003363 0.000036 + 0.114787 0.044859 -0.013218 0.001036 -0.001646 0.000025 + 0.254289 0.011521 -0.051334 0.000585 -0.007121 -0.000049 + 0.614213 -0.010373 -0.047510 -0.001074 -0.036069 -0.000294 + 0.476516 -0.011238 -0.051243 -0.000996 -0.022983 -0.000216 + 0.377589 -0.003055 -0.052623 -0.000220 -0.015017 -0.000158 + 0.368543 0.026611 0.042779 0.001896 -0.014376 -0.000202 + 0.276945 -0.025929 0.045700 -0.001394 -0.008426 -0.000022 + 0.275927 0.037138 0.037093 0.002044 -0.008372 -0.000188 + 0.813464 0.050722 -0.006424 0.005781 -0.057971 -0.000421 + 0.704103 -0.039003 -0.030734 -0.004205 -0.045624 -0.000360 + 0.676174 -0.040603 0.027620 -0.004242 -0.042589 -0.000292 + 0.165999 0.048557 0.008356 0.001682 -0.003289 -0.000079 + 0.377481 0.051950 -0.005563 0.003703 -0.015143 -0.000130 + 0.580095 -0.046857 -0.022136 -0.004539 -0.032706 -0.000282 + 0.899949 0.051524 -0.018634 0.006022 -0.068154 -0.000471 + 0.579467 0.029290 -0.043231 0.002785 -0.032609 -0.000227 + 0.053733 0.045664 0.025928 0.000409 -0.000383 -0.000075 + 0.613380 0.043151 0.021738 0.004317 -0.035997 -0.000314 + 0.499640 0.046301 0.025074 0.004081 -0.025092 -0.000244 + 0.608983 -0.039927 0.031200 -0.003932 -0.035542 -0.000224 + 0.591300 0.004991 0.052038 0.000543 -0.033758 -0.000274 + 0.898408 0.029686 0.044107 0.003501 -0.067950 -0.000485 + 0.055531 -0.023407 -0.045967 -0.000196 -0.000343 -0.000050 + 0.690468 0.036055 -0.035604 0.003824 -0.044126 -0.000310 + 0.157614 -0.033202 -0.043127 -0.001111 -0.002898 -0.000126 + 0.891865 -0.014738 -0.047090 -0.001742 -0.067192 -0.000464 + 0.252526 -0.036709 -0.033770 -0.001913 -0.007110 -0.000155 + 0.393957 -0.044861 0.025505 -0.003268 -0.016298 -0.000079 + 0.135578 -0.016882 0.049199 -0.000490 -0.002082 0.000017 + 0.491290 0.042903 -0.029535 0.003728 -0.024337 -0.000165 + 0.468313 -0.038626 0.028832 -0.003208 -0.022308 -0.000139 + 0.488514 0.003701 0.052270 0.000387 -0.024006 -0.000202 + 0.275855 0.048446 -0.012860 0.002681 -0.008467 -0.000054 + 0.486841 -0.049586 -0.020187 -0.004275 -0.023953 -0.000223 + 0.827625 -0.051135 0.020495 -0.005836 -0.059624 -0.000401 + 0.449001 0.050353 0.022805 0.004098 -0.020669 -0.000219 + 0.426785 -0.011010 -0.055634 -0.000874 -0.018836 -0.000182 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3d_circle_traction_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3d_circle_traction_results.txt new file mode 100644 index 00000000..e7a67b06 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3d_circle_traction_results.txt @@ -0,0 +1,455 @@ + x0 y0 z0 ux uy uz +------------------------------------------------------------------------------ + 0.000000 0.100000 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.100000 0.000000 0.148783 -0.005634 0.002949 + 0.000000 0.088546 0.046472 0.000000 0.000000 0.000000 + 0.000000 0.056806 0.082298 0.000000 0.000000 0.000000 + 0.000000 0.012054 0.099271 0.000000 0.000000 0.000000 + 0.000000 -0.035460 0.093502 0.000000 0.000000 0.000000 + 0.000000 -0.074851 0.066312 0.000000 0.000000 0.000000 + 0.000000 -0.097094 0.023932 0.000000 0.000000 0.000000 + 0.000000 -0.097094 -0.023932 0.000000 0.000000 0.000000 + 0.000000 -0.074851 -0.066312 0.000000 0.000000 0.000000 + 0.000000 -0.035460 -0.093502 0.000000 0.000000 0.000000 + 0.000000 0.012054 -0.099271 0.000000 0.000000 0.000000 + 0.000000 0.056806 -0.082298 0.000000 0.000000 0.000000 + 0.000000 0.088546 -0.046472 0.000000 0.000000 0.000000 + 0.050000 0.100000 0.000000 0.006782 -0.003427 0.000123 + 0.100000 0.100000 0.000000 0.013962 -0.004361 0.000099 + 0.150000 0.100000 0.000000 0.021303 -0.004536 0.000157 + 0.200000 0.100000 0.000000 0.028741 -0.004559 0.000287 + 0.250000 0.100000 0.000000 0.036247 -0.004561 0.000384 + 0.300000 0.100000 0.000000 0.043756 -0.004574 0.000509 + 0.350000 0.100000 0.000000 0.051287 -0.004601 0.000638 + 0.400000 0.100000 0.000000 0.058822 -0.004641 0.000774 + 0.450000 0.100000 0.000000 0.066354 -0.004696 0.000920 + 0.500000 0.100000 0.000000 0.073889 -0.004763 0.001074 + 0.550000 0.100000 0.000000 0.081430 -0.004854 0.001242 + 0.600000 0.100000 0.000000 0.088973 -0.004951 0.001423 + 0.650000 0.100000 0.000000 0.096522 -0.005066 0.001604 + 0.700000 0.100000 0.000000 0.104045 -0.005194 0.001769 + 0.750000 0.100000 0.000000 0.111500 -0.005303 0.001940 + 0.800000 0.100000 0.000000 0.118951 -0.005395 0.002116 + 0.850000 0.100000 0.000000 0.126479 -0.005499 0.002313 + 0.900000 0.100000 0.000000 0.133989 -0.005590 0.002516 + 0.950000 0.100000 0.000000 0.141489 -0.005693 0.002739 + 1.000000 0.088546 0.046472 0.148551 -0.005111 0.000903 + 1.000000 0.056806 0.082298 0.148509 -0.003735 -0.000700 + 1.000000 0.012054 0.099271 0.148283 -0.001781 -0.001408 + 1.000000 -0.035460 0.093502 0.148114 0.000326 -0.001132 + 1.000000 -0.074851 0.066312 0.148265 0.002054 0.000073 + 1.000000 -0.097094 0.023932 0.148431 0.003053 0.001921 + 1.000000 -0.097094 -0.023932 0.148632 0.003046 0.004045 + 1.000000 -0.074851 -0.066312 0.148836 0.002043 0.005919 + 1.000000 -0.035460 -0.093502 0.149046 0.000293 0.007121 + 1.000000 0.012054 -0.099271 0.149130 -0.001821 0.007357 + 1.000000 0.056806 -0.082298 0.149157 -0.003804 0.006593 + 1.000000 0.088546 -0.046472 0.148986 -0.005146 0.004998 + 0.000000 0.059035 -0.015090 0.000000 0.000000 0.000000 + 0.000000 -0.049270 0.025859 0.000000 0.000000 0.000000 + 0.000000 -0.006707 -0.055238 0.000000 0.000000 0.000000 + 0.000000 0.022489 0.052426 0.000000 0.000000 0.000000 + 0.000000 -0.049270 -0.025859 0.000000 0.000000 0.000000 + 0.000000 -0.041572 -0.060228 0.000000 0.000000 0.000000 + 0.000000 -0.011181 -0.007010 0.000000 0.000000 0.000000 + 0.000000 -0.004613 0.030407 0.000000 0.000000 0.000000 + 0.000000 0.023823 -0.030419 0.000000 0.000000 0.000000 + 0.000000 0.025401 0.008627 0.000000 0.000000 0.000000 + 0.000000 0.058713 0.029122 0.000000 0.000000 0.000000 + 0.000000 -0.021609 0.061296 0.000000 0.000000 0.000000 + 0.000000 0.052972 -0.047906 0.000000 0.000000 0.000000 + 0.000000 -0.073182 0.000000 0.000000 0.000000 0.000000 + 0.000000 0.026479 -0.065312 0.000000 0.000000 0.000000 + 0.525000 0.090625 -0.042274 0.077783 -0.004394 0.003072 + 0.325000 0.090625 -0.042274 0.047627 -0.004172 0.002484 + 0.724732 0.090601 -0.042325 0.107848 -0.004834 0.003755 + 0.224909 0.090649 0.042223 0.032379 -0.004115 -0.001582 + 0.374961 0.090479 0.042586 0.054916 -0.004176 -0.001215 + 0.524696 0.090516 0.042506 0.077457 -0.004361 -0.000762 + 0.675000 0.090625 0.042274 0.100168 -0.004695 -0.000211 + 0.036667 -0.088917 -0.045758 0.004910 0.002609 0.001419 + 0.960964 -0.088549 0.046465 0.142589 0.002817 0.000717 + 0.958651 -0.056806 -0.082298 0.142828 0.001367 0.006516 + 0.045446 -0.055609 0.083112 0.005873 0.001857 -0.002732 + 0.175000 0.090625 -0.042274 0.025112 -0.004139 0.002150 + 0.825000 0.090625 0.042274 0.122534 -0.005012 0.000308 + 0.824893 0.090591 -0.042346 0.122870 -0.005040 0.004132 + 0.625000 0.090625 -0.042274 0.092859 -0.004595 0.003426 + 0.425000 0.090625 -0.042274 0.062698 -0.004254 0.002757 + 0.125001 0.090706 0.042100 0.017546 -0.004050 -0.001747 + 0.958651 0.035460 -0.093502 0.143059 -0.002810 0.007005 + 0.041642 0.031911 -0.094772 0.005760 -0.000904 0.003090 + 0.965890 0.034814 0.093744 0.143399 -0.002720 -0.001419 + 0.038275 0.030804 0.095137 0.005227 -0.000937 -0.002921 + 0.925000 0.090625 -0.042274 0.137925 -0.005232 0.004535 + 0.075000 0.090625 -0.042274 0.010280 -0.003664 0.001854 + 0.925000 0.090625 0.042274 0.137519 -0.005211 0.000731 + 0.675232 0.090683 -0.042150 0.100415 -0.004719 0.003592 + 0.700062 0.064666 -0.076278 0.104196 -0.003615 0.005217 + 0.749899 0.064561 -0.076367 0.111686 -0.003728 0.005390 + 0.724542 0.026931 -0.096305 0.107865 -0.001976 0.006215 + 0.773743 0.026685 -0.096374 0.115262 -0.002076 0.006395 + 0.748905 -0.015668 -0.098765 0.111448 -0.000111 0.006428 + 0.699628 -0.015430 -0.098802 0.104039 -0.000006 0.006254 + 0.797869 -0.015993 -0.098713 0.118813 -0.000199 0.006606 + 0.773182 -0.055346 -0.083288 0.114962 0.001632 0.005830 + 0.821950 -0.055468 -0.083207 0.122303 0.001542 0.006008 + 0.797472 -0.084917 -0.052811 0.118445 0.002926 0.004550 + 0.748473 -0.084798 -0.053003 0.111071 0.003021 0.004381 + 0.772682 -0.099158 -0.012948 0.114536 0.003627 0.002664 + 0.723604 -0.099135 -0.013127 0.107151 0.003733 0.002499 + 0.748038 -0.095558 0.029473 0.110676 0.003525 0.000663 + 0.698758 -0.095620 0.029272 0.103262 0.003644 0.000501 + 0.797230 -0.095486 0.029707 0.118078 0.003416 0.000826 + 0.772471 -0.074581 0.066616 0.114260 0.002526 -0.000930 + 0.821601 -0.074400 0.066818 0.121645 0.002417 -0.000762 + 0.846357 -0.085072 -0.052562 0.125801 0.002841 0.004725 + 0.796937 -0.039986 0.091657 0.117924 0.000916 -0.001978 + 0.747656 -0.040110 0.091604 0.110518 0.001029 -0.002151 + 0.846007 -0.039875 0.091706 0.125284 0.000817 -0.001796 + 0.846867 -0.016336 -0.098657 0.126186 -0.000274 0.006792 + 0.674296 -0.099097 -0.013406 0.099739 0.003849 0.002339 + 0.649399 -0.095681 0.029071 0.095842 0.003762 0.000334 + 0.624888 -0.099059 -0.013689 0.092322 0.003959 0.002171 + 0.600009 -0.095744 0.028862 0.088426 0.003871 0.000159 + 0.575386 -0.099019 -0.013974 0.084907 0.004060 0.002002 + 0.550574 -0.095961 0.028134 0.081051 0.003982 0.000023 + 0.525822 -0.098979 -0.014253 0.077486 0.004155 0.001845 + 0.500696 -0.096069 0.027762 0.073580 0.004072 -0.000123 + 0.476246 -0.098934 -0.014562 0.070079 0.004228 0.001693 + 0.451271 -0.096171 0.027406 0.066227 0.004144 -0.000267 + 0.426703 -0.098889 -0.014864 0.062665 0.004290 0.001563 + 0.401388 -0.096235 0.027182 0.058740 0.004202 -0.000404 + 0.377116 -0.098845 -0.015154 0.055251 0.004337 0.001421 + 0.352015 -0.096328 0.026851 0.051419 0.004251 -0.000525 + 0.327527 -0.098809 -0.015390 0.047829 0.004370 0.001314 + 0.302577 -0.096294 0.026971 0.043997 0.004274 -0.000659 + 0.278213 -0.098782 -0.015561 0.040437 0.004397 0.001201 + 0.253409 -0.096346 0.026786 0.036623 0.004301 -0.000767 + 0.228917 -0.098759 -0.015708 0.033045 0.004427 0.001099 + 0.204418 -0.096445 0.026426 0.029291 0.004341 -0.000851 + 0.253717 -0.083330 -0.055283 0.036849 0.003706 0.002935 + 0.204670 -0.083234 -0.055426 0.029490 0.003739 0.002846 + 0.277608 -0.076187 0.064773 0.040209 0.003384 -0.002428 + 0.424057 -0.076994 0.063811 0.062059 0.003322 -0.001987 + 0.600218 -0.084273 -0.053833 0.088801 0.003341 0.003883 + 0.629427 -0.075407 0.065680 0.092723 0.002899 -0.001396 + 0.352669 -0.083391 -0.055190 0.051698 0.003657 0.003163 + 0.451657 -0.083655 -0.054789 0.066537 0.003571 0.003428 + 0.229277 -0.052893 -0.084867 0.033255 0.002339 0.004223 + 0.180350 -0.052767 -0.084945 0.025896 0.002362 0.004142 + 0.523425 -0.076761 0.064091 0.076908 0.003173 -0.001686 + 0.155835 -0.083087 -0.055647 0.022210 0.003704 0.002767 + 0.131577 -0.052679 -0.084999 0.018694 0.002360 0.004037 + 0.772183 0.001903 0.099982 0.114280 -0.000920 -0.002448 + 0.204958 -0.012816 -0.099175 0.029667 0.000531 0.004826 + 0.254113 -0.012953 -0.099158 0.037041 0.000521 0.004908 + 0.722723 0.001776 0.099984 0.106848 -0.000806 -0.002620 + 0.229641 0.029540 -0.095537 0.033378 -0.001396 0.004695 + 0.747359 0.043578 0.090005 0.110700 -0.002745 -0.002097 + 0.870305 -0.074142 0.067104 0.128962 0.002323 -0.000585 + 0.894759 -0.039701 0.091781 0.132592 0.000742 -0.001612 + 0.870307 0.001296 0.099992 0.128960 -0.001076 -0.002083 + 0.278967 0.029368 -0.095590 0.040795 -0.001399 0.004797 + 0.303419 -0.013188 -0.099127 0.044456 0.000513 0.005019 + 0.698492 -0.040397 0.091477 0.103111 0.001169 -0.002322 + 0.673158 0.001598 0.099987 0.099374 -0.000655 -0.002807 + 0.328259 0.029099 -0.095673 0.048214 -0.001408 0.004917 + 0.352841 -0.013444 -0.099092 0.051892 0.000498 0.005139 + 0.377483 0.028906 -0.095731 0.055625 -0.001432 0.005052 + 0.402296 -0.013692 -0.099058 0.059333 0.000469 0.005273 + 0.426957 0.028756 -0.095776 0.063079 -0.001473 0.005192 + 0.451781 -0.013992 -0.099016 0.066778 0.000429 0.005417 + 0.476485 0.028453 -0.095867 0.070541 -0.001519 0.005347 + 0.501283 -0.014197 -0.098987 0.074222 0.000368 0.005571 + 0.525983 0.028316 -0.095907 0.077997 -0.001592 0.005509 + 0.550743 -0.014449 -0.098951 0.081662 0.000294 0.005735 + 0.575572 0.028079 -0.095977 0.085466 -0.001674 0.005684 + 0.600233 -0.014700 -0.098914 0.089102 0.000200 0.005907 + 0.625161 0.027802 -0.096057 0.092928 -0.001773 0.005860 + 0.180358 0.029742 -0.095475 0.025983 -0.001386 0.004583 + 0.525822 -0.054455 -0.083873 0.077798 0.002144 0.004972 + 0.254289 0.065767 -0.075331 0.037053 -0.003033 0.003819 + 0.792194 0.042883 0.090339 0.117413 -0.002811 -0.001946 + 0.111839 -0.082722 -0.056188 0.015751 0.003645 0.002697 + 0.131148 -0.098598 -0.016684 0.018495 0.004448 0.000999 + 0.085492 -0.052857 -0.084889 0.012032 0.002256 0.003797 + 0.107454 -0.013261 -0.099117 0.015157 0.000604 0.004522 + 0.772046 0.077372 0.063353 0.114561 -0.004319 -0.000812 + 0.082654 -0.098557 -0.016930 0.011384 0.004189 0.000844 + 0.106698 -0.096801 0.025091 0.014813 0.004290 -0.000908 + 0.054684 -0.096940 0.024549 0.007345 0.003621 -0.000826 + 0.725817 0.076916 0.063905 0.107608 -0.004193 -0.001004 + 0.917104 0.002073 0.099979 0.135988 -0.001167 -0.001897 + 0.885800 0.042128 0.090693 0.131295 -0.002935 -0.001596 + 0.941083 -0.038013 0.092493 0.139535 0.000588 -0.001459 + 0.082293 -0.078142 0.062401 0.011110 0.003363 -0.002443 + 0.130546 -0.078002 0.062576 0.018208 0.003530 -0.002625 + 0.106227 -0.045500 0.089049 0.014646 0.002030 -0.003787 + 0.154798 -0.045209 0.089197 0.021763 0.002067 -0.003827 + 0.127764 -0.003902 0.099924 0.017860 0.000196 -0.004292 + 0.178257 -0.004278 0.099908 0.025312 0.000183 -0.004279 + 0.203110 -0.044829 0.089389 0.029004 0.002002 -0.003720 + 0.223241 -0.004716 0.099889 0.031978 0.000194 -0.004159 + 0.151941 0.036869 0.092955 0.021403 -0.001681 -0.004025 + 0.113836 0.038303 0.092374 0.015756 -0.001695 -0.003942 + 0.065614 -0.012347 0.099235 0.008770 0.000515 -0.003964 + 0.774336 0.090459 -0.042628 0.115284 -0.004936 0.003946 + 0.066096 -0.013117 -0.099136 0.009154 0.000500 0.004165 + 0.649635 -0.014924 -0.098880 0.096528 0.000094 0.006080 + 0.575218 0.090679 -0.042157 0.085356 -0.004492 0.003242 + 0.875236 0.090684 -0.042148 0.130433 -0.005139 0.004323 + 0.849752 0.064516 -0.076405 0.126685 -0.003921 0.005773 + 0.799611 0.064534 -0.076390 0.119153 -0.003829 0.005575 + 0.889249 0.063831 -0.076978 0.132611 -0.003965 0.005961 + 0.874918 0.027087 -0.096261 0.130475 -0.002286 0.006782 + 0.474805 0.090674 -0.042170 0.070207 -0.004319 0.002904 + 0.374814 0.090671 -0.042175 0.055135 -0.004212 0.002614 + 0.124769 0.090683 -0.042150 0.017566 -0.004093 0.002032 + 0.110710 0.063924 -0.076900 0.015612 -0.002864 0.003535 + 0.155413 0.064653 -0.076289 0.022277 -0.002928 0.003656 + 0.874947 0.090841 0.041807 0.130034 -0.005117 0.000526 + 0.855795 0.070081 0.071335 0.127003 -0.004138 -0.000875 + 0.846278 -0.095373 0.030068 0.125458 0.003317 0.000993 + 0.890756 -0.095401 0.029977 0.132135 0.003248 0.001174 + 0.174876 0.090819 0.041856 0.024872 -0.004102 -0.001660 + 0.202820 0.064448 0.076462 0.028993 -0.002914 -0.003178 + 0.251511 0.064742 0.076213 0.036245 -0.002932 -0.003034 + 0.823971 0.026834 -0.096333 0.122815 -0.002181 0.006583 + 0.890033 -0.017901 -0.098385 0.132684 -0.000275 0.006953 + 0.155167 -0.096725 0.025384 0.021986 0.004386 -0.000891 + 0.179719 -0.098632 -0.016482 0.025708 0.004427 0.001030 + 0.303117 -0.083368 -0.055224 0.044268 0.003685 0.003044 + 0.075136 0.090659 0.042201 0.010183 -0.003681 -0.001677 + 0.275000 0.090625 0.042274 0.039889 -0.004127 -0.001459 + 0.300221 0.064230 0.076645 0.043570 -0.002933 -0.002937 + 0.274136 0.026126 0.096527 0.039583 -0.001192 -0.003883 + 0.323773 0.025782 0.096619 0.047035 -0.001201 -0.003764 + 0.298653 -0.016959 0.098551 0.043237 0.000737 -0.003900 + 0.349006 -0.016779 0.098582 0.050773 0.000697 -0.003769 + 0.373476 0.025472 0.096701 0.054489 -0.001225 -0.003634 + 0.397928 -0.017731 0.098415 0.058133 0.000704 -0.003628 + 0.423146 0.025099 0.096799 0.061944 -0.001245 -0.003498 + 0.447524 -0.017671 0.098426 0.065525 0.000646 -0.003480 + 0.472882 0.024744 0.096890 0.069397 -0.001297 -0.003353 + 0.448318 0.063376 0.077353 0.065818 -0.003008 -0.002564 + 0.497796 -0.017854 0.098393 0.073075 0.000586 -0.003328 + 0.522669 0.024391 0.096980 0.076860 -0.001349 -0.003199 + 0.547585 -0.018154 0.098338 0.080489 0.000513 -0.003156 + 0.572447 0.024023 0.097072 0.084308 -0.001437 -0.003036 + 0.596972 -0.019297 0.098120 0.087921 0.000463 -0.002979 + 0.373972 -0.056744 0.082341 0.054545 0.002478 -0.002955 + 0.622174 0.023591 0.097177 0.091730 -0.001509 -0.002870 + 0.597635 0.062463 0.078092 0.088246 -0.003214 -0.002110 + 0.473495 -0.055014 0.083507 0.069414 0.002285 -0.002717 + 0.647435 0.062154 0.078338 0.095780 -0.003337 -0.001925 + 0.566372 -0.055488 0.083193 0.083289 0.002153 -0.002401 + 0.324879 0.090401 0.042751 0.047383 -0.004137 -0.001356 + 0.224881 0.090655 -0.042211 0.032570 -0.004145 0.002246 + 0.675287 0.027133 -0.096249 0.100462 -0.001865 0.006044 + 0.674537 -0.054961 -0.083542 0.100129 0.001841 0.005487 + 0.402085 -0.083554 -0.054943 0.059109 0.003622 0.003289 + 0.821070 0.001292 0.099992 0.121606 -0.000993 -0.002264 + 0.424820 0.090545 0.042445 0.062417 -0.004222 -0.001068 + 0.474583 0.090510 0.042520 0.069911 -0.004281 -0.000924 + 0.625181 0.090380 0.042795 0.092621 -0.004572 -0.000418 + 0.575014 0.090275 0.043017 0.085036 -0.004440 -0.000612 + 0.326943 -0.075904 0.065105 0.047571 0.003354 -0.002316 + 0.156151 -0.013079 -0.099141 0.022368 0.000586 0.004728 + 0.699048 -0.084629 -0.053272 0.103638 0.003127 0.004219 + 0.398568 0.063631 0.077144 0.058344 -0.002969 -0.002697 + 0.547940 0.062795 0.077826 0.080788 -0.003137 -0.002269 + 0.498085 0.063069 0.077604 0.073291 -0.003063 -0.002422 + 0.723190 -0.074708 0.066474 0.106842 0.002649 -0.001096 + 0.723964 -0.055150 -0.083417 0.107557 0.001732 0.005658 + 0.821591 -0.099169 -0.012867 0.121899 0.003528 0.002839 + 0.871070 -0.099300 -0.011813 0.129346 0.003446 0.002981 + 0.919684 -0.099355 -0.011339 0.136639 0.003373 0.003158 + 0.895426 -0.086557 -0.050078 0.133167 0.002828 0.004807 + 0.697790 0.043446 0.090069 0.103311 -0.002627 -0.002272 + 0.349087 0.063820 0.076987 0.050910 -0.002940 -0.002827 + 0.676280 -0.075020 0.066121 0.099779 0.002782 -0.001246 + 0.650472 0.064959 -0.076028 0.096742 -0.003505 0.005038 + 0.868487 -0.055917 -0.082906 0.129302 0.001483 0.006175 + 0.278588 -0.053059 -0.084763 0.040666 0.002328 0.004319 + 0.654392 -0.041432 0.091013 0.096458 0.001323 -0.002457 + 0.178891 -0.077590 0.063086 0.025411 0.003502 -0.002546 + 0.918522 -0.073654 0.067639 0.136203 0.002229 -0.000419 + 0.575414 -0.054577 -0.083793 0.085244 0.002053 0.005139 + 0.649665 -0.084470 -0.053525 0.096220 0.003238 0.004053 + 0.625275 -0.054705 -0.083710 0.092730 0.001948 0.005316 + 0.327965 -0.053248 -0.084645 0.048086 0.002312 0.004427 + 0.600625 0.065161 -0.075855 0.089246 -0.003400 0.004858 + 0.377430 -0.053418 -0.084537 0.055516 0.002284 0.004551 + 0.948402 -0.088136 -0.047244 0.141099 0.002810 0.004897 + 0.963125 -0.010257 -0.099473 0.143642 -0.000754 0.007304 + 0.500903 -0.084033 -0.054208 0.073915 0.003520 0.003555 + 0.476485 -0.053747 -0.084328 0.070392 0.002189 0.004832 + 0.550554 -0.084287 -0.053811 0.081356 0.003442 0.003706 + 0.426983 -0.053574 -0.084438 0.062960 0.002244 0.004686 + 0.550230 0.065363 -0.075681 0.081650 -0.003304 0.004673 + 0.228225 -0.077060 0.063732 0.032802 0.003448 -0.002492 + 0.251848 -0.044157 0.089723 0.036319 0.001960 -0.003615 + 0.500366 0.065447 -0.075608 0.074134 -0.003224 0.004505 + 0.450809 0.065609 -0.075468 0.066658 -0.003162 0.004340 + 0.400740 0.065734 -0.075359 0.059111 -0.003112 0.004189 + 0.351965 0.065313 -0.075725 0.051760 -0.003054 0.004072 + 0.033646 0.074411 0.066806 0.004209 -0.002130 -0.001905 + 0.966598 0.074878 -0.066282 0.144213 -0.004600 0.005790 + 0.033427 0.074593 -0.066603 0.004461 -0.002151 0.001959 + 0.964490 0.074644 0.066545 0.143321 -0.004548 -0.000195 + 0.303478 0.065355 -0.075688 0.044460 -0.003031 0.003948 + 0.277315 0.091194 -0.041032 0.040446 -0.004180 0.002308 + 0.037991 -0.056806 -0.082298 0.005461 0.001854 0.002631 + 0.131510 0.026971 -0.096294 0.018711 -0.001222 0.004512 + 0.203982 0.065301 -0.075735 0.029496 -0.003015 0.003733 + 0.960612 -0.100000 -0.000133 0.142695 0.003323 0.002821 + 0.914474 -0.059025 -0.080722 0.136208 0.001542 0.006266 + 0.086550 0.024394 -0.096979 0.012016 -0.001066 0.004329 + 0.917923 0.020360 -0.097905 0.136953 -0.002050 0.007040 + 0.962712 -0.004728 0.099888 0.142746 -0.000940 -0.001698 + 0.107533 0.071503 0.069910 0.015012 -0.003151 -0.002975 + 0.149985 0.071596 0.069814 0.021179 -0.003260 -0.002970 + 0.036722 -0.099650 -0.008355 0.004862 0.002952 0.000212 + 0.203436 0.028801 0.095763 0.029045 -0.001298 -0.004015 + 0.036286 -0.083934 0.054361 0.004622 0.002441 -0.001654 + 0.927880 0.057578 0.081760 0.137716 -0.003708 -0.001035 + 0.302010 -0.053042 0.084773 0.043792 0.002346 -0.003267 + 0.836575 0.040049 0.091630 0.124007 -0.002761 -0.001854 + 0.028208 -0.012054 0.099271 0.003470 0.000371 -0.002428 + 0.964818 -0.065575 0.075498 0.143075 0.001780 -0.000578 + 0.897259 0.073538 0.067766 0.133184 -0.004377 -0.000529 + 0.730514 0.095252 0.030447 0.108488 -0.005040 0.000516 + 0.775000 0.095556 0.029481 0.115124 -0.005146 0.000706 + 0.375655 -0.083669 0.054767 0.054865 0.003669 -0.001703 + 0.964747 0.094055 -0.033965 0.143784 -0.005446 0.004323 + 0.035253 0.094055 -0.033965 0.004615 -0.002780 0.001039 + 0.964747 0.094055 0.033965 0.143481 -0.005438 0.001277 + 0.035259 0.094053 0.033970 0.004479 -0.002645 -0.000986 + 0.422555 -0.045571 0.089013 0.061802 0.001918 -0.003128 + 0.931344 -0.097243 0.023321 0.138252 0.003254 0.001643 + 0.474978 -0.083833 0.054516 0.069687 0.003566 -0.001403 + 0.070715 0.057873 0.081552 0.009669 -0.002303 -0.003313 + 0.522098 -0.045600 0.088998 0.076676 0.001784 -0.002817 + 0.575367 -0.081963 0.057289 0.084671 0.003316 -0.001202 + 0.072018 -0.078212 -0.062313 0.009921 0.003194 0.002667 + 0.813928 0.070348 0.071072 0.120759 -0.004078 -0.001019 + 0.239162 0.034483 0.093867 0.034364 -0.001572 -0.003860 + 0.934157 0.057817 -0.081592 0.139396 -0.003769 0.006360 + 0.260137 -0.007402 0.099726 0.037491 0.000315 -0.004056 + 0.925760 -0.026069 -0.096542 0.138014 0.000031 0.007022 + 0.081291 0.023952 0.097089 0.011173 -0.001011 -0.004048 + 0.065835 0.057776 -0.081621 0.009097 -0.002196 0.003379 + 0.684196 0.070254 0.071164 0.101375 -0.003808 -0.001475 + 0.024453 -0.012017 -0.099275 0.003128 0.000276 0.002366 + 0.337740 -0.049421 0.086934 0.049110 0.002171 -0.003265 + 0.631131 -0.013814 0.099041 0.093036 0.000152 -0.002904 + 0.604898 -0.051052 0.085986 0.089067 0.001874 -0.002396 + 1.000000 0.059035 -0.015090 0.149026 -0.003881 0.003628 + 1.000000 -0.049270 0.025859 0.148681 0.000947 0.001825 + 1.000000 -0.006707 -0.055238 0.149110 -0.000973 0.005429 + 1.000000 0.022489 0.052426 0.148712 -0.002242 0.000611 + 1.000000 -0.049270 -0.025859 0.148905 0.000939 0.004129 + 1.000000 -0.041572 -0.060228 0.149023 0.000584 0.005661 + 1.000000 -0.011181 -0.007010 0.148937 -0.000757 0.003282 + 1.000000 -0.004613 0.030407 0.148771 -0.001044 0.001609 + 1.000000 0.023823 -0.030419 0.149074 -0.002329 0.004315 + 1.000000 0.025401 0.008627 0.148925 -0.002381 0.002576 + 1.000000 0.058713 0.029122 0.148858 -0.003857 0.001653 + 1.000000 -0.021609 0.061296 0.148558 -0.000276 0.000234 + 1.000000 0.052972 -0.047906 0.149148 -0.003628 0.005093 + 1.000000 -0.073182 0.000000 0.148696 0.002012 0.002978 + 1.000000 0.026479 -0.065312 0.149179 -0.002460 0.005880 + 0.809744 -0.000254 -0.000219 0.120264 -0.000912 0.002198 + 0.691994 0.000050 -0.000018 0.102574 -0.000665 0.001773 + 0.266123 -0.000235 -0.000266 0.038616 -0.000039 0.000463 + 0.143461 -0.000348 -0.000158 0.020040 -0.000014 0.000215 + 0.591760 -0.000073 -0.000115 0.087516 -0.000416 0.001418 + 0.905637 0.004167 0.001910 0.134681 -0.001276 0.002482 + 0.488787 0.000053 -0.000023 0.072052 -0.000234 0.001065 + 0.388263 -0.000015 -0.000062 0.056960 -0.000115 0.000768 + 0.070722 0.011893 -0.010382 0.008978 -0.000378 0.000412 + 0.750771 -0.018096 -0.030279 0.111476 0.000010 0.003347 + 0.750940 0.004622 0.034079 0.111321 -0.001003 0.000442 + 0.204813 -0.018305 -0.029029 0.029423 0.000799 0.001648 + 0.327256 -0.003927 -0.034033 0.047884 0.000095 0.002136 + 0.325266 -0.004985 0.034905 0.047411 0.000161 -0.000975 + 0.204630 0.000530 0.043935 0.029277 -0.000049 -0.001690 + 0.859801 -0.036888 -0.013539 0.127773 0.000651 0.003005 + 0.641934 -0.037765 -0.010934 0.095008 0.001162 0.002096 + 0.641838 0.001685 0.038591 0.094902 -0.000598 -0.000143 + 0.641858 0.032735 -0.021780 0.095192 -0.002018 0.002569 + 0.855692 0.036418 0.019327 0.127155 -0.002641 0.001480 + 0.540313 0.004263 0.038395 0.079663 -0.000500 -0.000501 + 0.540224 -0.014621 -0.035586 0.079870 0.000330 0.002840 + 0.438555 -0.036354 -0.014262 0.064512 0.001468 0.001560 + 0.438507 0.003290 0.038953 0.064392 -0.000304 -0.000845 + 0.438513 0.031430 -0.023214 0.064610 -0.001590 0.001950 + 0.736623 0.038452 -0.014014 0.109415 -0.002508 0.002546 + 0.853148 0.017897 -0.038125 0.126966 -0.001817 0.004073 + 0.949122 0.036475 -0.011375 0.141352 -0.002823 0.003262 + 0.217515 0.039169 -0.006812 0.031319 -0.001816 0.000648 + 0.096614 -0.035923 0.019351 0.012865 0.001616 -0.000688 + 0.944537 0.005697 0.045405 0.140362 -0.001393 0.000676 + 0.942858 -0.015204 -0.040459 0.140425 -0.000475 0.004564 + 0.867354 -0.017042 0.041583 0.128726 -0.000251 0.000539 + 0.539672 0.040840 -0.010341 0.079802 -0.002162 0.001691 + 0.726164 -0.044027 0.015128 0.107554 0.001247 0.001221 + 0.325000 0.045067 0.001159 0.047485 -0.002106 0.000533 + 0.107644 -0.021036 -0.041299 0.014707 0.000941 0.001998 + 0.301474 -0.046579 -0.003622 0.043913 0.002035 0.000708 + 0.104200 0.023416 0.036426 0.014038 -0.001027 -0.001503 + 0.940605 -0.041188 0.011403 0.139827 0.000721 0.002204 + 0.055346 -0.004385 0.041417 0.006663 0.000188 -0.001353 + 0.525646 -0.045674 0.011759 0.077469 0.001764 0.000663 + 0.780984 -0.047502 0.006076 0.115822 0.001279 0.001823 + 0.047472 -0.047324 -0.000074 0.005822 0.001312 0.000014 + 0.232773 -0.044694 0.013351 0.033555 0.001985 -0.000215 + 0.782959 0.025453 -0.041103 0.116442 -0.002025 0.003935 + 0.357442 -0.046002 -0.011409 0.052328 0.001978 0.001201 + 0.176633 -0.046932 0.010367 0.025102 0.002126 -0.000198 + 0.667572 -0.007366 -0.048070 0.099059 -0.000280 0.003853 + 0.795434 0.032991 0.038425 0.118046 -0.002375 0.000395 + 0.042351 0.044293 -0.029334 0.005086 -0.001152 0.000874 + 0.800381 -0.032750 -0.040735 0.118944 0.000566 0.004003 + 0.701219 0.046449 0.025869 0.103987 -0.002779 0.000625 + 0.701496 0.000594 0.051790 0.103824 -0.000703 -0.000525 + 0.815656 -0.014011 0.050078 0.120939 -0.000298 -0.000044 + 0.172039 0.025259 -0.040561 0.024519 -0.001182 0.002112 + 0.114787 0.044859 -0.013218 0.015777 -0.002038 0.000740 + 0.254289 0.011521 -0.051334 0.036958 -0.000575 0.002748 + 0.614213 -0.010373 -0.047510 0.091034 -0.000015 0.003637 + 0.476516 -0.011238 -0.051243 0.070352 0.000280 0.003337 + 0.377589 -0.003055 -0.052623 0.055500 0.000020 0.003107 + 0.368543 0.026611 0.042779 0.053901 -0.001287 -0.001221 + 0.276945 -0.025929 0.045700 0.040140 0.001127 -0.001582 + 0.275927 0.037138 0.037093 0.040013 -0.001717 -0.001209 + 0.813464 0.050722 -0.006424 0.120939 -0.003215 0.002475 + 0.704103 -0.039003 -0.030734 0.104418 0.001062 0.003209 + 0.676174 -0.040603 0.027620 0.100001 0.001216 0.000485 + 0.165999 0.048557 0.008356 0.023504 -0.002240 -0.000154 + 0.377481 0.051950 -0.005563 0.055401 -0.002453 0.000975 + 0.580095 -0.046857 -0.022136 0.085748 0.001707 0.002375 + 0.899949 0.051524 -0.018634 0.133994 -0.003414 0.003370 + 0.579467 0.029290 -0.043231 0.085874 -0.001727 0.003316 + 0.053733 0.045664 0.025928 0.006631 -0.001449 -0.000866 + 0.613380 0.043151 0.021738 0.090792 -0.002403 0.000505 + 0.499640 0.046301 0.025074 0.073673 -0.002330 -0.000042 + 0.608983 -0.039927 0.031200 0.089896 0.001348 0.000077 + 0.591300 0.004991 0.052038 0.087266 -0.000633 -0.000936 + 0.898408 0.029686 0.044107 0.133444 -0.002409 0.000541 + 0.055531 -0.023407 -0.045967 0.006868 0.000732 0.001685 + 0.690468 0.036055 -0.035604 0.102550 -0.002292 0.003360 + 0.157614 -0.033202 -0.043127 0.022311 0.001498 0.002214 + 0.891865 -0.014738 -0.047090 0.132772 -0.000410 0.004646 + 0.252526 -0.036709 -0.033770 0.036629 0.001612 0.001957 + 0.393957 -0.044861 0.025505 0.057704 0.001908 -0.000356 + 0.135578 -0.016882 0.049199 0.018813 0.000773 -0.002096 + 0.491290 0.042903 -0.029535 0.072587 -0.002180 0.002396 + 0.468313 -0.038626 0.028832 0.068839 0.001543 -0.000288 + 0.488514 0.003701 0.052270 0.071853 -0.000384 -0.001288 + 0.275855 0.048446 -0.012860 0.040130 -0.002245 0.001047 + 0.486841 -0.049586 -0.020187 0.071750 0.001998 0.001973 + 0.827625 -0.051135 0.020495 0.122773 0.001353 0.001344 + 0.449001 0.050353 0.022805 0.066072 -0.002441 -0.000100 + 0.426785 -0.011010 -0.055634 0.062894 0.000330 0.003385 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3d_distributed_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3d_distributed_results.txt new file mode 100644 index 00000000..693007d9 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3d_distributed_results.txt @@ -0,0 +1,107 @@ + x0 y0 z0 ux uy uz +------------------------------------------------------------------------------ + 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.000000 -14.180951 -105.238549 -6.115185 + 1.000000 0.200000 0.000000 12.406904 -105.296591 -6.936405 + 0.000000 0.200000 0.000000 0.000000 0.000000 0.000000 + 0.000000 0.000000 0.200000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.200000 -12.138257 -104.366120 -6.079694 + 1.000000 0.200000 0.200000 14.431138 -104.517046 -6.900563 + 0.000000 0.200000 0.200000 0.000000 0.000000 0.000000 + 0.100000 0.000000 0.000000 -4.016252 -3.591060 -0.111719 + 0.200000 0.000000 0.000000 -6.528902 -9.407736 -0.235464 + 0.300000 0.000000 0.000000 -9.090982 -17.632166 -0.486241 + 0.400000 0.000000 0.000000 -11.187814 -27.872002 -1.007668 + 0.500000 0.000000 0.000000 -12.426513 -39.535558 -1.672188 + 0.600000 0.000000 0.000000 -13.351330 -52.118183 -2.403258 + 0.700000 0.000000 0.000000 -13.794932 -65.244275 -3.231231 + 0.800000 0.000000 0.000000 -14.038888 -78.516869 -4.154365 + 0.900000 0.000000 0.000000 -14.150724 -91.884251 -5.118457 + 1.000000 0.100000 0.000000 -0.875232 -105.241094 -6.543765 + 0.900000 0.200000 0.000000 12.374619 -91.958986 -5.937249 + 0.800000 0.200000 0.000000 12.245088 -78.620181 -4.943328 + 0.700000 0.200000 0.000000 12.006350 -65.300303 -3.956724 + 0.600000 0.200000 0.000000 11.544950 -52.097270 -2.952799 + 0.500000 0.200000 0.000000 10.672424 -39.490644 -1.950835 + 0.400000 0.200000 0.000000 9.438929 -27.900342 -1.183900 + 0.300000 0.200000 0.000000 7.881054 -17.780573 -0.435854 + 0.200000 0.200000 0.000000 5.753593 -9.005137 0.305553 + 0.100000 0.200000 0.000000 3.215253 -2.959183 0.596664 + 0.000000 0.100000 0.000000 0.000000 0.000000 0.000000 + 0.100000 0.000000 0.200000 -2.496818 -2.573942 0.658807 + 0.200000 0.000000 0.200000 -5.858315 -8.507142 0.812085 + 0.300000 0.000000 0.200000 -8.041504 -16.837697 0.127620 + 0.400000 0.000000 0.200000 -9.401722 -27.194273 -0.486811 + 0.500000 0.000000 0.200000 -10.773722 -38.666226 -1.326144 + 0.600000 0.000000 0.200000 -11.374022 -51.306450 -2.166164 + 0.700000 0.000000 0.200000 -11.898157 -64.377750 -3.119799 + 0.800000 0.000000 0.200000 -12.067504 -77.678947 -4.091593 + 0.900000 0.000000 0.200000 -12.136476 -91.031172 -5.081045 + 1.000000 0.100000 0.200000 1.128200 -104.417153 -6.507579 + 0.900000 0.200000 0.200000 14.368921 -91.165493 -5.909755 + 0.800000 0.200000 0.200000 14.218949 -77.843713 -4.946467 + 0.700000 0.200000 0.200000 13.941815 -64.600896 -4.012390 + 0.600000 0.200000 0.200000 13.388585 -51.392712 -3.093469 + 0.500000 0.200000 0.200000 12.481535 -39.004703 -2.327409 + 0.400000 0.200000 0.200000 11.002115 -27.288251 -1.541932 + 0.300000 0.200000 0.200000 9.325036 -17.377082 -1.062357 + 0.200000 0.200000 0.200000 6.606321 -8.839947 -0.560956 + 0.100000 0.200000 0.200000 3.607183 -3.168322 -0.463030 + 0.000000 0.100000 0.200000 0.000000 0.000000 0.000000 + 0.000000 0.000000 0.100000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.100000 -13.153200 -104.811090 -6.101172 + 1.000000 0.200000 0.100000 13.422784 -104.914185 -6.923065 + 0.000000 0.200000 0.100000 0.000000 0.000000 0.000000 + 0.100000 0.100000 0.000000 -0.032215 -2.714277 0.097690 + 0.200000 0.100000 0.000000 -0.660979 -8.879865 -0.258071 + 0.300000 0.100000 0.000000 -0.986340 -17.220891 -0.467893 + 0.400000 0.100000 0.000000 -0.815784 -27.628714 -1.147259 + 0.500000 0.100000 0.000000 -0.954983 -39.333693 -1.895650 + 0.600000 0.100000 0.000000 -0.890426 -51.998987 -2.735442 + 0.700000 0.100000 0.000000 -0.954200 -65.213557 -3.623888 + 0.800000 0.100000 0.000000 -0.874373 -78.487683 -4.564559 + 0.900000 0.100000 0.000000 -0.877188 -91.890305 -5.542381 + 0.100000 0.100000 0.200000 0.259705 -2.433016 -0.135993 + 0.200000 0.100000 0.200000 0.470217 -8.152901 -0.111506 + 0.300000 0.100000 0.200000 0.666702 -16.727816 -0.525085 + 0.400000 0.100000 0.200000 0.834030 -26.932425 -1.138746 + 0.500000 0.100000 0.200000 0.923512 -38.631323 -1.867213 + 0.600000 0.100000 0.200000 0.953859 -51.212272 -2.684003 + 0.700000 0.100000 0.200000 1.001956 -64.418762 -3.609291 + 0.800000 0.100000 0.200000 1.046390 -77.689092 -4.546626 + 0.900000 0.100000 0.200000 1.100527 -91.071558 -5.509749 + 0.100000 0.000000 0.100000 -3.203420 -3.270012 0.446137 + 0.200000 0.000000 0.100000 -6.632743 -9.459656 0.199121 + 0.300000 0.000000 0.100000 -8.103698 -17.324682 -0.146009 + 0.400000 0.000000 0.100000 -10.453847 -27.715989 -0.720884 + 0.500000 0.000000 0.100000 -11.349122 -39.120255 -1.467302 + 0.600000 0.000000 0.100000 -12.417532 -51.768029 -2.286628 + 0.700000 0.000000 0.100000 -12.772644 -64.771593 -3.195134 + 0.800000 0.000000 0.100000 -12.983080 -78.116343 -4.121279 + 0.900000 0.000000 0.100000 -13.131487 -91.444704 -5.100296 + 0.900000 0.200000 0.100000 13.375938 -91.552962 -5.927330 + 0.800000 0.200000 0.100000 13.234129 -78.254518 -4.954034 + 0.700000 0.200000 0.100000 13.033514 -64.952089 -3.996562 + 0.600000 0.200000 0.100000 12.584595 -51.777577 -3.067165 + 0.500000 0.200000 0.100000 11.524781 -39.446481 -2.227014 + 0.400000 0.200000 0.100000 10.549333 -27.638584 -1.357001 + 0.300000 0.200000 0.100000 8.351271 -17.881521 -0.889400 + 0.200000 0.200000 0.100000 6.690763 -9.075058 -0.206139 + 0.100000 0.200000 0.100000 2.714882 -3.084584 0.149641 + 1.000000 0.100000 0.100000 0.130812 -104.838046 -6.519430 + 0.000000 0.100000 0.100000 0.000000 0.000000 0.000000 + 0.258996 0.167409 0.024584 4.610427 -13.978657 -0.325173 + 0.457492 0.149822 0.056996 5.158430 -34.292954 -1.675924 + 0.349644 0.046056 0.045880 -5.421315 -22.176834 -0.768848 + 0.150000 0.051173 0.148827 -2.207225 -5.351112 0.287283 + 0.855390 0.161736 0.161736 8.867649 -85.321966 -5.330628 + 0.550000 0.051173 0.051173 -6.237603 -45.426887 -2.180209 + 0.543924 0.157908 0.046877 6.523154 -44.717660 -2.410281 + 0.764773 0.157448 0.048357 7.046711 -73.693713 -4.457503 + 0.658996 0.167409 0.024584 7.919900 -59.744390 -3.480658 + 0.850000 0.051173 0.051173 -6.809155 -84.973793 -4.846472 + 0.762545 0.051173 0.051173 -6.689009 -73.253346 -3.989708 + 0.831418 0.102838 0.102018 0.490633 -82.280102 -4.863904 + 0.550000 0.125539 0.125539 3.384999 -45.015990 -2.354018 + 0.354579 0.107128 0.104876 0.777249 -22.218430 -0.838197 + 0.150000 0.125539 0.074461 1.193630 -4.973465 0.041993 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3d_threept_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3d_threept_results.txt new file mode 100644 index 00000000..0af5e4bb --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3d_threept_results.txt @@ -0,0 +1,101 @@ + x0 y0 z0 ux uy uz +------------------------------------------------------------------------------ + 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.000000 0.636735 0.000000 0.580626 + 1.000000 0.200000 0.000000 0.139954 -0.040342 0.569625 + 0.000000 0.200000 0.000000 0.505836 -0.079649 -0.044503 + 0.000000 0.000000 0.200000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.200000 0.396347 0.000000 0.590296 + 1.000000 0.200000 0.200000 -0.078336 -0.032555 0.580238 + 0.000000 0.200000 0.200000 0.496682 -0.031206 -0.037381 + 0.100000 0.000000 0.000000 0.038677 -0.331683 0.016183 + 0.200000 0.000000 0.000000 0.077745 -0.578067 0.034681 + 0.300000 0.000000 0.000000 0.139592 -0.783824 0.058449 + 0.400000 0.000000 0.000000 0.224228 -0.928911 0.092516 + 0.500000 0.000000 0.000000 0.329068 -0.989009 0.139579 + 0.600000 0.000000 0.000000 0.439989 -0.927704 0.206242 + 0.700000 0.000000 0.000000 0.526238 -0.773779 0.285669 + 0.800000 0.000000 0.000000 0.584870 -0.556955 0.377660 + 0.900000 0.000000 0.000000 0.621981 -0.300425 0.477573 + 1.000000 0.100000 0.000000 0.380692 -0.029481 0.575764 + 0.900000 0.200000 0.000000 0.144933 -0.301783 0.458475 + 0.800000 0.200000 0.000000 0.167818 -0.552909 0.348101 + 0.700000 0.200000 0.000000 0.206942 -0.768242 0.245974 + 0.600000 0.200000 0.000000 0.261782 -0.927024 0.154932 + 0.500000 0.200000 0.000000 0.335544 -1.025730 0.077591 + 0.400000 0.200000 0.000000 0.391612 -0.944512 0.026551 + 0.300000 0.200000 0.000000 0.442166 -0.794709 -0.007469 + 0.200000 0.200000 0.000000 0.478521 -0.586871 -0.027707 + 0.100000 0.200000 0.000000 0.499323 -0.339670 -0.038464 + 0.000000 0.100000 0.000000 0.271292 -0.061498 -0.021773 + 0.100000 0.000000 0.200000 0.019709 -0.279308 0.008816 + 0.200000 0.000000 0.200000 0.045271 -0.529689 0.019411 + 0.300000 0.000000 0.200000 0.085069 -0.740473 0.036904 + 0.400000 0.000000 0.200000 0.139985 -0.893324 0.066183 + 0.500000 0.000000 0.200000 0.208573 -0.964579 0.112518 + 0.600000 0.000000 0.200000 0.280479 -0.905932 0.179715 + 0.700000 0.000000 0.200000 0.335086 -0.757968 0.265403 + 0.800000 0.000000 0.200000 0.372645 -0.546271 0.364102 + 0.900000 0.000000 0.200000 0.394237 -0.292330 0.473234 + 1.000000 0.100000 0.200000 0.156419 -0.029056 0.587504 + 0.900000 0.200000 0.200000 -0.071876 -0.285861 0.467383 + 0.800000 0.200000 0.200000 -0.039039 -0.534696 0.363070 + 0.700000 0.200000 0.200000 0.021745 -0.748266 0.267891 + 0.600000 0.200000 0.200000 0.104660 -0.904338 0.186854 + 0.500000 0.200000 0.200000 0.213108 -1.012866 0.125112 + 0.400000 0.200000 0.200000 0.312027 -0.895751 0.055769 + 0.300000 0.200000 0.200000 0.393959 -0.742998 0.012962 + 0.200000 0.200000 0.200000 0.451241 -0.533597 -0.013963 + 0.100000 0.200000 0.200000 0.484730 -0.287736 -0.029809 + 0.000000 0.100000 0.200000 0.251814 -0.025996 -0.015031 + 0.000000 0.000000 0.100000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.100000 0.517675 0.000000 0.585581 + 1.000000 0.200000 0.100000 0.031948 -0.036469 0.575747 + 0.000000 0.200000 0.100000 0.500532 -0.053587 -0.040573 + 0.100000 0.100000 0.000000 0.275042 -0.337877 -0.010052 + 0.200000 0.100000 0.000000 0.281676 -0.589362 0.004853 + 0.300000 0.100000 0.000000 0.293531 -0.799692 0.027151 + 0.400000 0.100000 0.000000 0.310160 -0.948941 0.060964 + 0.500000 0.100000 0.000000 0.331842 -1.012842 0.108397 + 0.600000 0.100000 0.000000 0.354541 -0.943048 0.179525 + 0.700000 0.100000 0.000000 0.364561 -0.780710 0.265409 + 0.800000 0.100000 0.000000 0.371566 -0.561660 0.362666 + 0.900000 0.100000 0.000000 0.374373 -0.304596 0.467424 + 0.100000 0.100000 0.200000 0.251858 -0.287728 -0.009510 + 0.200000 0.100000 0.200000 0.246804 -0.538000 0.002924 + 0.300000 0.100000 0.200000 0.237494 -0.751679 0.025250 + 0.400000 0.100000 0.200000 0.224149 -0.908783 0.061565 + 0.500000 0.100000 0.200000 0.209509 -0.991924 0.117053 + 0.600000 0.100000 0.200000 0.200349 -0.920001 0.184330 + 0.700000 0.100000 0.200000 0.182555 -0.764009 0.268163 + 0.800000 0.100000 0.200000 0.168294 -0.547992 0.365488 + 0.900000 0.100000 0.200000 0.156583 -0.291027 0.472815 + 0.100000 0.000000 0.100000 0.028803 -0.300797 0.011506 + 0.200000 0.000000 0.100000 0.061352 -0.550339 0.025607 + 0.300000 0.000000 0.100000 0.112398 -0.757605 0.045466 + 0.400000 0.000000 0.100000 0.182450 -0.905121 0.076158 + 0.500000 0.000000 0.100000 0.269143 -0.969261 0.121799 + 0.600000 0.000000 0.100000 0.359785 -0.909916 0.189401 + 0.700000 0.000000 0.100000 0.430241 -0.759983 0.272919 + 0.800000 0.000000 0.100000 0.478937 -0.547352 0.369163 + 0.900000 0.000000 0.100000 0.508975 -0.293919 0.474445 + 0.900000 0.200000 0.100000 0.037776 -0.292406 0.462605 + 0.800000 0.200000 0.100000 0.065266 -0.541197 0.354224 + 0.700000 0.200000 0.100000 0.114395 -0.753768 0.254710 + 0.600000 0.200000 0.100000 0.182817 -0.909211 0.167644 + 0.500000 0.200000 0.100000 0.274905 -1.010862 0.096198 + 0.400000 0.200000 0.100000 0.351658 -0.914616 0.038271 + 0.300000 0.200000 0.100000 0.418006 -0.763242 0.000332 + 0.200000 0.200000 0.100000 0.464751 -0.555814 -0.022458 + 0.100000 0.200000 0.100000 0.491605 -0.310693 -0.034752 + 1.000000 0.100000 0.100000 0.269479 -0.028409 0.581403 + 0.000000 0.100000 0.100000 0.260225 -0.042960 -0.017273 + 0.100000 0.100000 0.100000 0.262887 -0.309727 -0.010331 + 0.200000 0.100000 0.100000 0.264125 -0.559751 0.002386 + 0.300000 0.100000 0.100000 0.265663 -0.770628 0.023892 + 0.400000 0.100000 0.100000 0.267622 -0.922751 0.058125 + 0.500000 0.100000 0.100000 0.271270 -0.994322 0.108335 + 0.600000 0.100000 0.100000 0.277273 -0.924718 0.178542 + 0.700000 0.100000 0.100000 0.273467 -0.767115 0.264379 + 0.800000 0.100000 0.100000 0.270344 -0.551272 0.362519 + 0.900000 0.100000 0.100000 0.266440 -0.296108 0.469343 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3d_torsion_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3d_torsion_results.txt new file mode 100644 index 00000000..f36de708 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3d_torsion_results.txt @@ -0,0 +1,281 @@ + x0 y0 z0 ux uy uz +------------------------------------------------------------------------------ + 0.000000 0.100000 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.100000 0.000000 0.000304 -0.001956 0.010557 + 0.000000 0.084125 0.054064 0.000000 0.000000 0.000000 + 0.000000 0.041542 0.090963 0.000000 0.000000 0.000000 + 0.000000 -0.014231 0.098982 0.000000 0.000000 0.000000 + 0.000000 -0.065486 0.075575 0.000000 0.000000 0.000000 + 0.000000 -0.095949 0.028173 0.000000 0.000000 0.000000 + 0.000000 -0.095949 -0.028173 0.000000 0.000000 0.000000 + 0.000000 -0.065486 -0.075575 0.000000 0.000000 0.000000 + 0.000000 -0.014231 -0.098982 0.000000 0.000000 0.000000 + 0.000000 0.041542 -0.090963 0.000000 0.000000 0.000000 + 0.000000 0.084125 -0.054064 0.000000 0.000000 0.000000 + 0.058824 0.100000 0.000000 0.000032 0.000009 0.000677 + 0.117647 0.100000 0.000000 0.000084 -0.000082 0.001349 + 0.176471 0.100000 0.000000 0.000076 -0.000164 0.002148 + 0.235294 0.100000 0.000000 0.000130 -0.000162 0.002584 + 0.294118 0.100000 0.000000 0.000155 -0.000214 0.003144 + 0.352941 0.100000 0.000000 0.000180 -0.000336 0.003901 + 0.411765 0.100000 0.000000 0.000141 -0.000435 0.004438 + 0.470588 0.100000 0.000000 0.000191 -0.000533 0.005002 + 0.529412 0.100000 0.000000 0.000226 -0.000661 0.005547 + 0.588235 0.100000 0.000000 0.000231 -0.000875 0.006240 + 0.647059 0.100000 0.000000 0.000248 -0.000946 0.006779 + 0.705882 0.100000 0.000000 0.000260 -0.001065 0.007440 + 0.764706 0.100000 0.000000 0.000300 -0.001254 0.008004 + 0.823529 0.100000 0.000000 0.000280 -0.001444 0.008536 + 0.882353 0.100000 0.000000 0.000271 -0.001548 0.009281 + 0.941176 0.100000 0.000000 0.000312 -0.001799 0.009807 + 1.000000 0.084125 0.054064 0.000265 -0.007847 0.008842 + 1.000000 0.041542 0.090963 0.000144 -0.011753 0.004310 + 1.000000 -0.014231 0.098982 -0.000025 -0.012585 -0.001760 + 1.000000 -0.065486 0.075575 -0.000150 -0.010062 -0.007331 + 1.000000 -0.095949 0.028173 -0.000288 -0.005021 -0.010571 + 1.000000 -0.095949 -0.028173 -0.000286 0.001076 -0.010545 + 1.000000 -0.065486 -0.075575 -0.000213 0.006260 -0.007279 + 1.000000 -0.014231 -0.098982 -0.000072 0.008793 -0.001841 + 1.000000 0.041542 -0.090963 0.000098 0.007891 0.004281 + 1.000000 0.084125 -0.054064 0.000227 0.003908 0.008864 + 0.000000 -0.019405 -0.045291 0.000000 0.000000 0.000000 + 0.000000 0.035456 0.039541 0.000000 0.000000 0.000000 + 0.000000 -0.043945 0.028242 0.000000 0.000000 0.000000 + 0.000000 0.025275 -0.048717 0.000000 0.000000 0.000000 + 0.000000 0.000169 0.000647 0.000000 0.000000 0.000000 + 0.000000 0.054858 -0.001421 0.000000 0.000000 0.000000 + 0.000000 -0.053428 -0.015330 0.000000 0.000000 0.000000 + 0.000000 -0.008006 0.055681 0.000000 0.000000 0.000000 + 0.499510 0.086868 -0.049537 0.000145 0.002119 0.004688 + 0.323529 0.087024 -0.049262 0.000167 0.001560 0.003168 + 0.676471 0.087024 -0.049262 0.000178 0.002541 0.006158 + 0.735294 0.087024 0.049262 0.000248 -0.004984 0.006668 + 0.264706 0.087024 0.049262 0.000131 -0.001614 0.002433 + 0.951371 -0.084125 -0.054064 -0.000244 0.003701 -0.008774 + 0.048629 -0.084125 -0.054064 -0.000026 0.000343 -0.000467 + 0.955690 -0.040662 0.091360 -0.000080 -0.011167 -0.004346 + 0.040971 -0.040591 0.091391 -0.000006 -0.000490 -0.000236 + 0.794118 0.087024 -0.049262 0.000212 0.002875 0.007281 + 0.205882 0.087024 -0.049262 0.000083 0.001047 0.002097 + 0.382353 0.087024 0.049262 0.000171 -0.002376 0.003534 + 0.617315 0.086646 0.049925 0.000210 -0.004227 0.005572 + 0.500000 0.087024 0.049262 0.000174 -0.003195 0.004604 + 0.048629 0.014231 -0.098982 -0.000006 0.000560 0.000062 + 0.957971 0.012768 -0.099182 0.000007 0.008419 0.001101 + 0.852941 0.087024 0.049262 0.000249 -0.005999 0.007675 + 0.131407 0.084270 0.053839 0.000046 -0.000835 0.001207 + 0.958205 0.065577 0.075496 0.000216 -0.009546 0.006509 + 0.048629 0.065486 0.075575 0.000005 -0.000500 0.000359 + 0.911765 0.087024 -0.049262 0.000220 0.003156 0.008345 + 0.088235 0.087024 -0.049262 0.000059 0.000504 0.000961 + 0.264985 0.087106 -0.049117 0.000106 0.001234 0.002539 + 0.294119 0.052066 -0.085376 0.000053 0.002689 0.001758 + 0.352223 0.051873 -0.085494 0.000067 0.002958 0.001991 + 0.322945 0.003845 -0.099926 -0.000021 0.003365 0.000102 + 0.264930 0.004085 -0.099917 -0.000021 0.002777 0.000093 + 0.380973 0.003565 -0.099936 -0.000003 0.003680 0.000099 + 0.410451 0.051655 -0.085626 0.000095 0.003376 0.002207 + 0.439048 0.003244 -0.099947 -0.000020 0.004301 0.000083 + 0.735496 0.087084 -0.049157 0.000199 0.002616 0.006610 + 0.706120 0.051943 -0.085451 0.000097 0.005293 0.003831 + 0.645776 0.051367 -0.085799 0.000117 0.004845 0.003364 + 0.763931 0.051701 -0.085598 0.000056 0.005728 0.004073 + 0.735040 0.003989 -0.099920 -0.000012 0.006582 0.000216 + 0.792694 0.003688 -0.099932 -0.000049 0.007233 0.000208 + 0.763726 -0.044987 -0.089309 -0.000118 0.005947 -0.003826 + 0.705169 -0.045397 -0.089102 -0.000099 0.005550 -0.003522 + 0.817130 -0.044641 -0.089483 -0.000162 0.006428 -0.004092 + 0.792415 -0.082565 -0.056418 -0.000250 0.003390 -0.007140 + 0.849939 -0.082704 -0.056214 -0.000254 0.003574 -0.007556 + 0.820956 -0.099546 -0.009519 -0.000292 -0.000549 -0.008876 + 0.763366 -0.099523 -0.009758 -0.000257 -0.000500 -0.008089 + 0.792060 -0.091727 0.039826 -0.000228 -0.004708 -0.007899 + 0.734236 -0.091851 0.039540 -0.000236 -0.004280 -0.007354 + 0.763083 -0.061118 0.079149 -0.000148 -0.007564 -0.005029 + 0.705143 -0.061223 0.079068 -0.000118 -0.007044 -0.004856 + 0.820814 -0.060975 0.079259 -0.000127 -0.008419 -0.005472 + 0.676410 -0.091971 0.039260 -0.000246 -0.003896 -0.006778 + 0.647120 -0.061175 0.079105 -0.000094 -0.006251 -0.004217 + 0.617893 -0.092117 0.038917 -0.000191 -0.003410 -0.006088 + 0.409791 -0.045686 -0.088954 -0.000082 0.003403 -0.002029 + 0.293754 -0.045044 -0.089281 -0.000094 0.002701 -0.001472 + 0.235952 -0.044895 -0.089356 -0.000049 0.002212 -0.001249 + 0.467879 -0.045976 -0.088805 -0.000110 0.004019 -0.002361 + 0.438681 -0.083312 -0.055309 -0.000175 0.002161 -0.004056 + 0.588839 -0.061251 0.079046 -0.000098 -0.005859 -0.003939 + 0.496768 -0.083491 -0.055039 -0.000192 0.002265 -0.004556 + 0.467374 -0.099721 -0.007466 -0.000217 -0.000258 -0.005171 + 0.409452 -0.099686 -0.007919 -0.000216 -0.000083 -0.004445 + 0.264654 -0.082605 -0.056360 -0.000114 0.001391 -0.002348 + 0.207023 -0.082521 -0.056483 -0.000081 0.001171 -0.002015 + 0.437979 -0.090763 0.041977 -0.000172 -0.002505 -0.004440 + 0.380150 -0.090965 0.041538 -0.000140 -0.002060 -0.003828 + 0.235591 -0.099545 -0.009528 -0.000134 0.000118 -0.002621 + 0.178032 -0.099529 -0.009698 -0.000091 0.000126 -0.002052 + 0.206619 -0.091825 0.039601 -0.000097 -0.000982 -0.002202 + 0.526011 -0.046240 -0.088667 -0.000106 0.004355 -0.002721 + 0.178401 -0.044925 -0.089340 -0.000044 0.001767 -0.000969 + 0.408651 -0.058801 0.080886 -0.000103 -0.004023 -0.002699 + 0.352049 -0.059840 0.080120 -0.000079 -0.003506 -0.002405 + 0.465340 -0.059811 0.080141 -0.000088 -0.004689 -0.003199 + 0.149250 -0.091926 0.039365 -0.000076 -0.000692 -0.001521 + 0.177792 -0.061486 0.078864 -0.000034 -0.001744 -0.001242 + 0.676052 -0.015003 0.098868 0.000011 -0.008152 -0.001244 + 0.791869 -0.015030 0.098864 0.000006 -0.009690 -0.001451 + 0.235270 -0.061095 0.079167 -0.000066 -0.002131 -0.001550 + 0.207003 -0.014658 0.098920 -0.000016 -0.002344 -0.000340 + 0.848340 -0.014691 0.098915 -0.000015 -0.010475 -0.001494 + 0.264139 -0.015062 0.098859 -0.000012 -0.003084 -0.000433 + 0.437497 -0.011603 0.099325 0.000031 -0.005382 -0.000610 + 0.495947 -0.011252 0.099365 -0.000006 -0.005867 -0.000767 + 0.150516 -0.014784 0.098901 0.000024 -0.001757 -0.000257 + 0.645560 -0.099466 -0.010323 -0.000250 -0.000268 -0.006967 + 0.850417 0.003365 -0.099943 -0.000027 0.007409 0.000103 + 0.872752 -0.099806 -0.006224 -0.000280 -0.000944 -0.009455 + 0.554844 -0.083577 -0.054908 -0.000202 0.002540 -0.005125 + 0.584116 -0.046487 -0.088538 -0.000142 0.004873 -0.003071 + 0.555263 0.002626 -0.099966 -0.000043 0.005441 0.000066 + 0.560260 -0.091864 0.039509 -0.000197 -0.003130 -0.005661 + 0.293318 -0.099577 -0.009185 -0.000121 0.000017 -0.003232 + 0.128021 -0.099457 -0.010411 -0.000056 0.000105 -0.001339 + 0.091870 -0.092028 0.039125 -0.000043 -0.000484 -0.001034 + 0.869952 -0.061563 0.078803 -0.000147 -0.008789 -0.005836 + 0.820847 0.035632 0.093436 0.000127 -0.009681 0.002895 + 0.869097 0.036866 0.092956 0.000130 -0.010172 0.003218 + 0.177081 0.034246 0.093953 0.000038 -0.002055 0.000712 + 0.128355 0.032063 0.094720 0.000039 -0.001375 0.000460 + 0.768037 0.035943 0.093317 0.000137 -0.008881 0.002731 + 0.466479 0.038704 0.092206 0.000101 -0.005232 0.001858 + 0.407982 0.038414 0.092327 0.000122 -0.004610 0.001705 + 0.528487 -0.060525 0.079604 -0.000122 -0.005197 -0.003570 + 0.555555 -0.013049 0.099145 -0.000023 -0.006888 -0.000906 + 0.525856 0.039509 0.091864 0.000143 -0.005868 0.002172 + 0.585085 0.038851 0.092145 0.000104 -0.006704 0.002407 + 0.198933 0.081135 0.058457 0.000109 -0.001424 0.001838 + 0.794323 0.080480 0.059355 0.000263 -0.006374 0.006714 + 0.702320 0.049396 0.086948 0.000167 -0.007547 0.003593 + 0.248214 0.046120 0.088730 0.000096 -0.002628 0.001244 + 0.304845 0.028536 0.095842 0.000046 -0.003470 0.000927 + 0.441119 0.082334 0.056754 0.000174 -0.003271 0.003974 + 0.614971 0.003288 -0.099946 -0.000024 0.005697 0.000057 + 0.585796 0.051141 -0.085934 0.000110 0.004600 0.003081 + 0.643748 -0.046165 -0.088706 -0.000129 0.005146 -0.003266 + 0.852739 0.087084 -0.049157 0.000245 0.002891 0.007594 + 0.146786 0.087104 -0.049120 0.000085 0.000752 0.001421 + 0.130189 0.051128 -0.085941 0.000024 0.001157 0.000669 + 0.182625 0.051682 -0.085610 0.000036 0.001727 0.001045 + 0.237937 0.051944 -0.085451 0.000044 0.002028 0.001350 + 0.849952 -0.091583 0.040156 -0.000218 -0.005153 -0.008497 + 0.675808 0.086764 0.049720 0.000218 -0.004649 0.006227 + 0.151759 -0.082226 -0.056911 -0.000055 0.000920 -0.001434 + 0.119136 -0.043637 -0.089977 -0.000043 0.001213 -0.000619 + 0.381641 0.086930 -0.049428 0.000140 0.001608 0.003528 + 0.440261 0.086558 -0.050077 0.000127 0.001917 0.004180 + 0.617647 0.087024 -0.049262 0.000183 0.002367 0.005565 + 0.207647 0.003802 -0.099928 -0.000028 0.002250 0.000085 + 0.822786 0.051863 -0.085500 0.000108 0.006093 0.004323 + 0.125312 -0.062210 0.078294 -0.000058 -0.001096 -0.000840 + 0.323426 0.087344 0.048694 0.000159 -0.002045 0.003045 + 0.558509 0.086705 0.049822 0.000186 -0.003733 0.005160 + 0.642829 0.049380 0.086958 0.000151 -0.006904 0.003265 + 0.611409 -0.012980 0.099154 -0.000009 -0.007341 -0.000892 + 0.612980 -0.082892 -0.055937 -0.000217 0.002864 -0.005504 + 0.497158 0.002930 -0.099957 -0.000017 0.004745 0.000159 + 0.527343 0.051329 -0.085822 0.000081 0.004198 0.002885 + 0.468951 0.051500 -0.085719 0.000109 0.003893 0.002561 + 0.525426 -0.099738 -0.007233 -0.000203 -0.000302 -0.005655 + 0.704637 -0.099495 -0.010042 -0.000272 -0.000433 -0.007735 + 0.351872 -0.045293 -0.089154 -0.000103 0.003165 -0.001849 + 0.322474 -0.082773 -0.056113 -0.000142 0.001811 -0.003117 + 0.380645 -0.083050 -0.055701 -0.000171 0.001986 -0.003560 + 0.496195 -0.090858 0.041772 -0.000200 -0.002930 -0.004999 + 0.383152 -0.013006 0.099151 -0.000005 -0.004520 -0.000601 + 0.734897 -0.082307 -0.056793 -0.000210 0.003159 -0.006524 + 0.675810 -0.082250 -0.056877 -0.000229 0.003110 -0.006171 + 0.734208 -0.014256 0.098979 -0.000002 -0.008803 -0.001270 + 0.869406 0.050692 -0.086199 0.000117 0.006261 0.004411 + 0.351363 -0.099630 -0.008600 -0.000178 -0.000000 -0.003911 + 0.322046 -0.091365 0.040649 -0.000111 -0.001707 -0.003269 + 0.264028 -0.091615 0.040084 -0.000104 -0.001364 -0.002685 + 0.675175 0.003604 -0.099935 -0.000008 0.006173 0.000180 + 0.292988 -0.060691 0.079477 -0.000075 -0.002868 -0.002018 + 0.558508 0.087052 -0.049213 0.000177 0.002196 0.005177 + 0.151480 0.003210 -0.099948 -0.000042 0.001653 0.000026 + 0.039929 -0.099982 0.001912 -0.000015 -0.000030 -0.000456 + 0.061098 -0.041970 -0.090766 -0.000024 0.000660 -0.000329 + 0.939079 -0.099996 -0.000910 -0.000311 -0.001633 -0.010285 + 0.952234 -0.041726 -0.090879 -0.000140 0.007488 -0.004459 + 0.902466 -0.065486 -0.075575 -0.000206 0.005637 -0.006506 + 0.902037 -0.008776 -0.099614 -0.000037 0.007860 -0.001041 + 0.952110 -0.084603 0.053314 -0.000229 -0.007228 -0.008798 + 0.958605 0.013076 0.099141 0.000047 -0.011960 0.001098 + 0.904717 -0.014231 0.098982 -0.000009 -0.011162 -0.001565 + 0.063016 0.018760 0.098225 -0.000000 -0.000776 0.000102 + 0.354413 0.053410 0.084542 0.000104 -0.003624 0.002060 + 0.905953 0.087510 0.048395 0.000266 -0.006279 0.008215 + 0.082806 0.088704 0.046170 0.000031 -0.000482 0.000876 + 0.961497 0.065407 -0.075644 0.000156 0.005976 0.006489 + 0.039291 0.065523 -0.075543 0.000019 0.000372 0.000349 + 0.101479 -0.015708 0.098759 0.000004 -0.001079 -0.000182 + 0.584888 -0.099523 -0.009754 -0.000221 -0.000120 -0.006372 + 0.902419 -0.092911 0.036982 -0.000260 -0.005159 -0.009077 + 0.042863 -0.084125 0.054064 -0.000012 -0.000312 -0.000438 + 0.098132 -0.000124 -0.100000 -0.000026 0.001213 -0.000039 + 0.105863 -0.081976 -0.057271 -0.000036 0.000699 -0.001004 + 0.320142 -0.020315 0.097915 -0.000021 -0.003740 -0.000736 + 0.867331 -0.040909 -0.091250 -0.000129 0.006805 -0.003956 + 0.909583 -0.091650 -0.040004 -0.000286 0.002211 -0.009159 + 0.041778 0.091671 0.039955 0.000020 -0.000211 0.000440 + 0.958222 0.091671 0.039955 0.000282 -0.005958 0.009177 + 0.958421 0.091755 -0.039762 0.000256 0.002254 0.009205 + 0.041579 0.091755 -0.039762 0.000019 0.000238 0.000478 + 0.077815 -0.067969 0.073350 -0.000027 -0.000712 -0.000604 + 0.294219 0.065971 0.075152 0.000101 -0.002627 0.002018 + 0.920536 -0.065402 0.075648 -0.000166 -0.009123 -0.006587 + 0.920424 0.041542 0.090963 0.000146 -0.010594 0.003872 + 0.081944 -0.096674 -0.025575 -0.000017 0.000277 -0.000933 + 0.090227 0.060497 0.079625 0.000023 -0.000838 0.000673 + 0.922738 0.042842 -0.090358 0.000080 0.007164 0.003998 + 0.077439 0.042776 -0.090389 -0.000008 0.000839 0.000437 + 0.345361 0.014449 0.098951 0.000047 -0.004167 0.000503 + 1.000000 -0.019405 -0.045291 -0.000061 0.002978 -0.002377 + 1.000000 0.035456 0.039541 0.000106 -0.006275 0.003627 + 1.000000 -0.043945 0.028242 -0.000112 -0.004996 -0.004988 + 1.000000 0.025275 -0.048717 0.000055 0.003302 0.002524 + 1.000000 0.000169 0.000647 -0.000003 -0.002015 -0.000243 + 1.000000 0.054858 -0.001421 0.000162 -0.001806 0.005748 + 1.000000 -0.053428 -0.015330 -0.000147 -0.000303 -0.005955 + 1.000000 -0.008006 0.055681 -0.000015 -0.007908 -0.001085 + 0.221116 -0.000211 0.000040 -0.000004 -0.000149 -0.000023 + 0.835197 -0.000464 0.000225 -0.000004 -0.001442 -0.000228 + 0.366425 -0.000045 -0.000194 0.000004 -0.000321 0.000006 + 0.482605 -0.000143 -0.000400 0.000011 -0.000578 -0.000073 + 0.720722 0.000091 -0.000018 -0.000010 -0.001127 -0.000095 + 0.100064 0.000633 0.000045 0.000003 -0.000055 0.000010 + 0.601683 0.001097 -0.001040 0.000003 -0.000763 -0.000022 + 0.917637 -0.015376 0.008053 -0.000038 -0.002506 -0.001696 + 0.295636 -0.023635 -0.016081 -0.000041 0.000284 -0.000812 + 0.160354 -0.033652 0.003286 -0.000028 -0.000115 -0.000645 + 0.424534 -0.026829 0.022958 -0.000045 -0.001483 -0.001321 + 0.424320 0.009830 -0.034086 0.000018 0.001153 0.000359 + 0.777903 -0.023650 -0.026873 -0.000076 0.000886 -0.002157 + 0.542245 -0.022379 -0.026303 -0.000052 0.000782 -0.001424 + 0.660861 -0.033942 0.005207 -0.000085 -0.001418 -0.002518 + 0.311392 0.036317 0.007863 0.000059 -0.000590 0.001202 + 0.777895 0.001905 0.035315 0.000018 -0.004252 -0.000049 + 0.661554 0.033578 -0.008971 0.000075 -0.000318 0.002254 + 0.165176 0.026860 -0.025613 0.000017 0.000426 0.000447 + 0.886414 0.036758 -0.016037 0.000090 -0.000072 0.003272 + 0.542087 0.020602 0.027591 0.000058 -0.002278 0.001154 + 0.764801 0.037509 -0.024648 0.000082 0.000756 0.002926 + 0.944597 0.038091 0.015713 0.000108 -0.003431 0.003691 + 0.058003 0.036096 0.024073 0.000012 -0.000163 0.000217 + 0.266018 0.026594 -0.036574 0.000024 0.000838 0.000765 + 0.413587 0.035893 0.023005 0.000080 -0.001468 0.001586 + 0.264103 -0.025068 0.037491 -0.000022 -0.001291 -0.000730 + 0.058864 -0.042816 0.012035 -0.000004 -0.000104 -0.000286 + 0.875209 -0.033316 -0.031517 -0.000098 0.001394 -0.003264 + 0.942339 -0.005507 -0.044962 -0.000025 0.002811 -0.000777 + 0.149179 0.020067 0.035698 0.000021 -0.000705 0.000336 + 0.325372 -0.025432 0.037259 -0.000044 -0.001644 -0.000929 + 0.055415 0.003458 -0.040181 -0.000001 0.000233 0.000022 diff --git a/examples/Freefem/projet_validation/results/sofa_beam3pt_strain_results.txt b/examples/Freefem/projet_validation/results/sofa_beam3pt_strain_results.txt new file mode 100644 index 00000000..c1db6763 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_beam3pt_strain_results.txt @@ -0,0 +1,107 @@ + x0 y0 ux uy +------------------------------------------------------ + 0.000000 0.000000 0.000000 0.000000 + 1.000000 0.000000 0.148035 0.000000 + 1.000000 0.200000 0.006032 -0.014086 + 0.000000 0.200000 0.138603 -0.011673 + 0.000000 0.150000 0.104509 -0.011459 + 0.000000 0.100000 0.071229 -0.009942 + 0.000000 0.050000 0.037098 -0.006244 + 0.050000 0.000000 0.000962 -0.044422 + 0.100000 0.000000 0.003930 -0.082511 + 0.150000 0.000000 0.007907 -0.118078 + 0.200000 0.000000 0.012979 -0.151284 + 0.250000 0.000000 0.019293 -0.181665 + 0.300000 0.000000 0.026967 -0.208571 + 0.350000 0.000000 0.036107 -0.231229 + 0.400000 0.000000 0.046787 -0.248734 + 0.450000 0.000000 0.058925 -0.260074 + 0.500000 0.000000 0.072114 -0.264260 + 0.550000 0.000000 0.085086 -0.259842 + 0.600000 0.000000 0.096983 -0.248301 + 0.650000 0.000000 0.107522 -0.230875 + 0.700000 0.000000 0.116650 -0.208494 + 0.750000 0.000000 0.124379 -0.181939 + 0.800000 0.000000 0.130749 -0.151929 + 0.850000 0.000000 0.135836 -0.119112 + 0.900000 0.000000 0.139801 -0.083938 + 0.950000 0.000000 0.143059 -0.046059 + 1.000000 0.050000 0.107352 -0.008025 + 1.000000 0.100000 0.073175 -0.012117 + 1.000000 0.150000 0.040179 -0.013825 + 0.950000 0.200000 0.006448 -0.049168 + 0.900000 0.200000 0.008075 -0.084834 + 0.850000 0.200000 0.011204 -0.119576 + 0.800000 0.200000 0.015837 -0.152375 + 0.750000 0.200000 0.021922 -0.182436 + 0.700000 0.200000 0.029409 -0.209052 + 0.650000 0.200000 0.038251 -0.231585 + 0.600000 0.200000 0.048386 -0.249548 + 0.550000 0.200000 0.059679 -0.262976 + 0.500000 0.200000 0.070756 -0.275368 + 0.450000 0.200000 0.085010 -0.262673 + 0.400000 0.200000 0.096505 -0.248940 + 0.350000 0.200000 0.106634 -0.230666 + 0.300000 0.200000 0.115508 -0.207810 + 0.250000 0.200000 0.123076 -0.180853 + 0.200000 0.200000 0.129255 -0.150433 + 0.150000 0.200000 0.133935 -0.117306 + 0.100000 0.200000 0.136983 -0.082400 + 0.050000 0.200000 0.138389 -0.046839 + 0.050000 0.150000 0.104626 -0.047012 + 0.100000 0.150000 0.103782 -0.083247 + 0.150000 0.150000 0.102018 -0.118757 + 0.200000 0.150000 0.099488 -0.152379 + 0.250000 0.150000 0.096270 -0.183236 + 0.300000 0.150000 0.092367 -0.210611 + 0.350000 0.150000 0.087762 -0.233868 + 0.400000 0.150000 0.082439 -0.252506 + 0.450000 0.150000 0.076464 -0.266367 + 0.500000 0.150000 0.072095 -0.273421 + 0.550000 0.150000 0.067049 -0.265764 + 0.600000 0.150000 0.061601 -0.252700 + 0.650000 0.150000 0.056544 -0.234491 + 0.700000 0.150000 0.052110 -0.211560 + 0.750000 0.150000 0.048358 -0.184502 + 0.800000 0.150000 0.045300 -0.153982 + 0.850000 0.150000 0.042939 -0.120705 + 0.900000 0.150000 0.041282 -0.085460 + 0.950000 0.150000 0.040354 -0.049273 + 0.050000 0.100000 0.072103 -0.046518 + 0.100000 0.100000 0.072023 -0.083571 + 0.150000 0.100000 0.071666 -0.119478 + 0.200000 0.100000 0.071393 -0.153251 + 0.250000 0.100000 0.071194 -0.184226 + 0.300000 0.100000 0.071014 -0.211734 + 0.350000 0.100000 0.070812 -0.235100 + 0.400000 0.100000 0.070629 -0.253630 + 0.450000 0.100000 0.070907 -0.266243 + 0.500000 0.100000 0.072076 -0.271545 + 0.550000 0.100000 0.072790 -0.265952 + 0.600000 0.100000 0.073009 -0.253485 + 0.650000 0.100000 0.073067 -0.235344 + 0.700000 0.100000 0.073091 -0.212321 + 0.750000 0.100000 0.073104 -0.185132 + 0.800000 0.100000 0.073091 -0.154478 + 0.850000 0.100000 0.073025 -0.121052 + 0.900000 0.100000 0.072900 -0.085557 + 0.950000 0.100000 0.072824 -0.048776 + 0.050000 0.050000 0.038753 -0.045336 + 0.100000 0.050000 0.039391 -0.083463 + 0.150000 0.050000 0.040858 -0.119350 + 0.200000 0.050000 0.043117 -0.152941 + 0.250000 0.050000 0.046110 -0.183738 + 0.300000 0.050000 0.049803 -0.211085 + 0.350000 0.050000 0.054194 -0.234239 + 0.400000 0.050000 0.059347 -0.252304 + 0.450000 0.050000 0.065324 -0.264195 + 0.500000 0.050000 0.071993 -0.268762 + 0.550000 0.050000 0.078430 -0.264035 + 0.600000 0.050000 0.084295 -0.252048 + 0.650000 0.050000 0.089511 -0.234159 + 0.700000 0.050000 0.094050 -0.211315 + 0.750000 0.050000 0.097895 -0.184297 + 0.800000 0.050000 0.101026 -0.153823 + 0.850000 0.050000 0.103421 -0.120563 + 0.900000 0.050000 0.105075 -0.085083 + 0.950000 0.050000 0.106122 -0.047655 diff --git a/examples/Freefem/projet_validation/results/sofa_distributed_results.txt b/examples/Freefem/projet_validation/results/sofa_distributed_results.txt new file mode 100644 index 00000000..e8e8e237 --- /dev/null +++ b/examples/Freefem/projet_validation/results/sofa_distributed_results.txt @@ -0,0 +1,12 @@ + x_initial x_final u_x +------------------------------------------ + 0.000000 0.000000 0.000000 + 0.111111 0.216049 0.104938 + 0.222222 0.419753 0.197531 + 0.333333 0.611111 0.277778 + 0.444444 0.790123 0.345679 + 0.555556 0.956790 0.401235 + 0.666667 1.111111 0.444444 + 0.777778 1.253086 0.475309 + 0.888889 1.382716 0.493827 + 1.000000 1.500000 0.500000