From 394e2513627f072f994ea8c83b5cb85b5fedae5e Mon Sep 17 00:00:00 2001 From: kgoao Date: Mon, 26 Jun 2017 21:26:40 +0100 Subject: [PATCH] FEM: FluidSection: Unit test --- src/Mod/Fem/App/CMakeLists.txt | 6 + src/Mod/Fem/CMakeLists.txt | 6 + src/Mod/Fem/TestFem.py | 276 ++++++++++++++++++ src/Mod/Fem/test_files/ccx/Flow1D_mesh.py | 49 ++++ src/Mod/Fem/test_files/ccx/Flow1D_points.csv | 27 ++ .../Fem/test_files/ccx/Flow1D_thermomech.dat | 0 .../test_files/ccx/Flow1D_thermomech.fcstd | Bin 0 -> 19521 bytes .../Fem/test_files/ccx/Flow1D_thermomech.frd | 125 ++++++++ .../Fem/test_files/ccx/Flow1D_thermomech.inp | 185 ++++++++++++ .../ccx/Flow1D_thermomech_expected_values | 5 + src/Mod/Fem/test_files/ccx/Flow1D_volumes.csv | 13 + 11 files changed, 692 insertions(+) create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_mesh.py create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_points.csv create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_thermomech.dat create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_thermomech.fcstd create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_thermomech.frd create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_thermomech.inp create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_thermomech_expected_values create mode 100644 src/Mod/Fem/test_files/ccx/Flow1D_volumes.csv diff --git a/src/Mod/Fem/App/CMakeLists.txt b/src/Mod/Fem/App/CMakeLists.txt index 2289e5bf2b..7c30353065 100644 --- a/src/Mod/Fem/App/CMakeLists.txt +++ b/src/Mod/Fem/App/CMakeLists.txt @@ -190,6 +190,12 @@ SET(FemTests_SRCS test_files/ccx/spine_thermomech.frd test_files/ccx/spine_thermomech_expected_values test_files/ccx/spine_thermomech.fcstd + test_files/ccx/Flow1D_mesh.py + test_files/ccx/Flow1D_thermomech.inp + test_files/ccx/Flow1D_thermomech.dat + test_files/ccx/Flow1D_thermomech.frd + test_files/ccx/Flow1D_thermomech_expected_values + test_files/ccx/Flow1D_thermomech.fcstd ) SET(FemBase_SRCS diff --git a/src/Mod/Fem/CMakeLists.txt b/src/Mod/Fem/CMakeLists.txt index ba98c69d5a..eb74919038 100755 --- a/src/Mod/Fem/CMakeLists.txt +++ b/src/Mod/Fem/CMakeLists.txt @@ -154,6 +154,12 @@ INSTALL( test_files/ccx/spine_thermomech.frd test_files/ccx/spine_thermomech_expected_values test_files/ccx/spine_thermomech.fcstd + test_files/ccx/Flow1D_mesh.py + test_files/ccx/Flow1D_thermomech.inp + test_files/ccx/Flow1D_thermomech.dat + test_files/ccx/Flow1D_thermomech.frd + test_files/ccx/Flow1D_thermomech_expected_values + test_files/ccx/Flow1D_thermomech.fcstd DESTINATION Mod/Fem/test_files/ccx ) diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index 8156db775a..b5011367b7 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -58,6 +58,11 @@ thermomech_save_fc_file = thermomech_analysis_dir + '/' + thermomech_base_name + thermomech_analysis_inp_file = test_file_dir + '/' + thermomech_base_name + '.inp' thermomech_expected_values = test_file_dir + "/spine_thermomech_expected_values" +Flow1D_thermomech_base_name = 'Flow1D_thermomech' +Flow1D_thermomech_analysis_dir = temp_dir + '/FEM_Flow1D_thermomech' +Flow1D_thermomech_save_fc_file = Flow1D_thermomech_analysis_dir + '/' + Flow1D_thermomech_base_name + '.fcstd' +Flow1D_thermomech_analysis_inp_file = test_file_dir + '/' + Flow1D_thermomech_base_name + '.inp' +Flow1D_thermomech_expected_values = test_file_dir + "/Flow1D_thermomech_expected_values" class FemTest(unittest.TestCase): def setUp(self): @@ -405,6 +410,277 @@ class FemCcxAnalysisTest(unittest.TestCase): fcc_print('--------------- End of FEM tests thermomech analysis ---------------') + def test_Flow1D_thermomech_analysis(self): + fcc_print('--------------- Start of 1D Flow FEM tests ---------------') + import Draft + p1 = FreeCAD.Vector(0, 1.11022302462516e-14, 50) + p2 = FreeCAD.Vector(0, -1.11022302462516e-14, -50) + p3 = FreeCAD.Vector(0, -9.54791801177633e-13, -4300) + p4 = FreeCAD.Vector(4950, -9.54791801177633e-13, -4300) + p5 = FreeCAD.Vector(5000, -9.54791801177633e-13, -4300) + p6 = FreeCAD.Vector(8535.53, -1.73983716322823e-12, -7835.53) + p7 = FreeCAD.Vector(8569.88, -1.74768644001233e-12, -7870.88) + p8 = FreeCAD.Vector(12105.41, -2.53273180206292e-12, -11406.41) + p9 = FreeCAD.Vector(12140.76, -2.54058107884702e-12, -11441.76) + p10 = FreeCAD.Vector(13908.53, -2.93310487009534e-12, -13209.53) + p11 = FreeCAD.Vector(13943.88, -2.94095414687944e-12, -13244.88) + p12 = FreeCAD.Vector(15046.97, -3.1858893301262e-12, -14347.97) + p13 = FreeCAD.Vector(15046.97, -1.764803858606e-12, -7947.97) + p14 = FreeCAD.Vector(15046.97, -1.7425993981135e-12, -7847.97) + p15 = FreeCAD.Vector(0, 0, 0) + p16 = FreeCAD.Vector(0, -4.82947015711942e-13, -2175) + p17 = FreeCAD.Vector(2475, -9.54791801177633e-13, -4300) + p18 = FreeCAD.Vector(4975, -9.54791801177633e-13, -4300) + p19 = FreeCAD.Vector(6767.765, -1.34731448220293e-12, -6067.765) + p20 = FreeCAD.Vector(8552.705, -1.74376180162028e-12, -7853.205) + p21 = FreeCAD.Vector(10337.645, -2.14020912103763e-12, -9638.645) + p22 = FreeCAD.Vector(12123.085, -2.53665644045497e-12, -11424.085) + p23 = FreeCAD.Vector(13024.645, -2.73684297447118e-12, -12325.645) + p24 = FreeCAD.Vector(13926.205, -2.93702950848739e-12, -13227.205) + p25 = FreeCAD.Vector(14495.425, -3.06342173850282e-12, -13796.425) + p26 = FreeCAD.Vector(15046.97, -2.4753465943661e-12, -11147.97) + p27 = FreeCAD.Vector(15046.97, -1.75370162835975e-12, -7897.97) + points = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27] + line = Draft.makeWire(points,closed=False,face=False,support=None) + fcc_print('Checking FEM new analysis...') + analysis = ObjectsFem.makeAnalysis('Analysis') + self.assertTrue(analysis, "FemTest of new analysis failed") + + fcc_print('Checking FEM new solver...') + solver_object = ObjectsFem.makeSolverCalculix('CalculiX') + solver_object.AnalysisType = 'thermomech' + solver_object.GeometricalNonlinearity = 'linear' + solver_object.ThermoMechSteadyState = True + solver_object.MatrixSolverType = 'default' + solver_object.IterationsThermoMechMaximum = 2000 + solver_object.IterationsControlParameterTimeUse = False + self.assertTrue(solver_object, "FemTest of new solver failed") + analysis.Member = analysis.Member + [solver_object] + + fcc_print('Checking FEM new material...') + new_material_object = ObjectsFem.makeMaterialFluid('FluidMaterial') + mat = new_material_object.Material + mat['Name'] = "Water" + mat['Density'] = "998 kg/m^3" + mat['SpecificHeat'] = "4.182 J/kg/K" + mat['DynamicViscosity'] = "1.003e-3 kg/m/s" + mat['VolumetricThermalExpansionCoefficient'] = "2.07e-4 m/m/K" + mat['ThermalConductivity'] = "0.591 W/m/K" + new_material_object.Material = mat + self.assertTrue(new_material_object, "FemTest of new material failed") + analysis.Member = analysis.Member + [new_material_object] + + fcc_print('Checking FEM Flow1D inlet constraint...') + Flow1d_inlet = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_inlet) + Flow1d_inlet.SectionType = 'Liquid' + Flow1d_inlet.LiquidSectionType = 'PIPE INLET' + Flow1d_inlet.InletPressure = 0.1 + Flow1d_inlet.References = [(line, "Edge1")] + self.assertTrue(Flow1d_inlet, "FemTest of new Flow1D inlet constraint failed") + analysis.Member = analysis.Member + [Flow1d_inlet] + + fcc_print('Checking FEM new Flow1D entrance constraint...') + Flow1d_entrance = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_entrance) + Flow1d_entrance.SectionType = 'Liquid' + Flow1d_entrance.LiquidSectionType = 'PIPE ENTRANCE' + Flow1d_entrance.EntrancePipeArea = 31416.00 + Flow1d_entrance.EntranceArea = 25133.00 + Flow1d_entrance.References = [(line, "Edge2")] + self.assertTrue(Flow1d_entrance, "FemTest of new Flow1D entrance constraint failed") + analysis.Member = analysis.Member + [Flow1d_entrance] + + fcc_print('Checking FEM new Flow1D manning constraint...') + Flow1d_manning = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_manning) + Flow1d_manning.SectionType = 'Liquid' + Flow1d_manning.LiquidSectionType = 'PIPE MANNING' + Flow1d_manning.ManningArea = 31416 + Flow1d_manning.ManningRadius = 50 + Flow1d_manning.ManningCoefficient = 0.002 + Flow1d_manning.References = [(line, "Edge3"), (line, "Edge5")] + self.assertTrue(Flow1d_manning, "FemTest of new Flow1D manning constraint failed") + analysis.Member = analysis.Member + [Flow1d_manning] + + fcc_print('Checking FEM new Flow1D bend constraint...') + Flow1d_bend = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_bend) + Flow1d_bend.SectionType = 'Liquid' + Flow1d_bend.LiquidSectionType = 'PIPE BEND' + Flow1d_bend.BendPipeArea = 31416 + Flow1d_bend.BendRadiusDiameter = 1.5 + Flow1d_bend.BendAngle = 45 + Flow1d_bend.BendLossCoefficient = 0.4 + Flow1d_bend.References = [(line, "Edge4")] + self.assertTrue(Flow1d_bend, "FemTest of new Flow1D bend constraint failed") + analysis.Member = analysis.Member + [Flow1d_bend] + + fcc_print('Checking FEM new Flow1D enlargement constraint...') + Flow1d_enlargement = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_enlargement) + Flow1d_enlargement.SectionType = 'Liquid' + Flow1d_enlargement.LiquidSectionType = 'PIPE ENLARGEMENT' + Flow1d_enlargement.EnlargeArea1 = 31416.00 + Flow1d_enlargement.EnlargeArea2 = 70686.00 + Flow1d_enlargement.References = [(line, "Edge6")] + self.assertTrue(Flow1d_enlargement, "FemTest of new Flow1D enlargement constraint failed") + analysis.Member = analysis.Member + [Flow1d_enlargement] + + fcc_print('Checking FEM new Flow1D manning constraint...') + Flow1d_manning1 = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_manning1) + Flow1d_manning1.SectionType = 'Liquid' + Flow1d_manning1.LiquidSectionType = 'PIPE MANNING' + Flow1d_manning1.ManningArea = 70686.00 + Flow1d_manning1.ManningRadius = 75 + Flow1d_manning1.ManningCoefficient = 0.002 + Flow1d_manning1.References = [(line, "Edge7")] + self.assertTrue(Flow1d_manning1, "FemTest of new Flow1D manning constraint failed") + analysis.Member = analysis.Member + [Flow1d_manning1] + + fcc_print('Checking FEM new Flow1D contraction constraint...') + Flow1d_contraction = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_contraction) + Flow1d_contraction.SectionType = 'Liquid' + Flow1d_contraction.LiquidSectionType = 'PIPE CONTRACTION' + Flow1d_contraction.ContractArea1 = 70686 + Flow1d_contraction.ContractArea2 = 17671 + Flow1d_contraction.References = [(line, "Edge8")] + self.assertTrue(Flow1d_contraction, "FemTest of new Flow1D contraction constraint failed") + analysis.Member = analysis.Member + [Flow1d_contraction] + + fcc_print('Checking FEM new Flow1D manning constraint...') + Flow1d_manning2 = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_manning2) + Flow1d_manning2.SectionType = 'Liquid' + Flow1d_manning2.LiquidSectionType = 'PIPE MANNING' + Flow1d_manning2.ManningArea = 17671.00 + Flow1d_manning2.ManningRadius = 37.5 + Flow1d_manning2.ManningCoefficient = 0.002 + Flow1d_manning2.References = [(line, "Edge11"), (line, "Edge9")] + self.assertTrue(Flow1d_manning2, "FemTest of new Flow1D manning constraint failed") + analysis.Member = analysis.Member + [Flow1d_manning2] + + fcc_print('Checking FEM new Flow1D gate valve constraint...') + Flow1d_gate_valve = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_gate_valve) + Flow1d_gate_valve.SectionType = 'Liquid' + Flow1d_gate_valve.LiquidSectionType = 'PIPE GATE VALVE' + Flow1d_gate_valve.GateValvePipeArea = 17671 + Flow1d_gate_valve.GateValveClosingCoeff = 0.5 + Flow1d_gate_valve.References = [(line, "Edge10")] + self.assertTrue(Flow1d_gate_valve, "FemTest of new Flow1D gate valve constraint failed") + analysis.Member = analysis.Member + [Flow1d_gate_valve] + + fcc_print('Checking FEM new Flow1D enlargement constraint...') + Flow1d_enlargement1 = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_enlargement1) + Flow1d_enlargement1.SectionType = 'Liquid' + Flow1d_enlargement1.LiquidSectionType = 'PIPE ENLARGEMENT' + Flow1d_enlargement1.EnlargeArea1 = 17671 + Flow1d_enlargement1.EnlargeArea2 = 1000000000000 + Flow1d_enlargement1.References = [(line, "Edge12")] + self.assertTrue(Flow1d_enlargement1, "FemTest of new Flow1D enlargement constraint failed") + analysis.Member = analysis.Member + [Flow1d_enlargement1] + + fcc_print('Checking FEM Flow1D outlet constraint...') + Flow1d_outlet = self.active_doc.addObject("Fem::FeaturePython", "ElementFluid1D") + import PyObjects._FemElementFluid1D + PyObjects._FemElementFluid1D._FemElementFluid1D(Flow1d_outlet) + Flow1d_outlet.SectionType = 'Liquid' + Flow1d_outlet.LiquidSectionType = 'PIPE OUTLET' + Flow1d_outlet.OutletPressure = 0.1 + Flow1d_outlet.References = [(line, "Edge13")] + self.assertTrue(Flow1d_outlet, "FemTest of new Flow1D inlet constraint failed") + analysis.Member = analysis.Member + [Flow1d_outlet] + + fcc_print('Checking FEM self weight constraint...') + Flow1d_self_weight = self.active_doc.addObject("Fem::FeaturePython", "ConstraintSelfWeight") + import PyObjects._FemConstraintSelfWeight + PyObjects._FemConstraintSelfWeight._FemConstraintSelfWeight(Flow1d_self_weight) + Flow1d_self_weight.Gravity_x = 0.0 + Flow1d_self_weight.Gravity_y = 0.0 + Flow1d_self_weight.Gravity_z = -1.0 + self.assertTrue(Flow1d_outlet, "FemTest of new Flow1D self weight constraint failed") + analysis.Member = analysis.Member + [Flow1d_self_weight] + + fcc_print('Checking FEM new mesh...') + from test_files.ccx.Flow1D_mesh import create_nodes_Flow1D, create_elements_Flow1D + mesh = Fem.FemMesh() + ret = create_nodes_Flow1D(mesh) + self.assertTrue(ret, "Import of mesh nodes failed") + ret = create_elements_Flow1D(mesh) + self.assertTrue(ret, "Import of mesh volumes failed") + mesh_object = self.active_doc.addObject('Fem::FemMeshObject', mesh_name) + mesh_object.FemMesh = mesh + self.assertTrue(mesh, "FemTest of new mesh failed") + analysis.Member = analysis.Member + [mesh_object] + + self.active_doc.recompute() + + fea = FemToolsCcx.FemToolsCcx(analysis, test_mode=True) + fcc_print('Setting up working directory {}'.format(Flow1D_thermomech_analysis_dir)) + fea.setup_working_dir(Flow1D_thermomech_analysis_dir) + self.assertTrue(True if fea.working_dir == Flow1D_thermomech_analysis_dir else False, + "Setting working directory {} failed".format(Flow1D_thermomech_analysis_dir)) + + fcc_print('Setting analysis type to \'thermomech\"') + fea.set_analysis_type("thermomech") + self.assertTrue(True if fea.analysis_type == 'thermomech' else False, "Setting anlysis type to \'thermomech\' failed") + + fcc_print('Checking FEM inp file prerequisites for thermo-mechanical analysis...') + error = fea.check_prerequisites() + self.assertFalse(error, "FemToolsCcx check_prerequisites returned error message: {}".format(error)) + + fcc_print('Checking FEM inp file write...') + + fcc_print('Writing {}/{}.inp for thermomech analysis'.format(Flow1D_thermomech_analysis_dir, mesh_name)) + error = fea.write_inp_file() + self.assertFalse(error, "Writing failed") + + fcc_print('Comparing {} to {}/{}.inp'.format(Flow1D_thermomech_analysis_inp_file, Flow1D_thermomech_analysis_dir, mesh_name)) + ret = compare_inp_files(Flow1D_thermomech_analysis_inp_file, Flow1D_thermomech_analysis_dir + "/" + mesh_name + '.inp') + self.assertFalse(ret, "FemToolsCcx write_inp_file test failed.\n{}".format(ret)) + + fcc_print('Setting up working directory to {} in order to read simulated calculations'.format(test_file_dir)) + fea.setup_working_dir(test_file_dir) + self.assertTrue(True if fea.working_dir == test_file_dir else False, + "Setting working directory {} failed".format(test_file_dir)) + + fcc_print('Setting base name to read test {}.frd file...'.format('Flow1D_thermomech')) + fea.set_base_name(Flow1D_thermomech_base_name) + self.assertTrue(True if fea.base_name == Flow1D_thermomech_base_name else False, + "Setting base name to {} failed".format(Flow1D_thermomech_base_name)) + + fcc_print('Setting inp file name to read test {}.frd file...'.format('Flow1D_thermomech')) + fea.set_inp_file_name() + self.assertTrue(True if fea.inp_file_name == Flow1D_thermomech_analysis_inp_file else False, + "Setting inp file name to {} failed".format(Flow1D_thermomech_analysis_inp_file)) + + fcc_print('Checking FEM frd file read from thermomech analysis...') + fea.load_results() + self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name)) + + fcc_print('Reading stats from result object for thermomech analysis...') + ret = compare_stats(fea, Flow1D_thermomech_expected_values) + self.assertFalse(ret, "Invalid results read from .frd file") + + fcc_print('Save FreeCAD file for thermomech analysis to {}...'.format(Flow1D_thermomech_save_fc_file)) + self.active_doc.saveAs(Flow1D_thermomech_save_fc_file) + + fcc_print('--------------- End of FEM tests FLow 1D thermomech analysis ---------------') + def tearDown(self): FreeCAD.closeDocument("FemTest") pass diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_mesh.py b/src/Mod/Fem/test_files/ccx/Flow1D_mesh.py new file mode 100644 index 0000000000..1b2d858499 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_mesh.py @@ -0,0 +1,49 @@ +def create_nodes_Flow1D(femmesh): + # nodes + femmesh.addNode(0, 1.11022302462516e-14, 50, 1) + femmesh.addNode(0, -1.11022302462516e-14, -50, 2) + femmesh.addNode(0, -9.54791801177633e-13, -4300, 3) + femmesh.addNode(4950, -9.54791801177633e-13, -4300, 4) + femmesh.addNode(5000, -9.54791801177633e-13, -4300, 5) + femmesh.addNode(8535.53, -1.73983716322823e-12, -7835.53, 6) + femmesh.addNode(8569.88, -1.74768644001233e-12, -7870.88, 7) + femmesh.addNode(12105.41, -2.53273180206292e-12, -11406.41, 8) + femmesh.addNode(12140.76, -2.54058107884702e-12, -11441.76, 9) + femmesh.addNode(13908.53, -2.93310487009534e-12, -13209.53, 10) + femmesh.addNode(13943.88, -2.94095414687944e-12, -13244.88, 11) + femmesh.addNode(15046.97, -3.1858893301262e-12, -14347.97, 12) + femmesh.addNode(15046.97, -1.764803858606e-12, -7947.97, 13) + femmesh.addNode(15046.97, -1.742599398113e-12, -7847.97, 14) + femmesh.addNode(0, 0, 0, 15) + femmesh.addNode(0, -4.82947015711942e-13, -2175, 16) + femmesh.addNode(2475, -9.54791801177633e-13, -4300, 17) + femmesh.addNode(4975, -9.54791801177633e-13, -4300, 18) + femmesh.addNode(6767.765, -1.34731448220293e-12, -6067.765, 19) + femmesh.addNode(8552.705, -1.74376180162028e-12, -7853.205, 20) + femmesh.addNode(10337.645, -2.14020912103763e-12, -9638.645, 21) + femmesh.addNode(12123.085, -2.53665644045497e-12, -11424.085, 22) + femmesh.addNode(13024.645, -2.73684297447118e-12, -12325.645, 23) + femmesh.addNode(13926.205, -2.93702950848739e-12, -13227.205, 24) + femmesh.addNode(14495.425, -3.06342173850282e-12, -13796.425, 25) + femmesh.addNode(15046.97, -2.4753465943661e-12, -11147.97, 26) + femmesh.addNode(15046.97, -1.75370162835975e-12, -7897.97, 27) + femmesh.addNode(15046.97, -1.75370162835975e-12, -7897.97, 28) + return True + + +def create_elements_Flow1D(femmesh): + # elements + femmesh.addEdge([1L, 2L, 15L], 1) + femmesh.addEdge([2L, 3L, 16L], 2) + femmesh.addEdge([3L, 4L, 17L], 3) + femmesh.addEdge([4L, 5L, 18L], 4) + femmesh.addEdge([5L, 6L, 19L], 5) + femmesh.addEdge([6L, 7L, 20L], 6) + femmesh.addEdge([7L, 8L, 21L], 7) + femmesh.addEdge([8L, 9L, 22L], 8) + femmesh.addEdge([9L, 10L, 23L], 9) + femmesh.addEdge([10L, 11L, 24L], 10) + femmesh.addEdge([11L, 12L, 25L], 11) + femmesh.addEdge([12L, 13L, 26L], 12) + femmesh.addEdge([13L, 28L, 27L], 13) + return True diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_points.csv b/src/Mod/Fem/test_files/ccx/Flow1D_points.csv new file mode 100644 index 0000000000..b943838670 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_points.csv @@ -0,0 +1,27 @@ +1,0,1.11E-14,50 +2,0,-1.11E-14,-50 +3,0,-9.55E-13,-4300 +4,4950,-9.54792E-13,-4300 +5,5000,-9.54792E-13,-4300 +6,8535.53,-1.73984E-12,-7835.53 +7,8569.88,-1.75E-12,-7870.88 +8,12105.41,-2.53273E-12,-11406.41 +9,12140.76,-2.54058E-12,-11441.76 +10,13908.53,-2.9331E-12,-13209.53 +11,13943.88,-2.94095E-12,-13244.88 +12,15046.97,-3.18589E-12,-14347.97 +13,15046.97,-1.7648E-12,-7947.97 +14,15046.97,-1.74E-12,-7847.97 +15,0,0,0 +16,0,-4.82947E-13,-2175 +17,2475,-9.54792E-13,-4300 +18,4975,-9.54792E-13,-4300 +19,6767.765,-1.34731E-12,-6067.765 +20,8552.705,-1.74376E-12,-7853.205 +21,10337.645,-2.14021E-12,-9638.645 +22,12123.085,-2.53666E-12,-11424.085 +23,13024.645,-2.73684E-12,-12325.645 +24,13926.205,-2.93703E-12,-13227.205 +25,14495.425,-3.06342E-12,-13796.425 +26,15046.97,-2.47535E-12,-11147.97 +27,15046.97,-1.75E-12,-7897.97 diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.dat b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.fcstd b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.fcstd new file mode 100644 index 0000000000000000000000000000000000000000..94483713a22f7e5d1c01179b4ce3f27af8cc26fb GIT binary patch literal 19521 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 literal 0 HcmV?d00001 diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.frd b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.frd new file mode 100644 index 0000000000..a4de2731b1 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.frd @@ -0,0 +1,125 @@ + 1C + 1UUSER + 1UDATE 09.june.2017 + 1UTIME 11:49:27 + 1UHOST + 1UPGM CalculiX + 1UDIR + 1UDBN + 1UMAT 1FLUIDMATERIAL + 2C 25 1 + -1 2 0.00000E+00-1.11022E-14-5.00000E+01 + -1 3 0.00000E+00-9.54792E-13-4.30000E+03 + -1 4 4.95000E+03-9.54792E-13-4.30000E+03 + -1 5 5.00000E+03-9.54792E-13-4.30000E+03 + -1 6 8.53553E+03-1.73984E-12-7.83553E+03 + -1 7 8.56988E+03-1.74769E-12-7.87088E+03 + -1 8 1.21054E+04-2.53273E-12-1.14064E+04 + -1 9 1.21408E+04-2.54058E-12-1.14418E+04 + -1 10 1.39085E+04-2.93310E-12-1.32095E+04 + -1 11 1.39439E+04-2.94095E-12-1.32449E+04 + -1 12 1.50470E+04-3.18589E-12-1.43480E+04 + -1 13 1.50470E+04-1.76480E-12-7.94797E+03 + -1 15 0.00000E+00 0.00000E+00 0.00000E+00 + -1 16 0.00000E+00-4.82947E-13-2.17500E+03 + -1 17 2.47500E+03-9.54792E-13-4.30000E+03 + -1 18 4.97500E+03-9.54792E-13-4.30000E+03 + -1 19 6.76777E+03-1.34731E-12-6.06777E+03 + -1 20 8.55271E+03-1.74376E-12-7.85321E+03 + -1 21 1.03376E+04-2.14021E-12-9.63864E+03 + -1 22 1.21231E+04-2.53666E-12-1.14241E+04 + -1 23 1.30246E+04-2.73684E-12-1.23256E+04 + -1 24 1.39262E+04-2.93703E-12-1.32272E+04 + -1 25 1.44954E+04-3.06342E-12-1.37964E+04 + -1 26 1.50470E+04-2.47535E-12-1.11480E+04 + -1 27 1.50470E+04-1.75370E-12-7.89797E+03 + -3 + 3C 13 1 + -1 1 11 0 1 + -2 15 2 + -1 2 12 0 1 + -2 2 3 16 + -1 3 12 0 1 + -2 3 4 17 + -1 4 12 0 1 + -2 4 5 18 + -1 5 12 0 1 + -2 5 6 19 + -1 6 12 0 1 + -2 6 7 20 + -1 7 12 0 1 + -2 7 8 21 + -1 8 12 0 1 + -2 8 9 22 + -1 9 12 0 1 + -2 9 10 23 + -1 10 12 0 1 + -2 10 11 24 + -1 11 12 0 1 + -2 11 12 25 + -1 12 12 0 1 + -2 12 13 26 + -1 13 11 0 1 + -2 13 27 + -3 + 1PSTEP 1 1 1 + 100CL 101 1.000000000 25 0 1 1 + -4 MAFLOW 1 1 + -5 MF 1 1 0 0 + -1 2 7.83805E-02 + -1 3 7.83805E-02 + -1 4 7.83805E-02 + -1 5 7.83805E-02 + -1 6 7.83805E-02 + -1 7 7.83805E-02 + -1 8 7.83805E-02 + -1 9 7.83805E-02 + -1 10 7.83805E-02 + -1 11 7.83805E-02 + -1 12 7.83805E-02 + -1 13 7.83805E-02 + -1 15 7.83805E-02 + -1 16 7.83805E-02 + -1 17 7.83805E-02 + -1 18 7.83805E-02 + -1 19 7.83805E-02 + -1 20 7.83805E-02 + -1 21 7.83805E-02 + -1 22 7.83805E-02 + -1 23 7.83805E-02 + -1 24 7.83805E-02 + -1 25 7.83805E-02 + -1 26 7.83805E-02 + -1 27 7.83805E-02 + -3 + 1PSTEP 2 1 1 + 100CL 101 1.000000000 25 0 1 1 + -4 STPRES 1 1 + -5 PS 1 1 0 0 + -1 2 1.00000E-01 + -1 3 1.34842E-01 + -1 4 1.28265E-01 + -1 5 1.27953E-01 + -1 6 1.55924E-01 + -1 7 1.57802E-01 + -1 8 1.91652E-01 + -1 9 1.78963E-01 + -1 10 1.80863E-01 + -1 11 1.61473E-01 + -1 12 1.62658E-01 + -1 13 1.00000E-01 + -1 15 1.00000E-01 + -1 16 1.17421E-01 + -1 17 1.31553E-01 + -1 18 1.28109E-01 + -1 19 1.41939E-01 + -1 20 1.56863E-01 + -1 21 1.74727E-01 + -1 22 1.85308E-01 + -1 23 1.79913E-01 + -1 24 1.71168E-01 + -1 25 1.62066E-01 + -1 26 1.31329E-01 + -1 27 1.00000E-01 + -3 + 9999 diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.inp b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.inp new file mode 100644 index 0000000000..2d2881cd54 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech.inp @@ -0,0 +1,185 @@ +** written by FreeCAD inp file writer for CalculiX,Abaqus meshes + +** Nodes +*Node, NSET=Nall +1, 0, 1.110223024625e-14, 50 +2, 0, -1.110223024625e-14, -50 +3, 0, -9.547918011776e-13, -4300 +4, 4950, -9.547918011776e-13, -4300 +5, 5000, -9.547918011776e-13, -4300 +6, 8535.53, -1.739837163228e-12, -7835.53 +7, 8569.88, -1.747686440012e-12, -7870.88 +8, 12105.41, -2.532731802063e-12, -11406.41 +9, 12140.76, -2.540581078847e-12, -11441.76 +10, 13908.53, -2.933104870095e-12, -13209.53 +11, 13943.88, -2.940954146879e-12, -13244.88 +12, 15046.97, -3.185889330126e-12, -14347.97 +13, 15046.97, -1.764803858606e-12, -7947.97 +14, 15046.97, -1.742599398113e-12, -7847.97 +15, 0, 0, 0 +16, 0, -4.829470157119e-13, -2175 +17, 2475, -9.547918011776e-13, -4300 +18, 4975, -9.547918011776e-13, -4300 +19, 6767.765, -1.347314482203e-12, -6067.765 +20, 8552.705, -1.74376180162e-12, -7853.205 +21, 10337.645, -2.140209121038e-12, -9638.645 +22, 12123.085, -2.536656440455e-12, -11424.085 +23, 13024.645, -2.736842974471e-12, -12325.645 +24, 13926.205, -2.937029508487e-12, -13227.205 +25, 14495.425, -3.063421738503e-12, -13796.425 +26, 15046.97, -2.475346594366e-12, -11147.97 +27, 15046.97, -1.75370162836e-12, -7897.97 +28, 15046.97, -1.75370162836e-12, -7897.97 + + +** Edge elements +*Element, TYPE=D, ELSET=Eedges +1, 0, 15, 2 +2, 2, 16, 3 +3, 3, 17, 4 +4, 4, 18, 5 +5, 5, 19, 6 +6, 6, 20, 7 +7, 7, 21, 8 +8, 8, 22, 9 +9, 9, 23, 10 +10, 10, 24, 11 +11, 11, 25, 12 +12, 12, 26, 13 +13, 13, 27, 0 + +** Define element set Eall +*ELSET, ELSET=Eall +Eedges + + + +*********************************************************** +** Element sets for materials and FEM element type (solid, shell, beam, fluid) +** written by write_element_sets_material_and_femelement_type function +*ELSET,ELSET=Mat0Fluid0 +1, +*ELSET,ELSET=Mat0Fluid1 +2, +*ELSET,ELSET=Mat0Fluid2 +3, +5, +*ELSET,ELSET=Mat0Fluid3 +4, +*ELSET,ELSET=Mat0Fluid4 +6, +*ELSET,ELSET=Mat0Fluid5 +7, +*ELSET,ELSET=Mat0Fluid6 +8, +*ELSET,ELSET=Mat0Fluid7 +9, +11, +*ELSET,ELSET=Mat0Fluid8 +10, +*ELSET,ELSET=Mat0Fluid9 +12, +*ELSET,ELSET=Mat0Fluid10 +13, + +*********************************************************** +** Materials +** written by write_materials function +** Young's modulus unit is MPa = N/mm2 +** Density's unit is t/mm^3 +** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3 +** Specific Heat unit is kJ/t/K = mm^2/s^2/K +** FreeCAD material name: Water +** FluidMaterial +*MATERIAL, NAME=FluidMaterial +*DENSITY +9.980e-10 +*FLUID CONSTANTS +4.182e+06, 1.003e-09 + +*********************************************************** +** Sections +** written by write_femelementsets function +*FLUID SECTION, ELSET=Mat0Fluid0, TYPE=PIPE INOUT, MATERIAL=FluidMaterial +*FLUID SECTION, ELSET=Mat0Fluid1, TYPE=PIPE ENTRANCE, MATERIAL=FluidMaterial +31416.0,25133.0 +*FLUID SECTION, ELSET=Mat0Fluid2, TYPE=PIPE MANNING, MATERIAL=FluidMaterial +31416.0,50 ,0.002 +*FLUID SECTION, ELSET=Mat0Fluid3, TYPE=PIPE BEND, MATERIAL=FluidMaterial +31416.0,1.5,45.0,0.4 +*FLUID SECTION, ELSET=Mat0Fluid4, TYPE=PIPE ENLARGEMENT, MATERIAL=FluidMaterial +31416.0,70686.0 +*FLUID SECTION, ELSET=Mat0Fluid5, TYPE=PIPE MANNING, MATERIAL=FluidMaterial +70686.0,75 ,0.002 +*FLUID SECTION, ELSET=Mat0Fluid6, TYPE=PIPE CONTRACTION, MATERIAL=FluidMaterial +70686.0,17671.0 +*FLUID SECTION, ELSET=Mat0Fluid7, TYPE=PIPE MANNING, MATERIAL=FluidMaterial +17671.0,37.5 ,0.002 +*FLUID SECTION, ELSET=Mat0Fluid8, TYPE=PIPE GATE VALVE, MATERIAL=FluidMaterial +17671.0,0.5 +*FLUID SECTION, ELSET=Mat0Fluid9, TYPE=PIPE ENLARGEMENT, MATERIAL=FluidMaterial +17671.0,1e+12 +*FLUID SECTION, ELSET=Mat0Fluid10, TYPE=PIPE INOUT, MATERIAL=FluidMaterial + +*********************************************************** +** At least one step is needed to run an CalculiX analysis of FreeCAD +** written by write_step_begin function +*STEP, INC=2000 +*COUPLED TEMPERATURE-DISPLACEMENT, STEADY STATE +1.0,1.0 + +*********************************************************** +** Self weight Constraint +** written by write_constraints_selfweight function +** ConstraintSelfWeight +*DLOAD +Eall,GRAV,9810,0.0,0.0,-1.0 + + +*********************************************************** +** FluidSection constraints +** written by write_constraints_fluidsection function +** ElementFluid1D +**Fluid Section Inlet +*BOUNDARY +2,2,2,0.1 +** ElementFluid1D001 +** ElementFluid1D002 +** ElementFluid1D003 +** ElementFluid1D004 +** ElementFluid1D005 +** ElementFluid1D006 +** ElementFluid1D007 +** ElementFluid1D008 +** ElementFluid1D009 +** ElementFluid1D010 +**Fluid Section Outlet +*BOUNDARY +13,2,2,0.1 + +*********************************************************** +** Outputs --> frd file +** written by write_outputs_types function +*NODE FILE, OUTPUT=2d +MF, PS + +*********************************************************** +** written by write_step_end function +*END STEP + +*********************************************************** +** CalculiX Input file +** written by write_footer function +** written by --> FreeCAD 0.17.11265 (Git) +** written on --> Fri Jun 9 11:49:27 2017 +** file name --> Resevoir_rev1.fcstd +** analysis name --> Analysis +** +** +** +** Units +** +** Geometry (mesh data) --> mm +** Materials (Young's modulus) --> N/mm2 = MPa +** Loads (nodal loads) --> N +** diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_thermomech_expected_values b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech_expected_values new file mode 100644 index 0000000000..bbf2429a84 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_thermomech_expected_values @@ -0,0 +1,5 @@ +U1: (0.0, 0.0, 0.0) +U2: (0.0, 0.0, 0.0) +U3: (0.0, 0.0, 0.0) +Uabs: (0.0, 0.0, 0.0) +Sabs: (0.0, 0.0, 0.0) diff --git a/src/Mod/Fem/test_files/ccx/Flow1D_volumes.csv b/src/Mod/Fem/test_files/ccx/Flow1D_volumes.csv new file mode 100644 index 0000000000..76360a7bf8 --- /dev/null +++ b/src/Mod/Fem/test_files/ccx/Flow1D_volumes.csv @@ -0,0 +1,13 @@ +1,0,15,2 +2,2,16,3 +3,3,17,4 +4,4,18,5 +5,5,19,6 +6,6,20,7 +7,7,21,8 +8,8,22,9 +9,9,23,10 +10,10,24,11 +11,11,25,12 +12,12,26,13 +13,13,27,0