diff --git a/applications/ConvectionDiffusionApplication/custom_elements/eulerian_conv_diff.cpp b/applications/ConvectionDiffusionApplication/custom_elements/eulerian_conv_diff.cpp index e4cb5b7a0a7b..212a7734f497 100644 --- a/applications/ConvectionDiffusionApplication/custom_elements/eulerian_conv_diff.cpp +++ b/applications/ConvectionDiffusionApplication/custom_elements/eulerian_conv_diff.cpp @@ -112,6 +112,7 @@ namespace Kratos } } + //Some auxilary definitions BoundedMatrix aux1 = ZeroMatrix(TNumNodes, TNumNodes); //terms multiplying dphi/dt BoundedMatrix aux2 = ZeroMatrix(TNumNodes, TNumNodes); //terms multiplying phi @@ -129,20 +130,21 @@ namespace Kratos for(unsigned int k=0; k a_dot_grad = prod(DN_DX, vel_gauss); const double tau = this->CalculateTau(Variables,norm_vel,h); //terms multiplying dphi/dt (aux1) - noalias(aux1) += (1.0+tau*Variables.beta*Variables.div_v)*outer_prod(N, N); + noalias(aux1) += (1.0+tau*Variables.beta*Variables.div_v)* 0.25 * IdentityMatrix(4, 4); //outer_prod(N, N); //0.25 * IdentityMatrix(4, 4); noalias(aux1) += tau*outer_prod(a_dot_grad, N); //terms which multiply the gradient of phi noalias(aux2) += (1.0+tau*Variables.beta*Variables.div_v)*outer_prod(N, a_dot_grad); noalias(aux2) += tau*outer_prod(a_dot_grad, a_dot_grad); - } + } //adding the second and third term in the formulation noalias(rLeftHandSideMatrix) = (Variables.dt_inv*Variables.density*Variables.specific_heat + Variables.theta*Variables.beta*Variables.div_v)*aux1; noalias(rRightHandSideVector) = (Variables.dt_inv*Variables.density*Variables.specific_heat - (1.0-Variables.theta)*Variables.beta*Variables.div_v)*prod(aux1,Variables.phi_old); @@ -261,6 +263,9 @@ namespace Kratos rVariables.v[i] = GetGeometry()[i].FastGetSolutionStepValue(rVelocityVar); rVariables.vold[i] = GetGeometry()[i].FastGetSolutionStepValue(rVelocityVar,1); //active_convection=true; + + + } if (IsDefinedMeshVelocityVariable) @@ -268,6 +273,7 @@ namespace Kratos const Variable >& rMeshVelocityVar = my_settings->GetMeshVelocityVariable(); rVariables.v[i] -= GetGeometry()[i].FastGetSolutionStepValue(rMeshVelocityVar); rVariables.vold[i] -= GetGeometry()[i].FastGetSolutionStepValue(rMeshVelocityVar,1); + //active_convection=true; } diff --git a/applications/FluidDynamicsApplication/custom_elements/vms.h b/applications/FluidDynamicsApplication/custom_elements/vms.h index 61c358992c55..2344d5a72fd6 100644 --- a/applications/FluidDynamicsApplication/custom_elements/vms.h +++ b/applications/FluidDynamicsApplication/custom_elements/vms.h @@ -100,7 +100,7 @@ namespace Kratos */ template< unsigned int TDim, unsigned int TNumNodes = TDim + 1 > -class VMS : public Element +class KRATOS_API(FLUID_DYNAMICS_APPLICATION) VMS : public Element { public: ///@name Type Definitions diff --git a/applications/FluidDynamicsApplication/custom_strategies/schemes/residualbased_predictorcorrector_velocity_bossak_scheme_turbulent.h b/applications/FluidDynamicsApplication/custom_strategies/schemes/residualbased_predictorcorrector_velocity_bossak_scheme_turbulent.h index 006b6645f79f..27f2633dde93 100644 --- a/applications/FluidDynamicsApplication/custom_strategies/schemes/residualbased_predictorcorrector_velocity_bossak_scheme_turbulent.h +++ b/applications/FluidDynamicsApplication/custom_strategies/schemes/residualbased_predictorcorrector_velocity_bossak_scheme_turbulent.h @@ -329,7 +329,7 @@ namespace Kratos { array_1d & OldVelocity = (itNode)->FastGetSolutionStepValue(VELOCITY, 1); noalias(itNode->FastGetSolutionStepValue(MESH_VELOCITY)) = itNode->FastGetSolutionStepValue(VELOCITY); - UpdateDisplacement(CurrentDisplacement, OldDisplacement, OldVelocity, OldAcceleration, CurrentAcceleration); + //UpdateDisplacement(CurrentDisplacement, OldDisplacement, OldVelocity, OldAcceleration, CurrentAcceleration); } else { @@ -407,7 +407,7 @@ namespace Kratos { if((itNode)->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) < 1e-15) { noalias(itNode->FastGetSolutionStepValue(MESH_VELOCITY)) = itNode->FastGetSolutionStepValue(VELOCITY); - UpdateDisplacement(CurrentDisplacement, OldDisplacement, OldVelocity, OldAcceleration, CurrentAcceleration); + //UpdateDisplacement(CurrentDisplacement, OldDisplacement, OldVelocity, OldAcceleration, CurrentAcceleration); } else { diff --git a/applications/MeshingApplication/CMakeLists.txt b/applications/MeshingApplication/CMakeLists.txt index a5033ebc8edb..383c88b58c54 100644 --- a/applications/MeshingApplication/CMakeLists.txt +++ b/applications/MeshingApplication/CMakeLists.txt @@ -18,6 +18,7 @@ if(${USE_TETGEN_NONFREE_TPL} MATCHES ON) include_directories(${TETGEN_INCLUDE}) add_library(tetgen STATIC ${TETGEN_INCLUDE}/tetgen.cxx ${TETGEN_INCLUDE}/predicates.cxx) target_compile_definitions(tetgen PRIVATE -DTETLIBRARY) + add_definitions(-DUSE_TETGEN_NONFREE_TPL) endif(${USE_TETGEN_NONFREE_TPL} MATCHES ON) ## generate variables with the sources diff --git a/applications/MeshingApplication/custom_python/add_meshers_to_python.cpp b/applications/MeshingApplication/custom_python/add_meshers_to_python.cpp index d6cb717fb9ca..11774ec709da 100644 --- a/applications/MeshingApplication/custom_python/add_meshers_to_python.cpp +++ b/applications/MeshingApplication/custom_python/add_meshers_to_python.cpp @@ -28,7 +28,7 @@ #include "external_includes/tetgen_cdt.h" #else #define REAL double -#endif +#endif #if USE_TRIANGLE_NONFREE_TPL #include "external_includes/trigen_pfem_refine.h" @@ -37,7 +37,7 @@ #include "external_includes/trigen_glass_forming.h" #include "external_includes/trigen_droplet_refine.h" #include "external_includes/trigen_cdt.h" -#endif +#endif namespace Kratos { @@ -200,9 +200,11 @@ void TriRegenerateMeshVMS(TriGenPFEMModelerVMS& Mesher, char* ElementName, char* void AddMeshersToPython(pybind11::module& m) { - + +#pragma message "A ****************************************************************************************" #ifdef USE_TETGEN_NONFREE_TPL // Class that allows 3D adaptive remeshing (inserting and erasing nodes) + #pragma message "B ****************************************************************************************" py::class_(m, "TetGenPfemModeler") .def(py::init< >()) .def("ReGenerateMesh",TetRegenerateMesh) @@ -218,7 +220,7 @@ void AddMeshersToPython(pybind11::module& m) .def(py::init< >()) .def("ReGenerateMesh",TetRegenerateMeshContact) ; - + py::class_(m, "TetGenCDT") .def(py::init< >()) .def("GenerateCDT",GenerateCDT) @@ -229,7 +231,7 @@ void AddMeshersToPython(pybind11::module& m) .def("ReGenerateMesh",&TetGenPfemModelerVms::ReGenerateMesh) ; #endif - + #if USE_TRIANGLE_NONFREE_TPL // Class that allows 2D adaptive remeshing (inserting and erasing nodes) py::class_(m, "TriGenPFEMModeler") diff --git a/applications/MeshingApplication/external_includes/tetgen_pfem_refine.h b/applications/MeshingApplication/external_includes/tetgen_pfem_refine.h index 1d6823af188b..b4387bbecf9c 100644 --- a/applications/MeshingApplication/external_includes/tetgen_pfem_refine.h +++ b/applications/MeshingApplication/external_includes/tetgen_pfem_refine.h @@ -156,7 +156,7 @@ namespace Kratos PointVector res(max_results); DistanceVector res_distances(max_results); Node<3> work_point(0,0.0,0.0,0.0); - KRATOS_WATCH(h_factor) + //KRATOS_WATCH(h_factor) //if the remove_node switch is activated, we check if the nodes got too close if (rem_nodes==true) { @@ -238,7 +238,7 @@ namespace Kratos double first_part_time = auxiliary.elapsed(); - std::cout << "mesh generation time = " << first_part_time << std::endl; + //std::cout << "mesh generation time = " << first_part_time << std::endl; //generate Kratos Tetrahedra3D4 int el_number = out.numberoftetrahedra; @@ -406,7 +406,7 @@ namespace Kratos } } - std::cout << "time for passing alpha shape" << alpha_shape_time.elapsed() << std::endl; + //std::cout << "time for passing alpha shape" << alpha_shape_time.elapsed() << std::endl; //freeing unnecessary memory in.deinitialize(); @@ -426,7 +426,7 @@ namespace Kratos in2.pointlist[base+1] = (nodes_begin + i)->Y(); in2.pointlist[base+2] = (nodes_begin + i)->Z(); } - std::cout << "qui" << std::endl; + //std::cout << "qui" << std::endl; in2.numberoftetrahedra = number_of_preserved_elems; in2.tetrahedronlist = new int[in2.numberoftetrahedra * 4]; in2.tetrahedronvolumelist = new double[in2.numberoftetrahedra]; @@ -516,7 +516,7 @@ namespace Kratos //q - creates quality mesh, with the default radius-edge ratio set to 2.0 - std::cout << "mesh recreation time" << mesh_recreation_time.elapsed() << std::endl; + //std::cout << "mesh recreation time" << mesh_recreation_time.elapsed() << std::endl; //PAVEL @@ -577,7 +577,7 @@ namespace Kratos } } - std::cout << "During refinement we added " << outnew.numberofpoints-n_points_before_refinement<< "nodes " <FastGetSolutionStepValue(IS_BOUNDARY) = 0; } - std::cout << "reset the boundary flag" << adding_neighb.elapsed() << std::endl;; + //std::cout << "reset the boundary flag" << adding_neighb.elapsed() << std::endl;; //*********************************************************************************** //*********************************************************************************** boost::timer adding_faces; @@ -844,7 +844,7 @@ ModelPart::NodesContainerType& ModelNodes = ThisModelPart.Nodes(); } outnew.deinitialize(); outnew.initialize(); - std::cout << "time for adding faces" << adding_faces.elapsed() << std::endl;; + //std::cout << "time for adding faces" << adding_faces.elapsed() << std::endl;; @@ -870,7 +870,7 @@ ModelPart::NodesContainerType& ModelNodes = ThisModelPart.Nodes(); double second_part_time = auxiliary.elapsed(); - std::cout << "second part time = " << second_part_time - first_part_time << std::endl; + //std::cout << "second part time = " << second_part_time - first_part_time << std::endl; KRATOS_CATCH("") diff --git a/applications/PFEM2Application/custom_python/add_custom_utilities_to_python.cpp b/applications/PFEM2Application/custom_python/add_custom_utilities_to_python.cpp index 7a7be872754c..74200816c320 100644 --- a/applications/PFEM2Application/custom_python/add_custom_utilities_to_python.cpp +++ b/applications/PFEM2Application/custom_python/add_custom_utilities_to_python.cpp @@ -47,13 +47,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // - // System includes // External includes #include - // Project includes //#include "includes/define.h" #include "includes/define_python.h" @@ -75,104 +73,40 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "custom_utilities/save_lagrangian_surface_process_p.h" #include "custom_utilities/enrichmentutilities.h" - namespace Kratos { -namespace Python -{ + namespace Python + { + void AddCustomUtilitiesToPython(pybind11::module &m) + { + namespace py = pybind11; -void AddCustomUtilitiesToPython(pybind11::module& m) -{ -namespace py = pybind11; - - // typedef UblasSpace SparseSpaceType; - // typedef UblasSpace LocalSpaceType; - // typedef LinearSolver LinearSolverType; - - - py::class_< MoveParticleUtilityPFEM2<2> > (m,"MoveParticleUtilityPFEM22D").def(py::init()) - .def("MountBin", &MoveParticleUtilityPFEM2<2>::MountBin) - .def("MoveParticles", &MoveParticleUtilityPFEM2<2>::MoveParticles) - .def("AccelerateParticlesWithoutMovingUsingDeltaVelocity", &MoveParticleUtilityPFEM2<2>::AccelerateParticlesWithoutMovingUsingDeltaVelocity) - .def("PreReseed", &MoveParticleUtilityPFEM2<2>::PreReseed) - .def("PostReseed", &MoveParticleUtilityPFEM2<2>::PostReseed) - .def("ResetBoundaryConditions", &MoveParticleUtilityPFEM2<2>::ResetBoundaryConditions) - .def("ResetBoundaryConditionsSlip", &MoveParticleUtilityPFEM2<2>::ResetBoundaryConditionsSlip) - .def("TransferLagrangianToEulerian",&MoveParticleUtilityPFEM2<2>::TransferLagrangianToEulerian) - .def("CalculateVelOverElemSize", &MoveParticleUtilityPFEM2<2>::CalculateVelOverElemSize) - .def("CalculateDeltaVelocity", &MoveParticleUtilityPFEM2<2>::CalculateDeltaVelocity) - .def("CopyVectorVarToPreviousTimeStep", &MoveParticleUtilityPFEM2<2>::CopyVectorVarToPreviousTimeStep) - .def("IntializeTransferTool", &MoveParticleUtilityPFEM2<2>::IntializeTransferTool) - .def("PreReseedUsingTopographicDomain", &MoveParticleUtilityPFEM2<2>::PreReseedUsingTopographicDomain) - .def("ExecuteParticlesPritingTool", &MoveParticleUtilityPFEM2<2>::ExecuteParticlesPritingTool) - .def("ExecuteParticlesPritingToolForDroppletsOnly", &MoveParticleUtilityPFEM2<2>::ExecuteParticlesPritingToolForDroppletsOnly) - .def("RotateParticlesAndDomainVelocities", &MoveParticleUtilityPFEM2<2>::RotateParticlesAndDomainVelocities) - ; + // typedef UblasSpace SparseSpaceType; + // typedef UblasSpace LocalSpaceType; + // typedef LinearSolver LinearSolverType; - py::class_< MoveParticleUtilityPFEM2<3> > (m,"MoveParticleUtilityPFEM23D").def(py::init()) - .def("MountBin", &MoveParticleUtilityPFEM2<3>::MountBin) - .def("MoveParticles", &MoveParticleUtilityPFEM2<3>::MoveParticles) - .def("AccelerateParticlesWithoutMovingUsingDeltaVelocity", &MoveParticleUtilityPFEM2<3>::AccelerateParticlesWithoutMovingUsingDeltaVelocity) - .def("PreReseed", &MoveParticleUtilityPFEM2<3>::PreReseed) - .def("PostReseed", &MoveParticleUtilityPFEM2<3>::PostReseed) - .def("ResetBoundaryConditions", &MoveParticleUtilityPFEM2<3>::ResetBoundaryConditions) - .def("ResetBoundaryConditionsSlip", &MoveParticleUtilityPFEM2<3>::ResetBoundaryConditionsSlip) - .def("TransferLagrangianToEulerian",&MoveParticleUtilityPFEM2<3>::TransferLagrangianToEulerian) - .def("CalculateVelOverElemSize", &MoveParticleUtilityPFEM2<3>::CalculateVelOverElemSize) - .def("CalculateDeltaVelocity", &MoveParticleUtilityPFEM2<3>::CalculateDeltaVelocity) - .def("CopyVectorVarToPreviousTimeStep", &MoveParticleUtilityPFEM2<3>::CopyVectorVarToPreviousTimeStep) - .def("IntializeTransferTool", &MoveParticleUtilityPFEM2<3>::IntializeTransferTool) - .def("PreReseedUsingTopographicDomain", &MoveParticleUtilityPFEM2<3>::PreReseedUsingTopographicDomain) - .def("ExecuteParticlesPritingTool", &MoveParticleUtilityPFEM2<3>::ExecuteParticlesPritingTool) - .def("ExecuteParticlesPritingToolForDroppletsOnly", &MoveParticleUtilityPFEM2<3>::ExecuteParticlesPritingToolForDroppletsOnly) - .def("AssignNodalVelocityUsingInletConditions", &MoveParticleUtilityPFEM2<3>::AssignNodalVelocityUsingInletConditions) - .def("RotateParticlesAndDomainVelocities", &MoveParticleUtilityPFEM2<3>::RotateParticlesAndDomainVelocities) - ; + py::class_>(m, "MoveParticleUtilityPFEM22D").def(py::init()).def("MountBin", &MoveParticleUtilityPFEM2<2>::MountBin).def("MoveParticles", &MoveParticleUtilityPFEM2<2>::MoveParticles).def("AccelerateParticlesWithoutMovingUsingDeltaVelocity", &MoveParticleUtilityPFEM2<2>::AccelerateParticlesWithoutMovingUsingDeltaVelocity).def("PreReseed", &MoveParticleUtilityPFEM2<2>::PreReseed).def("PostReseed", &MoveParticleUtilityPFEM2<2>::PostReseed).def("ResetBoundaryConditions", &MoveParticleUtilityPFEM2<2>::ResetBoundaryConditions).def("ResetBoundaryConditionsSlip", &MoveParticleUtilityPFEM2<2>::ResetBoundaryConditionsSlip).def("TransferLagrangianToEulerian", &MoveParticleUtilityPFEM2<2>::TransferLagrangianToEulerian).def("CalculateVelOverElemSize", &MoveParticleUtilityPFEM2<2>::CalculateVelOverElemSize).def("CalculateDeltaVelocity", &MoveParticleUtilityPFEM2<2>::CalculateDeltaVelocity).def("CopyVectorVarToPreviousTimeStep", &MoveParticleUtilityPFEM2<2>::CopyVectorVarToPreviousTimeStep).def("IntializeTransferTool", &MoveParticleUtilityPFEM2<2>::IntializeTransferTool).def("PreReseedUsingTopographicDomain", &MoveParticleUtilityPFEM2<2>::PreReseedUsingTopographicDomain).def("ExecuteParticlesPritingTool", &MoveParticleUtilityPFEM2<2>::ExecuteParticlesPritingTool).def("ExecuteParticlesPritingToolForDroppletsOnly", &MoveParticleUtilityPFEM2<2>::ExecuteParticlesPritingToolForDroppletsOnly).def("RotateParticlesAndDomainVelocities", &MoveParticleUtilityPFEM2<2>::RotateParticlesAndDomainVelocities); - py::class_ (m,"AddFixedVelocityCondition2D").def(py::init()) - .def("AddThem", &AddFixedVelocityCondition2D::AddThem) - ; + py::class_>(m, "MoveParticleUtilityPFEM23D").def(py::init()).def("MountBin", &MoveParticleUtilityPFEM2<3>::MountBin).def("MoveParticles", &MoveParticleUtilityPFEM2<3>::MoveParticles).def("AccelerateParticlesWithoutMovingUsingDeltaVelocity", &MoveParticleUtilityPFEM2<3>::AccelerateParticlesWithoutMovingUsingDeltaVelocity).def("PreReseed", &MoveParticleUtilityPFEM2<3>::PreReseed).def("PostReseed", &MoveParticleUtilityPFEM2<3>::PostReseed).def("ResetBoundaryConditions", &MoveParticleUtilityPFEM2<3>::ResetBoundaryConditions).def("ResetBoundaryConditionsSlip", &MoveParticleUtilityPFEM2<3>::ResetBoundaryConditionsSlip).def("TransferLagrangianToEulerian", &MoveParticleUtilityPFEM2<3>::TransferLagrangianToEulerian).def("CalculateVelOverElemSize", &MoveParticleUtilityPFEM2<3>::CalculateVelOverElemSize).def("CalculateDeltaVelocity", &MoveParticleUtilityPFEM2<3>::CalculateDeltaVelocity).def("CopyVectorVarToPreviousTimeStep", &MoveParticleUtilityPFEM2<3>::CopyVectorVarToPreviousTimeStep).def("IntializeTransferTool", &MoveParticleUtilityPFEM2<3>::IntializeTransferTool).def("PreReseedUsingTopographicDomain", &MoveParticleUtilityPFEM2<3>::PreReseedUsingTopographicDomain).def("ExecuteParticlesPritingTool", &MoveParticleUtilityPFEM2<3>::ExecuteParticlesPritingTool).def("ExecuteParticlesPritingToolForDroppletsOnly", &MoveParticleUtilityPFEM2<3>::ExecuteParticlesPritingToolForDroppletsOnly).def("AssignNodalVelocityUsingInletConditions", &MoveParticleUtilityPFEM2<3>::AssignNodalVelocityUsingInletConditions).def("RotateParticlesAndDomainVelocities", &MoveParticleUtilityPFEM2<3>::RotateParticlesAndDomainVelocities); - py::class_ (m,"AddWaterFixedVelocityCondition2D").def(py::init()) - .def("AddThem", &AddWaterFixedVelocityCondition2D::AddThem) - ; + py::class_(m, "AddFixedVelocityCondition2D").def(py::init()).def("AddThem", &AddFixedVelocityCondition2D::AddThem); - py::class_ (m,"AddFixedVelocityCondition3D").def(py::init()) - .def("AddThem", &AddFixedVelocityCondition3D::AddThem) - ; + py::class_(m, "AddWaterFixedVelocityCondition2D").def(py::init()).def("AddThem", &AddWaterFixedVelocityCondition2D::AddThem); - py::class_ (m,"AddFixedPressureCondition2D").def(py::init()) - .def("AddThem", &AddFixedPressureCondition2D::AddThem) - ; + py::class_(m, "AddFixedVelocityCondition3D").def(py::init()).def("AddThem", &AddFixedVelocityCondition3D::AddThem); - py::class_ (m,"AddFixedPressureCondition3D").def(py::init()) - .def("AddThem", &AddFixedPressureCondition3D::AddThem) - ; + py::class_(m, "AddFixedPressureCondition2D").def(py::init()).def("AddThem", &AddFixedPressureCondition2D::AddThem); - py::class_ (m,"VisualizationUtilities").def(py::init<>()) - .def("VisualizationModelPart",&VisualizationUtilities::VisualizationModelPart) - ; + py::class_(m, "AddFixedPressureCondition3D").def(py::init()).def("AddThem", &AddFixedPressureCondition3D::AddThem); - py::class_ > (m,"CalculateWaterFraction2D").def(py::init()) - .def("Calculate",&CalculateWaterFraction<2>::Calculate) - .def("CalculateWaterHeight",&CalculateWaterFraction<2>::CalculateWaterHeight) - .def("CalculateMeanCourant",&CalculateWaterFraction<2>::CalculateMeanCourant) - .def("CalculateMaxCourant",&CalculateWaterFraction<2>::CalculateMaxCourant) - .def("CalculateMaxCourantInNegativeElements",&CalculateWaterFraction<2>::CalculateMaxCourantInNegativeElements) - .def("CalculateForce",&CalculateWaterFraction<2>::CalculateForce) - ; + py::class_(m, "VisualizationUtilities").def(py::init<>()).def("VisualizationModelPart", &VisualizationUtilities::VisualizationModelPart); - py::class_ > (m,"CalculateWaterFraction3D").def(py::init()) - .def("Calculate",&CalculateWaterFraction<3>::Calculate) - .def("CalculateWaterHeight",&CalculateWaterFraction<3>::CalculateWaterHeight) - .def("CalculateMeanCourant",&CalculateWaterFraction<3>::CalculateMeanCourant) - .def("CalculateMaxCourant",&CalculateWaterFraction<3>::CalculateMaxCourant) - .def("CalculateMaxCourantInNegativeElements",&CalculateWaterFraction<3>::CalculateMaxCourantInNegativeElements) - .def("CalculateForce",&CalculateWaterFraction<3>::CalculateForce) - ; - /* + py::class_>(m, "CalculateWaterFraction2D").def(py::init()).def("Calculate", &CalculateWaterFraction<2>::Calculate).def("CalculateWaterHeight", &CalculateWaterFraction<2>::CalculateWaterHeight).def("CalculateMeanCourant", &CalculateWaterFraction<2>::CalculateMeanCourant).def("CalculateMaxCourant", &CalculateWaterFraction<2>::CalculateMaxCourant).def("CalculateMaxCourantInNegativeElements", &CalculateWaterFraction<2>::CalculateMaxCourantInNegativeElements).def("CalculateForce", &CalculateWaterFraction<2>::CalculateForce); + + py::class_>(m, "CalculateWaterFraction3D").def(py::init()).def("Calculate", &CalculateWaterFraction<3>::Calculate).def("CalculateWaterHeight", &CalculateWaterFraction<3>::CalculateWaterHeight).def("CalculateMeanCourant", &CalculateWaterFraction<3>::CalculateMeanCourant).def("CalculateMaxCourant", &CalculateWaterFraction<3>::CalculateMaxCourant).def("CalculateMaxCourantInNegativeElements", &CalculateWaterFraction<3>::CalculateMaxCourantInNegativeElements).def("CalculateForce", &CalculateWaterFraction<3>::CalculateForce); + /* py::class_ >("ParticleUtils2D", init<>()) .def("VisualizationModelPart", &ParticleUtils < 2 > ::VisualizationModelPart) .def("TransferToEulerianMesh", &ParticleUtils < 2 > ::TransferToEulerianMesh) @@ -183,62 +117,20 @@ namespace py = pybind11; ; */ - py::class_ >(m,"ParticleUtils3D").def(py::init<>()) - .def("MoveMesh_Streamlines_freesurfaceflows", &ParticleUtils < 3 > ::MoveMesh_Streamlines_freesurfaceflows) - .def("TransferToEulerianMeshShapeBased_aux_3D", &ParticleUtils < 3 > ::TransferToEulerianMeshShapeBased_aux_3D) - .def("TransferToEulerianMesh_Face_Heat_Flux", &ParticleUtils < 3 > ::TransferToEulerianMesh_Face_Heat_Flux) - .def("TransferToEulerianMesh", &ParticleUtils < 3 > ::TransferToEulerianMesh) - .def("TransferToEulerianMesh_Face_Heat_Flux", &ParticleUtils < 3 > ::TransferToEulerianMesh_Face_Heat_Flux) - .def("CalculateNormal", &ParticleUtils < 3 > ::CalculateNormal) - .def("MarkExcessivelyCloseNodes", &ParticleUtils < 3 > ::MarkExcessivelyCloseNodes) - .def("MoveLonelyNodes", &ParticleUtils < 3 > ::MoveLonelyNodes) - .def("Calculate_Vol", &ParticleUtils < 3 > ::Calculate_Vol) - .def("TransferToParticlesAirVelocity", &ParticleUtils < 3 > ::TransferToParticlesAirVelocity) - .def("ComputedDragCoefficient", &ParticleUtils < 3 > ::ComputedDragCoefficient) - .def("CalculateNewtonianDragCoefficient", &ParticleUtils < 3 > ::CalculateNewtonianDragCoefficient) - .def("DetectAllOilClusters", &ParticleUtils < 3 > ::DetectAllOilClusters) - .def("ColorOilClusters", &ParticleUtils < 3 > ::ColorOilClusters) - .def("TransferToEulerianMesh_2", &ParticleUtils < 3 > ::TransferToEulerianMesh_2) - ; - - py::class_(m,"Pfem2ApplyBCProcess").def(py::init()); - - py::class_(m,"Pfem2Utils").def(py::init<>()) - .def("ApplyBoundaryConditions",&Pfem2Utils::ApplyBoundaryConditions) - .def("MarkOuterNodes",&Pfem2Utils::MarkOuterNodes) - .def("MoveLonelyNodes",&Pfem2Utils::MoveLonelyNodes) - .def("MarkExcessivelyCloseNodes",&Pfem2Utils::MarkExcessivelyCloseNodes) - .def("MarkNodesCloseToWall", &Pfem2Utils::MarkNodesCloseToWall) - .def("MarkNodesTouchingWall", &Pfem2Utils::MarkNodesTouchingWall) - .def("MarkNodesCloseToWallForBladder", &Pfem2Utils::MarkNodesCloseToWallForBladder) - .def("MarkNodesCloseToFS", &Pfem2Utils::MarkNodesCloseToFS) - .def ("MarkLonelyNodesForErasing", &Pfem2Utils::MarkLonelyNodesForErasing) - .def ("SaveReducedPart", &Pfem2Utils::SaveReducedPart) - ; - py::class_(m,"MarkOuterNodesProcess").def(py::init()) - .def("MarkOuterNodes",&MarkOuterNodesProcess::MarkOuterNodes) - ; + py::class_>(m, "ParticleUtils3D").def(py::init<>()).def("MoveMesh_Streamlines_freesurfaceflows", &ParticleUtils<3>::MoveMesh_Streamlines_freesurfaceflows).def("TransferToEulerianMeshShapeBased_aux_3D", &ParticleUtils<3>::TransferToEulerianMeshShapeBased_aux_3D).def("TransferToEulerianMesh_Face_Heat_Flux", &ParticleUtils<3>::TransferToEulerianMesh_Face_Heat_Flux).def("TransferToEulerianMesh", &ParticleUtils<3>::TransferToEulerianMesh).def("TransferToEulerianMesh_Face_Heat_Flux", &ParticleUtils<3>::TransferToEulerianMesh_Face_Heat_Flux).def("CalculateNormal", &ParticleUtils<3>::CalculateNormal).def("MarkExcessivelyCloseNodes", &ParticleUtils<3>::MarkExcessivelyCloseNodes).def("MoveLonelyNodes", &ParticleUtils<3>::MoveLonelyNodes).def("Calculate_Vol", &ParticleUtils<3>::Calculate_Vol).def("TransferToParticlesAirVelocity", &ParticleUtils<3>::TransferToParticlesAirVelocity).def("ComputedDragCoefficient", &ParticleUtils<3>::ComputedDragCoefficient).def("CalculateNewtonianDragCoefficient", &ParticleUtils<3>::CalculateNewtonianDragCoefficient).def("DetectAllOilClusters", &ParticleUtils<3>::DetectAllOilClusters).def("ColorOilClusters", &ParticleUtils<3>::ColorOilClusters).def("TransferToEulerianMesh_2", &ParticleUtils<3>::TransferToEulerianMesh_2); - py::class_(m,"MarkFluidProcess").def(py::init()); - - - py::class_(m,"SaveLagrangianSurfaceProcess_p").def(py::init<> ()) - .def("SaveSurfaceConditions_p", &SaveLagrangianSurfaceProcess_p::SaveSurfaceConditions_p) - ; - - - py::class_(m,"EnrichmentUtilitiesforPFEM2").def(py::init<> ()) - .def("CalculateEnrichedShapeFuncions", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncions) - .def("CalculateEnrichedShapeFuncionsExtendedmodified", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncionsExtendedmodified) - .def("CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints) - .def("CalculateEnrichedShapeFuncions", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncions) - ; + py::class_(m, "Pfem2ApplyBCProcess").def(py::init()); + py::class_(m, "Pfem2Utils").def(py::init<>()).def("ApplyBoundaryConditions", &Pfem2Utils::ApplyBoundaryConditions).def("MarkOuterNodes", &Pfem2Utils::MarkOuterNodes).def("MoveLonelyNodes", &Pfem2Utils::MoveLonelyNodes).def("MarkExcessivelyCloseNodes", &Pfem2Utils::MarkExcessivelyCloseNodes).def("MarkNodesCloseToWall", &Pfem2Utils::MarkNodesCloseToWall).def("MarkNodesTouchingWall", &Pfem2Utils::MarkNodesTouchingWall).def("MarkNodesCloseToWallForBladder", &Pfem2Utils::MarkNodesCloseToWallForBladder).def("MarkNodesCloseToFS", &Pfem2Utils::MarkNodesCloseToFS).def("MarkLonelyNodesForErasing", &Pfem2Utils::MarkLonelyNodesForErasing).def("SaveReducedPart", &Pfem2Utils::SaveReducedPart); + py::class_(m, "MarkOuterNodesProcess").def(py::init()).def("MarkOuterNodes", &MarkOuterNodesProcess::MarkOuterNodes); + py::class_(m, "MarkFluidProcess").def(py::init()); + py::class_(m, "SaveLagrangianSurfaceProcess_p").def(py::init<>()).def("SaveSurfaceConditions_p", &SaveLagrangianSurfaceProcess_p::SaveSurfaceConditions_p); -} + py::class_(m, "EnrichmentUtilitiesforPFEM2").def(py::init<>()).def("CalculateEnrichedShapeFuncions", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncions).def("CalculateEnrichedShapeFuncionsExtendedmodified", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncionsExtendedmodified).def("CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints).def("CalculateEnrichedShapeFuncions", &EnrichmentUtilitiesforPFEM2::CalculateEnrichedShapeFuncions); + } -} // namespace Python. + } // namespace Python. } // Namespace Kratos diff --git a/applications/PFEM2Application/custom_utilities/enrichmentutilities.h b/applications/PFEM2Application/custom_utilities/enrichmentutilities.h index 5ed3b80541f7..1a2a5ab41264 100644 --- a/applications/PFEM2Application/custom_utilities/enrichmentutilities.h +++ b/applications/PFEM2Application/custom_utilities/enrichmentutilities.h @@ -9,11 +9,8 @@ // Main authors: Author Julio Marti. // - -#if !defined(KRATOS_ENRICHMENTUTILITIES_INCLUDED ) -#define KRATOS_ENRICHMENTUTILITIES_INCLUDED - - +#if !defined(KRATOS_ENRICHMENTUTILITIES_INCLUDED) +#define KRATOS_ENRICHMENTUTILITIES_INCLUDED // System includes #include @@ -23,1894 +20,1657 @@ // External includes - // Project includes #include "includes/define.h" #include "utilities/split_tetrahedra.h" - namespace Kratos { -/** This utility can be used to calculate the enriched shape function for tetrahedra element. + /** This utility can be used to calculate the enriched shape function for tetrahedra element. * The metodology consists in partitioning the tetrahedra in a set of sub-tetrahedra and * cacluate the enrichment information using these partitions. */ - class EnrichmentUtilitiesforPFEM2 - { - public: - - //2D with information on the interfase - static int CalculateEnrichedShapeFuncions(BoundedMatrix& rPoints, BoundedMatrix& DN_DX,array_1d& rDistances, array_1d& rVolumes, BoundedMatrix& rGPShapeFunctionValues,array_1d& rPartitionsSign, std::vector& rGradientsValue, BoundedMatrix& NEnriched,array_1d& rGPShapeFunctionValues_in_interfase, array_1d& NEnriched_in_interfase, double & InterfaseArea) - { - KRATOS_TRY - - const double one_third=1.0/3.0; - BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) - BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc - BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives - - double most_common_sign=0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity - double Area;//area of the complete element - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; //default, when no interfase has been found - Area = CalculateVolume2D( rPoints ); - array_1d cut_edges; - array_1d aux_nodes_relative_locations; - BoundedMatrix aux_nodes_father_nodes; - - //to begin with we must check whether our element is cut or not by the interfase. - if( (rDistances(0)*rDistances(1))>0.0 && (rDistances(0)*rDistances(2))>0.0 ) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element + class EnrichmentUtilitiesforPFEM2 { - rVolumes(0)=Area; - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; - NEnriched(0,0) = 0.0; - //type_of_cut=1; - for (int j = 0; j < 3; j++) - rGradientsValue[0](0, j) = 0.0; - if (rDistances(0) < 0.0) rPartitionsSign[0] = -1.0; - else rPartitionsSign[0] = 1.0; - //KRATOS_WATCH("one element not in the intefase") - return 1; - } - - //else //we must create the enrichement, it can be in 2 or 3 parts. we'll start with 3 always. - - - //const double epsilon = 1e-15; //1.00e-9; - //compute the gradient of the distance and normalize it - array_1d grad_d; - noalias(grad_d) = prod(trans(DN_DX), rDistances); - /* + public: + //2D with information on the interfase + static int CalculateEnrichedShapeFuncions(BoundedMatrix &rPoints, BoundedMatrix &DN_DX, array_1d &rDistances, array_1d &rVolumes, BoundedMatrix &rGPShapeFunctionValues, array_1d &rPartitionsSign, std::vector &rGradientsValue, BoundedMatrix &NEnriched, array_1d &rGPShapeFunctionValues_in_interfase, array_1d &NEnriched_in_interfase, double &InterfaseArea) + { + KRATOS_TRY + + const double one_third = 1.0 / 3.0; + BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) + BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc + BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives + + double most_common_sign = 0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity + double Area; //area of the complete element + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; //default, when no interfase has been found + Area = CalculateVolume2D(rPoints); + array_1d cut_edges; + array_1d aux_nodes_relative_locations; + BoundedMatrix aux_nodes_father_nodes; + + //to begin with we must check whether our element is cut or not by the interfase. + if ((rDistances(0) * rDistances(1)) > 0.0 && (rDistances(0) * rDistances(2)) > 0.0) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element + { + rVolumes(0) = Area; + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; + NEnriched(0, 0) = 0.0; + //type_of_cut=1; + for (int j = 0; j < 3; j++) + rGradientsValue[0](0, j) = 0.0; + if (rDistances(0) < 0.0) + rPartitionsSign[0] = -1.0; + else + rPartitionsSign[0] = 1.0; + //KRATOS_WATCH("one element not in the intefase") + return 1; + } + + //else //we must create the enrichement, it can be in 2 or 3 parts. we'll start with 3 always. + + //const double epsilon = 1e-15; //1.00e-9; + //compute the gradient of the distance and normalize it + array_1d grad_d; + noalias(grad_d) = prod(trans(DN_DX), rDistances); + /* double norm = norm_2(grad_d); if (norm > epsilon) grad_d /= (norm); */ - array_1d exact_distance = rDistances; - array_1d abs_distance = ZeroVector(3); - - - //KRATOS_WATCH("one element IS in the intefase") - if ((rDistances(0)*rDistances(1))<0.0) //edge 12 is cut - cut_edges[0]=true; - else - cut_edges[0]=false; - if ((rDistances(1)*rDistances(2))<0.0) //edge 23 is cut. - cut_edges[1]=true; - else - cut_edges[1]=false; - if ((rDistances(2)*rDistances(0))<0.0) //edge 23 is cut. - cut_edges[2]=true; - else - cut_edges[2]=false; - - //'TRICK' TO AVOID HAVING THE INTERFASE TOO CLOSE TO THE NODES: - //since we cannot collapse node because we have to contemplate the possibility of discontinuities, we will move a little the intefase so that it is not that close. - const double unsigned_distance0=fabs(rDistances(0)); - const double unsigned_distance1=fabs(rDistances(1)); - const double unsigned_distance2=fabs(rDistances(2)); - //we begin by finding the largest distance: - double longest_distance=fabs(unsigned_distance0); - if (unsigned_distance1>longest_distance) - longest_distance=unsigned_distance1; - if (unsigned_distance2>longest_distance) - longest_distance=unsigned_distance2; - //Now we set a maximum relative distance - const double tolerable_distance =longest_distance*0.001; // (1/1,000,000 seems to have good results) - //and now we check if a distance is too small: - if (unsigned_distance0fabs(rDistances(edge_begin_node))) //if edge is not cut, we collapse the aux node into the node which has the highest absolute value to have "nicer" (less "slivery") subelements - { - aux_nodes_relative_locations(i)=0.0; - aux_nodes_father_nodes(i,0)=edge_end_node; - aux_nodes_father_nodes(i,1)=edge_end_node; - } - else - { - aux_nodes_relative_locations(i)=1.0; - aux_nodes_father_nodes(i,0)=edge_begin_node; - aux_nodes_father_nodes(i,1)=edge_begin_node; - } - } + array_1d exact_distance = rDistances; + array_1d abs_distance = ZeroVector(3); + + //KRATOS_WATCH("one element IS in the intefase") + if ((rDistances(0) * rDistances(1)) < 0.0) //edge 12 is cut + cut_edges[0] = true; + else + cut_edges[0] = false; + if ((rDistances(1) * rDistances(2)) < 0.0) //edge 23 is cut. + cut_edges[1] = true; + else + cut_edges[1] = false; + if ((rDistances(2) * rDistances(0)) < 0.0) //edge 23 is cut. + cut_edges[2] = true; + else + cut_edges[2] = false; + + //'TRICK' TO AVOID HAVING THE INTERFASE TOO CLOSE TO THE NODES: + //since we cannot collapse node because we have to contemplate the possibility of discontinuities, we will move a little the intefase so that it is not that close. + const double unsigned_distance0 = fabs(rDistances(0)); + const double unsigned_distance1 = fabs(rDistances(1)); + const double unsigned_distance2 = fabs(rDistances(2)); + //we begin by finding the largest distance: + double longest_distance = fabs(unsigned_distance0); + if (unsigned_distance1 > longest_distance) + longest_distance = unsigned_distance1; + if (unsigned_distance2 > longest_distance) + longest_distance = unsigned_distance2; + //Now we set a maximum relative distance + const double tolerable_distance = longest_distance * 0.001; // (1/1,000,000 seems to have good results) + //and now we check if a distance is too small: + if (unsigned_distance0 < tolerable_distance) + rDistances[0] = tolerable_distance * (rDistances[0] / fabs(rDistances[0])); + if (unsigned_distance1 < tolerable_distance) + rDistances[1] = tolerable_distance * (rDistances[1] / fabs(rDistances[1])); + if (unsigned_distance2 < tolerable_distance) + rDistances[2] = tolerable_distance * (rDistances[2] / fabs(rDistances[2])); + //END OF TRICK. REMEMBER TO OVERWRITE THE DISTANCE VARIABLE IN THE ELEMENT IN CASE THESE LINES HAVE MODIFIED THEM (distances) + + for (unsigned int i = 0; i < 3; i++) //we go over the 3 edges: + { + int edge_begin_node = i; + int edge_end_node = i + 1; + if (edge_end_node == 3) + edge_end_node = 0; //it's a triangle, so node 3 is actually node 0 - //and we save the coordinate of the new aux nodes: - for (unsigned int j=0;j<2;j++) //x,y coordinates - aux_points(i,j)= rPoints(edge_begin_node,j) * aux_nodes_relative_locations(i) + rPoints(edge_end_node,j) * (1.0- aux_nodes_relative_locations(i)); - } + if (cut_edges(i) == true) + { + aux_nodes_relative_locations(i) = fabs(rDistances(edge_end_node) / (rDistances(edge_end_node) - rDistances(edge_begin_node))); //position in 'natural' coordinates of edge 12, 1 when it passes over node 1. (it is over the edge 01) + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; + } + else + { + if (fabs(rDistances(edge_end_node)) > fabs(rDistances(edge_begin_node))) //if edge is not cut, we collapse the aux node into the node which has the highest absolute value to have "nicer" (less "slivery") subelements + { + aux_nodes_relative_locations(i) = 0.0; + aux_nodes_father_nodes(i, 0) = edge_end_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; + } + else + { + aux_nodes_relative_locations(i) = 1.0; + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_begin_node; + } + } + //and we save the coordinate of the new aux nodes: + for (unsigned int j = 0; j < 2; j++) //x,y coordinates + aux_points(i, j) = rPoints(edge_begin_node, j) * aux_nodes_relative_locations(i) + rPoints(edge_end_node, j) * (1.0 - aux_nodes_relative_locations(i)); + } - array_1d base_point; - if (cut_edges(0)==true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge - { - base_point[0] = aux_points(0,0); - base_point[1] = aux_points(0,1); + array_1d base_point; + if (cut_edges(0) == true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge + { + base_point[0] = aux_points(0, 0); + base_point[1] = aux_points(0, 1); + } + else //it means aux_point 0 is a clone of other point, so we go to the second edge. + { + base_point[0] = aux_points(1, 0); + base_point[1] = aux_points(1, 1); + } - } - else //it means aux_point 0 is a clone of other point, so we go to the second edge. - { - base_point[0] = aux_points(1,0); - base_point[1] = aux_points(1,1); - } + for (int i_node = 0; i_node < 3; i_node++) + { + double d = (rPoints(i_node, 0) - base_point[0]) * grad_d[0] + + (rPoints(i_node, 1) - base_point[1]) * grad_d[1]; + abs_distance[i_node] = fabs(d); + } - for (int i_node = 0; i_node < 3; i_node++) - { - double d = (rPoints(i_node,0) - base_point[0]) * grad_d[0] + - (rPoints(i_node,1) - base_point[1]) * grad_d[1] ; - abs_distance[i_node] = fabs(d); - } + //assign correct sign to exact distance + for (int i = 0; i < 3; i++) + { + if (rDistances[i] < 0.0) + { + exact_distance[i] = -abs_distance[i]; + --most_common_sign; + } + else + { + exact_distance[i] = abs_distance[i]; + ++most_common_sign; + } + } - //assign correct sign to exact distance - for (int i = 0; i < 3; i++) - { - if (rDistances[i] < 0.0) - { - exact_distance[i] = -abs_distance[i]; - --most_common_sign; - } - else - { - exact_distance[i] = abs_distance[i]; - ++most_common_sign; - } - } - - //compute exact distance gradients - array_1d exact_distance_gradient; - noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - - array_1d abs_distance_gradient; - noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - - - double max_aux_dist_on_cut = -1; - for (int edge = 0; edge < 3; edge++) - { - const int i = edge; - int j = edge+1; - if (j==3) j=0; - if (rDistances[i] * rDistances[j] < 0.0) - { - const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); - //compute the position of the edge node - double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); - if(abs_dist_on_cut > max_aux_dist_on_cut) max_aux_dist_on_cut = abs_dist_on_cut; - } - } - - - //we reset all data: - rGradientsValue[0]=ZeroMatrix(2,2); - rGradientsValue[1]=ZeroMatrix(2,2); - rGradientsValue[2]=ZeroMatrix(2,2); - NEnriched=ZeroMatrix(3,2); - rGPShapeFunctionValues=ZeroMatrix(3,3); - - - //now we must check the 4 created partitions of the domain. - //one has been collapsed, so we discard it and therefore save only one. - unsigned int partition_number=0; // - //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area - //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. - bool found_empty_partition=false; - for (unsigned int i=0; i<4; i++) //i partition - { - unsigned int j_aux = i + 2; - if (j_aux>2) j_aux -= 3; - BoundedMatrix partition_father_nodes; - array_1d N; - if (i<3) - { - partition_father_nodes(0,0)=i; - partition_father_nodes(0,1)=i; - partition_father_nodes(1,0)=aux_nodes_father_nodes(i,0); //we are using i aux node - partition_father_nodes(1,1)=aux_nodes_father_nodes(i,1); //we are using i aux node - partition_father_nodes(2,0)=aux_nodes_father_nodes(j_aux,0); //we are using j_aux node - partition_father_nodes(2,1)=aux_nodes_father_nodes(j_aux,1); //we are using j_aux node - - coord_subdomain(0,0)=rPoints(i,0); - coord_subdomain(0,1)=rPoints(i,1); - coord_subdomain(1,0)=aux_points(i,0); - coord_subdomain(1,1)=aux_points(i,1); - coord_subdomain(2,0)=aux_points(j_aux,0); - coord_subdomain(2,1)=aux_points(j_aux,1); - } - else - { - //the last partition, made by the 3 aux nodes. - partition_father_nodes=aux_nodes_father_nodes; - coord_subdomain=aux_points; - //found_last_partition=true; - } - //calculate data of this partition - double temp_area; - CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); - if (temp_area > 1.0e-20) //ok, it does not have zero area - { - rVolumes(partition_number)=temp_area; - //we look for the gauss point of the partition: - double x_GP_partition = one_third * ( coord_subdomain(0,0) + coord_subdomain(1,0) + coord_subdomain(2,0) ); - double y_GP_partition = one_third * ( coord_subdomain(0,1) + coord_subdomain(1,1) + coord_subdomain(2,1) ); - double z_GP_partition = 0.0; - //we reset the coord_subdomain matrix so that we have the whole element again: - coord_subdomain = rPoints; - //and we calculate its shape function values - CalculatePosition ( coord_subdomain , x_GP_partition ,y_GP_partition ,z_GP_partition , N); - //we check the partition sign. - const double partition_sign = (N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2))/fabs(N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2)); - //rPartitionsSign(partition_number)=partition_sign; - - rGPShapeFunctionValues(partition_number,0)=N(0); - rGPShapeFunctionValues(partition_number,1)=N(1); - rGPShapeFunctionValues(partition_number,2)=N(2); - - //compute enriched shape function values - double dist = 0.0; - double abs_dist = 0.0; - for (int j = 0; j < 3; j++) - { - dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; - abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; - } + //compute exact distance gradients + array_1d exact_distance_gradient; + noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - if (partition_sign < 0.0) - rPartitionsSign[partition_number] = -1.0; - else - rPartitionsSign[partition_number] = 1.0; + array_1d abs_distance_gradient; + noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - //enrichment for the gradient (continuous pressure, discontinuous gradient. Coppola-Codina enrichment - NEnriched(partition_number, 0) = 0.5/max_aux_dist_on_cut * (abs_dist - rPartitionsSign[partition_number] * dist); - for (int j = 0; j < 2; j++) - { - rGradientsValue[partition_number](0, j) = (0.5/max_aux_dist_on_cut) * (abs_distance_gradient[j] - rPartitionsSign[partition_number] * exact_distance_gradient[j]); - } + double max_aux_dist_on_cut = -1; + for (int edge = 0; edge < 3; edge++) + { + const int i = edge; + int j = edge + 1; + if (j == 3) + j = 0; + if (rDistances[i] * rDistances[j] < 0.0) + { + const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); + //compute the position of the edge node + double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); + if (abs_dist_on_cut > max_aux_dist_on_cut) + max_aux_dist_on_cut = abs_dist_on_cut; + } + } - //enrichment to add a constant discontinuity along the interfase. - if (rPartitionsSign[partition_number]*most_common_sign > 0.0) //on this side we will copy the standard shape functions. (maybe we change the sign, but keeping the sign - { - NEnriched(partition_number, 1) = -1.0*rPartitionsSign[partition_number]*NEnriched(partition_number, 0) ; - for (int j = 0; j < 2; j++) - { - rGradientsValue[partition_number](1, j) = -1.0*rPartitionsSign[partition_number]*rGradientsValue[partition_number](0, j); - } - } - else //we have to construct the shape function to guarantee a constant jump to 2: - { - //notice that the partition to be changed must one the subdomains created with a real node. so the i index is also the real node. (used 4 lines below to recover the distance. + //we reset all data: + rGradientsValue[0] = ZeroMatrix(2, 2); + rGradientsValue[1] = ZeroMatrix(2, 2); + rGradientsValue[2] = ZeroMatrix(2, 2); + NEnriched = ZeroMatrix(3, 2); + rGPShapeFunctionValues = ZeroMatrix(3, 3); + + //now we must check the 4 created partitions of the domain. + //one has been collapsed, so we discard it and therefore save only one. + unsigned int partition_number = 0; // + //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area + //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. + bool found_empty_partition = false; + for (unsigned int i = 0; i < 4; i++) //i partition + { + unsigned int j_aux = i + 2; + if (j_aux > 2) + j_aux -= 3; + BoundedMatrix partition_father_nodes; + array_1d N; + if (i < 3) + { + partition_father_nodes(0, 0) = i; + partition_father_nodes(0, 1) = i; + partition_father_nodes(1, 0) = aux_nodes_father_nodes(i, 0); //we are using i aux node + partition_father_nodes(1, 1) = aux_nodes_father_nodes(i, 1); //we are using i aux node + partition_father_nodes(2, 0) = aux_nodes_father_nodes(j_aux, 0); //we are using j_aux node + partition_father_nodes(2, 1) = aux_nodes_father_nodes(j_aux, 1); //we are using j_aux node + + coord_subdomain(0, 0) = rPoints(i, 0); + coord_subdomain(0, 1) = rPoints(i, 1); + coord_subdomain(1, 0) = aux_points(i, 0); + coord_subdomain(1, 1) = aux_points(i, 1); + coord_subdomain(2, 0) = aux_points(j_aux, 0); + coord_subdomain(2, 1) = aux_points(j_aux, 1); + } + else + { + //the last partition, made by the 3 aux nodes. + partition_father_nodes = aux_nodes_father_nodes; + coord_subdomain = aux_points; + //found_last_partition=true; + } + //calculate data of this partition + double temp_area; + CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); + if (temp_area > 1.0e-20) //ok, it does not have zero area + { + rVolumes(partition_number) = temp_area; + //we look for the gauss point of the partition: + double x_GP_partition = one_third * (coord_subdomain(0, 0) + coord_subdomain(1, 0) + coord_subdomain(2, 0)); + double y_GP_partition = one_third * (coord_subdomain(0, 1) + coord_subdomain(1, 1) + coord_subdomain(2, 1)); + double z_GP_partition = 0.0; + //we reset the coord_subdomain matrix so that we have the whole element again: + coord_subdomain = rPoints; + //and we calculate its shape function values + CalculatePosition(coord_subdomain, x_GP_partition, y_GP_partition, z_GP_partition, N); + //we check the partition sign. + const double partition_sign = (N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)) / fabs(N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)); + //rPartitionsSign(partition_number)=partition_sign; + + rGPShapeFunctionValues(partition_number, 0) = N(0); + rGPShapeFunctionValues(partition_number, 1) = N(1); + rGPShapeFunctionValues(partition_number, 2) = N(2); + + //compute enriched shape function values + double dist = 0.0; + double abs_dist = 0.0; + for (int j = 0; j < 3; j++) + { + dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; + abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; + } - NEnriched(partition_number, 1) = rPartitionsSign[partition_number]*( 1.0*NEnriched(partition_number, 0) - 0.6666666666666666666666666666 ) ; - for (int j = 0; j < 2; j++) - { - rGradientsValue[partition_number](1, j) = (rPartitionsSign[partition_number]*1.0*rGradientsValue[partition_number](0, j) - exact_distance_gradient[j]*1.0/(abs_distance[i])); - } + if (partition_sign < 0.0) + rPartitionsSign[partition_number] = -1.0; + else + rPartitionsSign[partition_number] = 1.0; - } + //enrichment for the gradient (continuous pressure, discontinuous gradient. Coppola-Codina enrichment + NEnriched(partition_number, 0) = 0.5 / max_aux_dist_on_cut * (abs_dist - rPartitionsSign[partition_number] * dist); + for (int j = 0; j < 2; j++) + { + rGradientsValue[partition_number](0, j) = (0.5 / max_aux_dist_on_cut) * (abs_distance_gradient[j] - rPartitionsSign[partition_number] * exact_distance_gradient[j]); + } + //enrichment to add a constant discontinuity along the interfase. + if (rPartitionsSign[partition_number] * most_common_sign > 0.0) //on this side we will copy the standard shape functions. (maybe we change the sign, but keeping the sign + { + NEnriched(partition_number, 1) = -1.0 * rPartitionsSign[partition_number] * NEnriched(partition_number, 0); + for (int j = 0; j < 2; j++) + { + rGradientsValue[partition_number](1, j) = -1.0 * rPartitionsSign[partition_number] * rGradientsValue[partition_number](0, j); + } + } + else //we have to construct the shape function to guarantee a constant jump to 2: + { + //notice that the partition to be changed must one the subdomains created with a real node. so the i index is also the real node. (used 4 lines below to recover the distance. - partition_number++; + NEnriched(partition_number, 1) = rPartitionsSign[partition_number] * (1.0 * NEnriched(partition_number, 0) - 0.6666666666666666666666666666); + for (int j = 0; j < 2; j++) + { + rGradientsValue[partition_number](1, j) = (rPartitionsSign[partition_number] * 1.0 * rGradientsValue[partition_number](0, j) - exact_distance_gradient[j] * 1.0 / (abs_distance[i])); + } + } - } - else - found_empty_partition=true; + partition_number++; + } + else + found_empty_partition = true; + } + if (found_empty_partition == false) + KRATOS_WATCH("WROOOONGGGGGGGGGGG"); - } - if (found_empty_partition==false) - KRATOS_WATCH("WROOOONGGGGGGGGGGG"); + // finally the interfase: + if (cut_edges[0]) + { + if (cut_edges[1]) + { + InterfaseArea = sqrt(pow(aux_points(0, 0) - aux_points(1, 0), 2) + pow(aux_points(0, 1) - aux_points(1, 1), 2)); + base_point[0] = (aux_points(0, 0) + aux_points(1, 0)) * 0.5; + base_point[1] = (aux_points(0, 1) + aux_points(1, 1)) * 0.5; + CalculatePosition(rPoints, base_point[0], base_point[1], 0.0, rGPShapeFunctionValues_in_interfase); + double abs_dist_on_interfase = 0.0; + for (int j = 0; j < 3; j++) + abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase(j) * abs_distance[j]; + NEnriched_in_interfase(0) = 0.5 / max_aux_dist_on_cut * abs_dist_on_interfase; + } + else + { + InterfaseArea = sqrt(pow(aux_points(0, 0) - aux_points(2, 0), 2) + pow(aux_points(0, 1) - aux_points(2, 1), 2)); + base_point[0] = (aux_points(0, 0) + aux_points(2, 0)) * 0.5; + base_point[1] = (aux_points(0, 1) + aux_points(2, 1)) * 0.5; + CalculatePosition(rPoints, base_point[0], base_point[1], 0.0, rGPShapeFunctionValues_in_interfase); + double abs_dist_on_interfase = 0.0; + for (int j = 0; j < 3; j++) + abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase(j) * abs_distance[j]; + NEnriched_in_interfase(0) = 0.5 / max_aux_dist_on_cut * abs_dist_on_interfase; + } + } + else + { + InterfaseArea = sqrt(pow(aux_points(2, 0) - aux_points(1, 0), 2) + pow(aux_points(2, 1) - aux_points(1, 1), 2)); + base_point[0] = (aux_points(2, 0) + aux_points(1, 0)) * 0.5; + base_point[1] = (aux_points(2, 1) + aux_points(1, 1)) * 0.5; + CalculatePosition(rPoints, base_point[0], base_point[1], 0.0, rGPShapeFunctionValues_in_interfase); + double abs_dist_on_interfase = 0.0; + for (int j = 0; j < 3; j++) + abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase(j) * abs_distance[j]; + NEnriched_in_interfase(0) = 0.5 / max_aux_dist_on_cut * abs_dist_on_interfase; + } - // finally the interfase: - if (cut_edges[0]) - { - if (cut_edges[1]) - { - InterfaseArea = sqrt(pow(aux_points(0,0)-aux_points(1,0),2)+pow(aux_points(0,1)-aux_points(1,1),2)); - base_point[0] = (aux_points(0,0)+aux_points(1,0))*0.5; - base_point[1] = (aux_points(0,1)+aux_points(1,1))*0.5; - CalculatePosition ( rPoints , base_point[0] ,base_point[1] , 0.0 , rGPShapeFunctionValues_in_interfase); - double abs_dist_on_interfase = 0.0; - for (int j = 0; j < 3; j++) - abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase ( j) * abs_distance[j]; - NEnriched_in_interfase(0) = 0.5/max_aux_dist_on_cut * abs_dist_on_interfase; - } - else - { - InterfaseArea= sqrt(pow(aux_points(0,0)-aux_points(2,0),2)+pow(aux_points(0,1)-aux_points(2,1),2)); - base_point[0] = (aux_points(0,0)+aux_points(2,0))*0.5; - base_point[1] = (aux_points(0,1)+aux_points(2,1))*0.5; - CalculatePosition ( rPoints , base_point[0] ,base_point[1] , 0.0 , rGPShapeFunctionValues_in_interfase); - double abs_dist_on_interfase = 0.0; - for (int j = 0; j < 3; j++) - abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase ( j) * abs_distance[j]; - NEnriched_in_interfase(0) = 0.5/max_aux_dist_on_cut * abs_dist_on_interfase; - } - } - else - { - InterfaseArea= sqrt(pow(aux_points(2,0)-aux_points(1,0),2)+pow(aux_points(2,1)-aux_points(1,1),2)); - base_point[0] = (aux_points(2,0)+aux_points(1,0))*0.5; - base_point[1] = (aux_points(2,1)+aux_points(1,1))*0.5; - CalculatePosition ( rPoints , base_point[0] ,base_point[1] , 0.0 , rGPShapeFunctionValues_in_interfase); - double abs_dist_on_interfase = 0.0; - for (int j = 0; j < 3; j++) - abs_dist_on_interfase += rGPShapeFunctionValues_in_interfase ( j) * abs_distance[j]; - NEnriched_in_interfase(0) = 0.5/max_aux_dist_on_cut * abs_dist_on_interfase; - } - - - //KRATOS_WATCH(NEnriched) - return 3; - KRATOS_CATCH(""); - - } - - - static int CalculateEnrichedShapeFuncionsExtendedmodified(BoundedMatrix& rPoints, BoundedMatrix& DN_DX, array_1d& rDistances, array_1d& rVolumes, BoundedMatrix& rGPShapeFunctionValues, array_1d& rPartitionsSign, std::vector& rGradientsValue, BoundedMatrix& NEnriched,BoundedMatrix& rGradientpositive,BoundedMatrix& rGradientnegative ,BoundedMatrix& father_nodes) - { - KRATOS_TRY - - const double one_third=1.0/3.0; - BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) - BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc - BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives - - double most_common_sign=0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity - double Area;//area of the complete element - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; //default, when no interfase has been found - Area = CalculateVolume2D( rPoints ); - array_1d cut_edges; - array_1d aux_nodes_relative_locations; - BoundedMatrix aux_nodes_father_nodes; - - //to begin with we must check whether our element is cut or not by the interfase. - if( (rDistances(0)*rDistances(1))>0.0 && (rDistances(0)*rDistances(2))>0.0 ) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element - { - rVolumes(0)=Area; - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; - NEnriched(0,0) = 0.0; - //type_of_cut=1; - for (int j = 0; j < 2; j++) - rGradientsValue[0](0, j) = 0.0; - if (rDistances(0) < 0.0) rPartitionsSign[0] = -1.0; - else rPartitionsSign[0] = 1.0; - return 1; - } - - //else //we must create the enrichement, it can be in 2 or 3 parts. we'll start with 3 always. - - //'TRICK' TO AVOID HAVING THE INTERFASE TOO CLOSE TO THE NODES: - //since we cannot collapse node because we have to contemplate the possibility of discontinuities, we will move a little the intefase so that it is not that close. - const double unsigned_distance0=fabs(rDistances(0)); - const double unsigned_distance1=fabs(rDistances(1)); - const double unsigned_distance2=fabs(rDistances(2)); - //we begin by finding the largest distance: - double longest_distance=fabs(unsigned_distance0); - if (unsigned_distance1>longest_distance) - longest_distance=unsigned_distance1; - if (unsigned_distance2>longest_distance) - longest_distance=unsigned_distance2; - //Now we set a maximum relative distance - //const double tolerable_distance =longest_distance*0.001;// 0.001 // (1/1,000,000 seems to have good results) - //and now we check if a distance is too small: - - //END OF TRICK. REMEMBER TO OVERWRITE THE DISTANCE VARIABLE IN THE ELEMENT IN CASE THESE LINES HAVE MODIFIED THEM (distances) - - - //const double epsilon = 1e-15; //1.00e-9; - //compute the gradient of the distance and normalize it - array_1d grad_d; - noalias(grad_d) = prod(trans(DN_DX), rDistances); - - - array_1d exact_distance = rDistances; - array_1d abs_distance = ZeroVector(3); - - //KRATOS_WATCH("one element IS in the intefase") - if ((rDistances(0)*rDistances(1))<0.0) //edge 12 is cut - cut_edges[0]=true; - else - cut_edges[0]=false; - if ((rDistances(1)*rDistances(2))<0.0) //edge 23 is cut. - cut_edges[1]=true; - else - cut_edges[1]=false; - if ((rDistances(2)*rDistances(0))<0.0) //edge 23 is cut. - cut_edges[2]=true; - else - cut_edges[2]=false; - - //We have 3 edges, meaning we created 3 aux nodes. But one of them actually matches the position of a real node (the one that is not on an interface edge is displaced to one of the ends (a node) - //the new shape functions are built by setting the values in all (real and aux) nodes to zero except in one of the interphase nodes. in the array aux_node_shape_function_index we assign this value - array_1d aux_node_enrichment_shape_function_index; //when not used, it must be -1; - - int shape_function_id=0; - father_nodes(0,0)=-1; - father_nodes(0,1)=-1; - father_nodes(0,2)=-1; - father_nodes(1,0)=-1; - father_nodes(1,1)=-1; - father_nodes(1,2)=-1; - father_nodes(2,0)=-1; - father_nodes(2,1)=-1; - father_nodes(2,2)=-1; - - //KRATOS_WATCH(father_nodes); - for (unsigned int i=0; i<3; i++) //we go over the 3 edges: - { - int edge_begin_node=i; - int edge_end_node=i+1; - if (edge_end_node==3) edge_end_node=0; //it's a triangle, so node 3 is actually node 0 - - if(cut_edges(i)==true) - { - aux_nodes_relative_locations(i)=fabs(rDistances(edge_end_node)/(rDistances(edge_end_node)-rDistances(edge_begin_node) ) ) ; //position in 'natural' coordinates of edge 12, 1 when it passes over node 1. (it is over the edge 01) - //KRATOS_WATCH(aux_nodes_relative_locations(i)); - - aux_nodes_father_nodes(i,0)=edge_begin_node; - aux_nodes_father_nodes(i,1)=edge_end_node; - - aux_node_enrichment_shape_function_index(i)=shape_function_id; - father_nodes(i,0)=edge_begin_node; - father_nodes(i,1)=edge_end_node; - father_nodes(i,2)=shape_function_id; - shape_function_id++; - - } - else - {//< - if(fabs(rDistances(edge_end_node)) &rPoints, BoundedMatrix &DN_DX, array_1d &rDistances, array_1d &rVolumes, BoundedMatrix &rGPShapeFunctionValues, array_1d &rPartitionsSign, std::vector &rGradientsValue, BoundedMatrix &NEnriched, BoundedMatrix &rGradientpositive, BoundedMatrix &rGradientnegative, BoundedMatrix &father_nodes) + { + KRATOS_TRY + + const double one_third = 1.0 / 3.0; + BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) + BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc + BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives + + double most_common_sign = 0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity + double Area; //area of the complete element + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; //default, when no interfase has been found + Area = CalculateVolume2D(rPoints); + array_1d cut_edges; + array_1d aux_nodes_relative_locations; + BoundedMatrix aux_nodes_father_nodes; + + //to begin with we must check whether our element is cut or not by the interfase. + if ((rDistances(0) * rDistances(1)) > 0.0 && (rDistances(0) * rDistances(2)) > 0.0) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element + { + rVolumes(0) = Area; + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; + NEnriched(0, 0) = 0.0; + //type_of_cut=1; + for (int j = 0; j < 2; j++) + rGradientsValue[0](0, j) = 0.0; + if (rDistances(0) < 0.0) + rPartitionsSign[0] = -1.0; + else + rPartitionsSign[0] = 1.0; + return 1; + } + //else //we must create the enrichement, it can be in 2 or 3 parts. we'll start with 3 always. + + //'TRICK' TO AVOID HAVING THE INTERFASE TOO CLOSE TO THE NODES: + //since we cannot collapse node because we have to contemplate the possibility of discontinuities, we will move a little the intefase so that it is not that close. + const double unsigned_distance0 = fabs(rDistances(0)); + const double unsigned_distance1 = fabs(rDistances(1)); + const double unsigned_distance2 = fabs(rDistances(2)); + //we begin by finding the largest distance: + double longest_distance = fabs(unsigned_distance0); + if (unsigned_distance1 > longest_distance) + longest_distance = unsigned_distance1; + if (unsigned_distance2 > longest_distance) + longest_distance = unsigned_distance2; + //Now we set a maximum relative distance + //const double tolerable_distance =longest_distance*0.001;// 0.001 // (1/1,000,000 seems to have good results) + //and now we check if a distance is too small: + + //END OF TRICK. REMEMBER TO OVERWRITE THE DISTANCE VARIABLE IN THE ELEMENT IN CASE THESE LINES HAVE MODIFIED THEM (distances) + + //const double epsilon = 1e-15; //1.00e-9; + //compute the gradient of the distance and normalize it + array_1d grad_d; + noalias(grad_d) = prod(trans(DN_DX), rDistances); + + array_1d exact_distance = rDistances; + array_1d abs_distance = ZeroVector(3); + + //KRATOS_WATCH("one element IS in the intefase") + if ((rDistances(0) * rDistances(1)) < 0.0) //edge 12 is cut + cut_edges[0] = true; + else + cut_edges[0] = false; + if ((rDistances(1) * rDistances(2)) < 0.0) //edge 23 is cut. + cut_edges[1] = true; + else + cut_edges[1] = false; + if ((rDistances(2) * rDistances(0)) < 0.0) //edge 23 is cut. + cut_edges[2] = true; + else + cut_edges[2] = false; + + //We have 3 edges, meaning we created 3 aux nodes. But one of them actually matches the position of a real node (the one that is not on an interface edge is displaced to one of the ends (a node) + //the new shape functions are built by setting the values in all (real and aux) nodes to zero except in one of the interphase nodes. in the array aux_node_shape_function_index we assign this value + array_1d aux_node_enrichment_shape_function_index; //when not used, it must be -1; + + int shape_function_id = 0; + father_nodes(0, 0) = -1; + father_nodes(0, 1) = -1; + father_nodes(0, 2) = -1; + father_nodes(1, 0) = -1; + father_nodes(1, 1) = -1; + father_nodes(1, 2) = -1; + father_nodes(2, 0) = -1; + father_nodes(2, 1) = -1; + father_nodes(2, 2) = -1; + + //KRATOS_WATCH(father_nodes); + for (unsigned int i = 0; i < 3; i++) //we go over the 3 edges: + { + int edge_begin_node = i; + int edge_end_node = i + 1; + if (edge_end_node == 3) + edge_end_node = 0; //it's a triangle, so node 3 is actually node 0 - array_1d base_point; - if (cut_edges(0)==true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge - { - base_point[0] = aux_points(0,0); - base_point[1] = aux_points(0,1); - } - else //it means aux_point 0 is a clone of other point, so we go to the second edge. - { - base_point[0] = aux_points(1,0); - base_point[1] = aux_points(1,1); - } + if (cut_edges(i) == true) + { + aux_nodes_relative_locations(i) = fabs(rDistances(edge_end_node) / (rDistances(edge_end_node) - rDistances(edge_begin_node))); //position in 'natural' coordinates of edge 12, 1 when it passes over node 1. (it is over the edge 01) + //KRATOS_WATCH(aux_nodes_relative_locations(i)); - for (int i_node = 0; i_node < 3; i_node++) - { - double d = (rPoints(i_node,0) - base_point[0]) * grad_d[0] + (rPoints(i_node,1) - base_point[1]) * grad_d[1] ; - abs_distance[i_node] = fabs(d); - } + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; - //assign correct sign to exact distance - for (int i = 0; i < 3; i++) - { - if (rDistances[i] < 0.0) - { - exact_distance[i] = -abs_distance[i]; - --most_common_sign; - } - else - { - exact_distance[i] = abs_distance[i]; - ++most_common_sign; - } - } - - //compute exact distance gradients - array_1d exact_distance_gradient; - noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - - array_1d abs_distance_gradient; - noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - - - double max_aux_dist_on_cut = -1; - for (int edge = 0; edge < 3; edge++) - { - const int i = edge; - int j = edge+1; - if (j==3) j=0; - if (rDistances[i] * rDistances[j] < 0.0) - { - const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); - //compute the position of the edge node - double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); - if(abs_dist_on_cut > max_aux_dist_on_cut) max_aux_dist_on_cut = abs_dist_on_cut; - } - } - //we reset all data: - rGradientsValue[0]=ZeroMatrix(5,2); - rGradientsValue[1]=ZeroMatrix(5,2); - rGradientsValue[2]=ZeroMatrix(5,2); - - NEnriched=ZeroMatrix(3,5); - rGPShapeFunctionValues=ZeroMatrix(3,3); - - - //now we must check the 4 created partitions of the domain. - //one has been collapsed, so we discard it and therefore save only one. - unsigned int partition_number=0; // - //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area - //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. - bool found_empty_partition=false; - - //the enrichment is directly the shape functions created by using the partition. - //we have to save for the enrichment 0 and 1 which is the node that will be active, that is, whose shape function value is zero (for some partitions all 3 shape functions are inactive) - - - - for (int i=0; i<4; i++) //i partition - { + aux_node_enrichment_shape_function_index(i) = shape_function_id; + father_nodes(i, 0) = edge_begin_node; + father_nodes(i, 1) = edge_end_node; + father_nodes(i, 2) = shape_function_id; + shape_function_id++; + } + else + { //< + if (fabs(rDistances(edge_end_node)) < fabs(rDistances(edge_begin_node))) //if edge is not cut, we collapse the aux node into the node which has the highest absolute value to have "nicer" (less "slivery") subelements + { + aux_nodes_relative_locations(i) = 0.0; + aux_nodes_father_nodes(i, 0) = edge_end_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; + } + else + { + aux_nodes_relative_locations(i) = 1.0; + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_begin_node; + } + //KRATOS_WATCH("compileddd"); + aux_node_enrichment_shape_function_index(i) = -1; + } - array_1d active_node_in_enrichment_shape_function; - active_node_in_enrichment_shape_function(0)=-1; active_node_in_enrichment_shape_function(1)=-1; //initialized as if all are inactive -> gradient=0; - //the same but for the replacement shape functions - array_1d active_node_in_replacement_shape_function; - active_node_in_replacement_shape_function(0)=-1; active_node_in_replacement_shape_function(1)=-1; active_node_in_replacement_shape_function(2)=-1; //initialized as if all are inactive -> gradient=0; - - int j_aux = i + 2; - if (j_aux>2) j_aux -= 3; - BoundedMatrix partition_father_nodes; - array_1d N; //bool useful=false; - - int useful_node_for_N0star=-1; - int useful_node_for_N1star=-1; - - if (i<3) - { - partition_father_nodes(0,0)=i; - partition_father_nodes(0,1)=i; - partition_father_nodes(1,0)=aux_nodes_father_nodes(i,0); //we are using i aux node - partition_father_nodes(1,1)=aux_nodes_father_nodes(i,1); //we are using i aux node - partition_father_nodes(2,0)=aux_nodes_father_nodes(j_aux,0); //we are using j_aux node - partition_father_nodes(2,1)=aux_nodes_father_nodes(j_aux,1); //we are using j_aux node - - coord_subdomain(0,0)=rPoints(i,0); - coord_subdomain(0,1)=rPoints(i,1); - coord_subdomain(1,0)=aux_points(i,0); - coord_subdomain(1,1)=aux_points(i,1); - coord_subdomain(2,0)=aux_points(j_aux,0); - coord_subdomain(2,1)=aux_points(j_aux,1); - - //KRATOS_WATCH(coord_subdomain) - //notice that local nodes 2 and 3 and the possible candidates, with indexes i and j_aux: - if (aux_node_enrichment_shape_function_index(i)> -1) //that is, local node 2 it is a useful node: - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(i) )=1; //saving that local node 2 will be active for either enrichment 1 or 2. - // else we do nothing, we are not saving this node and the -1 stays - - //now the same for the local node 3 (j_aux) - if (aux_node_enrichment_shape_function_index(j_aux)> -1) //that is, local node 3 it is a useful node: - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(j_aux) )=2; //saving that local node 3 will be active for either enrichment 1 or 2. - // else we do nothing, we are not saving this node and the -1 stays - - active_node_in_replacement_shape_function(i)=0; //standard shape function i will be replaced by the one of local subelement node 1 - //now local nodes 2 and 3 - if (aux_nodes_father_nodes(i,0)==aux_nodes_father_nodes(i,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(i,0))=1; - if (aux_nodes_father_nodes(j_aux,0)==aux_nodes_father_nodes(j_aux,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(j_aux,0))=2; - // if( (aux_nodes_father_nodes(i,0)!=aux_nodes_father_nodes(i,1)) && (aux_nodes_father_nodes(j_aux,0)!=aux_nodes_father_nodes(j_aux,1))) - //{ - // useful=true; - //} - - coord_subdomain(0,0)=rPoints(i,0); - coord_subdomain(0,1)=rPoints(i,1); - coord_subdomain(1,0)=aux_points(i,0); - coord_subdomain(1,1)=aux_points(i,1); - coord_subdomain(2,0)=aux_points(j_aux,0); - coord_subdomain(2,1)=aux_points(j_aux,1); - - //an aux_node is useful when one of its father nodes is the real node of the subelement. that means that the edge is part of the subelement. - if(partition_father_nodes(1,0)==i || partition_father_nodes(1,1)==i) //if one of the father nodes of node_aux_i is equal to the real node i - { - if(aux_node_enrichment_shape_function_index(i)==0) - useful_node_for_N0star=1; - if(aux_node_enrichment_shape_function_index(i)==1) - useful_node_for_N1star=1; - } - if(partition_father_nodes(2,0)==j_aux || partition_father_nodes(2,1)==j_aux) //if one of the father nodes of node_aux_i is equal to the real node i - { - if(aux_node_enrichment_shape_function_index(j_aux)==0) - useful_node_for_N0star=2; - if(aux_node_enrichment_shape_function_index(j_aux)==1) - useful_node_for_N1star=2; - } - } - else - { - partition_father_nodes=aux_nodes_father_nodes; - coord_subdomain=aux_points; - //useful=true; - //int non_aux_node=-1; //one of the nodes of this partition is actually a real node, which has repeated father node - int non_aux_node_father_node=-1; //the real node id - //we have to check the 3 of them: - for (int j = 0; j < 3; j++) - { - if(partition_father_nodes(j,0)==partition_father_nodes(j,1)) - { - //non_aux_node=j; - non_aux_node_father_node=partition_father_nodes(j,0); - } - } - for (int j = 0; j < 3; j++) - { - if (aux_node_enrichment_shape_function_index(j)> -1) //that is, local node j it is a useful node: - { - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(j) ) = j; + //and we save the coordinate of the new aux nodes: + for (unsigned int j = 0; j < 2; j++) + { //x,y coordinates + aux_points(i, j) = rPoints(edge_begin_node, j) * aux_nodes_relative_locations(i) + rPoints(edge_end_node, j) * (1.0 - aux_nodes_relative_locations(i)); + } + } - if(partition_father_nodes(j,0)==non_aux_node_father_node || partition_father_nodes(j,1)==non_aux_node_father_node) + array_1d base_point; + if (cut_edges(0) == true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge { - if (aux_node_enrichment_shape_function_index(j)==0) - useful_node_for_N0star=j; - if (aux_node_enrichment_shape_function_index(j)==1) - useful_node_for_N1star=j; + base_point[0] = aux_points(0, 0); + base_point[1] = aux_points(0, 1); } - } - //to replace the standard shape functions: - if (aux_nodes_father_nodes(j,0)==aux_nodes_father_nodes(j,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(j,0))=j; - } - //found_last_partition=true; - } - //calculate data of this partition - double temp_area; - CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); - if (temp_area > 1.0e-20) //ok, it does not have zero area - { - //KRATOS_ERROR(std::logic_error, "method not implemented", ""); - rVolumes(partition_number)=temp_area; - //we look for the gauss point of the partition: - double x_GP_partition = one_third * ( coord_subdomain(0,0) + coord_subdomain(1,0) + coord_subdomain(2,0) ); - double y_GP_partition = one_third * ( coord_subdomain(0,1) + coord_subdomain(1,1) + coord_subdomain(2,1) ); - double z_GP_partition = 0.0; - //we reset the coord_subdomain matrix so that we have the whole element again: - coord_subdomain = rPoints; - //and we calculate its shape function values - CalculatePosition ( coord_subdomain , x_GP_partition ,y_GP_partition ,z_GP_partition , N); - //we check the partition sign. - const double partition_sign = (N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2))/fabs(N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2)); - //rPartitionsSign(partition_number)=partition_sign; - - rGPShapeFunctionValues(partition_number,0)=N(0); - rGPShapeFunctionValues(partition_number,1)=N(1); - rGPShapeFunctionValues(partition_number,2)=N(2); - - //compute enriched shape function values - double dist = 0.0; - double abs_dist = 0.0; - for (int j = 0; j < 3; j++) - { - dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; - abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; - } - - if (partition_sign < 0.0) - rPartitionsSign[partition_number] = -1.0; - else - rPartitionsSign[partition_number] = 1.0; - - //We use the sublement shape functions and derivatives: - //we loop the 2 enrichment shape functions: - for (int index_shape_function = 0; index_shape_function < 2; index_shape_function++) //enrichment shape function - { - if (active_node_in_enrichment_shape_function(index_shape_function) > -1) //recall some of them are inactive: - { - NEnriched(partition_number, index_shape_function+3 ) = one_third ; //only one gauss point. if more were to be used, it would still be simple (1/2,1/2,0);(0,1/2,1/2);(1/2,0,1/2); - for (int j = 0; j < 2; j++) //x,y,(z) + else //it means aux_point 0 is a clone of other point, so we go to the second edge. { - rGradientsValue[partition_number](index_shape_function+3, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(index_shape_function),j); + base_point[0] = aux_points(1, 0); + base_point[1] = aux_points(1, 1); } - } - else - { - NEnriched(partition_number, index_shape_function+3 ) = 0.0; - for (int j = 0; j < 2; j++) //x,y,(z) + for (int i_node = 0; i_node < 3; i_node++) { - rGradientsValue[partition_number](index_shape_function+3, j) = 0.0; + double d = (rPoints(i_node, 0) - base_point[0]) * grad_d[0] + (rPoints(i_node, 1) - base_point[1]) * grad_d[1]; + abs_distance[i_node] = fabs(d); } - } - } + //assign correct sign to exact distance + for (int i = 0; i < 3; i++) + { + if (rDistances[i] < 0.0) + { + exact_distance[i] = -abs_distance[i]; + --most_common_sign; + } + else + { + exact_distance[i] = abs_distance[i]; + ++most_common_sign; + } + } - array_1d replacement_shape_function_nodes = ZeroVector(3); - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - int active_node=-1; - for (int j = 0; j < 3; j++) //number_of_nodes in the subelement - if (partition_father_nodes(j,0)==index_shape_function && partition_father_nodes(j,1)==index_shape_function) - { - active_node=j; - break; - } - if(active_node> -1) - { - for (int j = 0; j < 2; j++) //x,y,(z) - rGradientsValue[partition_number](index_shape_function, j) = DN_DX_subdomain(active_node,j); - NEnriched(partition_number, index_shape_function ) = one_third; - replacement_shape_function_nodes(index_shape_function) = active_node; - } - else - { - for (int j = 0; j < 2; j++) //x,y,(z) - rGradientsValue[partition_number](index_shape_function, j) = 0.0; - replacement_shape_function_nodes(index_shape_function) = -1; - } - } + //compute exact distance gradients + array_1d exact_distance_gradient; + noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - //We use the sublement shape functions and derivatives: - //we loop the 3 replacement shape functions: - unsigned int number_of_real_nodes=0; //(each partition can have either 1 or 2); - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //enrichment shape function - { - if (active_node_in_replacement_shape_function(index_shape_function) > -1) //recall some of them are inactive: - number_of_real_nodes++; - } + array_1d abs_distance_gradient; + noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - if(useful_node_for_N0star > -1) - { - for (int j = 0; j < 2; j++) //x,y,(z) - { - if(partition_sign>0) + double max_aux_dist_on_cut = -1; + for (int edge = 0; edge < 3; edge++) { - //first two rows are for the side where N*1 = 1 - //row 1 is for gradN*1 - rGradientpositive(3, j)=DN_DX_subdomain(useful_node_for_N0star, j); - //row 2 is for gradN*2 - if (active_node_in_enrichment_shape_function(1) > -1) - rGradientpositive(4, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + const int i = edge; + int j = edge + 1; + if (j == 3) + j = 0; + if (rDistances[i] * rDistances[j] < 0.0) { - rGradientpositive(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); + //compute the position of the edge node + double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); + if (abs_dist_on_cut > max_aux_dist_on_cut) + max_aux_dist_on_cut = abs_dist_on_cut; } - } } - else + //we reset all data: + rGradientsValue[0] = ZeroMatrix(5, 2); + rGradientsValue[1] = ZeroMatrix(5, 2); + rGradientsValue[2] = ZeroMatrix(5, 2); + + NEnriched = ZeroMatrix(3, 5); + rGPShapeFunctionValues = ZeroMatrix(3, 3); + + //now we must check the 4 created partitions of the domain. + //one has been collapsed, so we discard it and therefore save only one. + unsigned int partition_number = 0; // + //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area + //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. + bool found_empty_partition = false; + + //the enrichment is directly the shape functions created by using the partition. + //we have to save for the enrichment 0 and 1 which is the node that will be active, that is, whose shape function value is zero (for some partitions all 3 shape functions are inactive) + + for (int i = 0; i < 4; i++) //i partition { - rGradientnegative(3, j) =DN_DX_subdomain(useful_node_for_N0star, j); - if (active_node_in_enrichment_shape_function(1) > -1) - rGradientnegative(4, j) =DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + array_1d active_node_in_enrichment_shape_function; + active_node_in_enrichment_shape_function(0) = -1; + active_node_in_enrichment_shape_function(1) = -1; //initialized as if all are inactive -> gradient=0; + //the same but for the replacement shape functions + array_1d active_node_in_replacement_shape_function; + active_node_in_replacement_shape_function(0) = -1; + active_node_in_replacement_shape_function(1) = -1; + active_node_in_replacement_shape_function(2) = -1; //initialized as if all are inactive -> gradient=0; + + int j_aux = i + 2; + if (j_aux > 2) + j_aux -= 3; + BoundedMatrix partition_father_nodes; + array_1d N; //bool useful=false; + + int useful_node_for_N0star = -1; + int useful_node_for_N1star = -1; + + if (i < 3) + { + partition_father_nodes(0, 0) = i; + partition_father_nodes(0, 1) = i; + partition_father_nodes(1, 0) = aux_nodes_father_nodes(i, 0); //we are using i aux node + partition_father_nodes(1, 1) = aux_nodes_father_nodes(i, 1); //we are using i aux node + partition_father_nodes(2, 0) = aux_nodes_father_nodes(j_aux, 0); //we are using j_aux node + partition_father_nodes(2, 1) = aux_nodes_father_nodes(j_aux, 1); //we are using j_aux node + + coord_subdomain(0, 0) = rPoints(i, 0); + coord_subdomain(0, 1) = rPoints(i, 1); + coord_subdomain(1, 0) = aux_points(i, 0); + coord_subdomain(1, 1) = aux_points(i, 1); + coord_subdomain(2, 0) = aux_points(j_aux, 0); + coord_subdomain(2, 1) = aux_points(j_aux, 1); + + //KRATOS_WATCH(coord_subdomain) + //notice that local nodes 2 and 3 and the possible candidates, with indexes i and j_aux: + if (aux_node_enrichment_shape_function_index(i) > -1) //that is, local node 2 it is a useful node: + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(i)) = 1; //saving that local node 2 will be active for either enrichment 1 or 2. + // else we do nothing, we are not saving this node and the -1 stays + + //now the same for the local node 3 (j_aux) + if (aux_node_enrichment_shape_function_index(j_aux) > -1) //that is, local node 3 it is a useful node: + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(j_aux)) = 2; //saving that local node 3 will be active for either enrichment 1 or 2. + // else we do nothing, we are not saving this node and the -1 stays + + active_node_in_replacement_shape_function(i) = 0; //standard shape function i will be replaced by the one of local subelement node 1 + //now local nodes 2 and 3 + if (aux_nodes_father_nodes(i, 0) == aux_nodes_father_nodes(i, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(i, 0)) = 1; + if (aux_nodes_father_nodes(j_aux, 0) == aux_nodes_father_nodes(j_aux, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(j_aux, 0)) = 2; + // if( (aux_nodes_father_nodes(i,0)!=aux_nodes_father_nodes(i,1)) && (aux_nodes_father_nodes(j_aux,0)!=aux_nodes_father_nodes(j_aux,1))) + //{ + // useful=true; + //} + + coord_subdomain(0, 0) = rPoints(i, 0); + coord_subdomain(0, 1) = rPoints(i, 1); + coord_subdomain(1, 0) = aux_points(i, 0); + coord_subdomain(1, 1) = aux_points(i, 1); + coord_subdomain(2, 0) = aux_points(j_aux, 0); + coord_subdomain(2, 1) = aux_points(j_aux, 1); + + //an aux_node is useful when one of its father nodes is the real node of the subelement. that means that the edge is part of the subelement. + if (partition_father_nodes(1, 0) == i || partition_father_nodes(1, 1) == i) //if one of the father nodes of node_aux_i is equal to the real node i + { + if (aux_node_enrichment_shape_function_index(i) == 0) + useful_node_for_N0star = 1; + if (aux_node_enrichment_shape_function_index(i) == 1) + useful_node_for_N1star = 1; + } + if (partition_father_nodes(2, 0) == j_aux || partition_father_nodes(2, 1) == j_aux) //if one of the father nodes of node_aux_i is equal to the real node i + { + if (aux_node_enrichment_shape_function_index(j_aux) == 0) + useful_node_for_N0star = 2; + if (aux_node_enrichment_shape_function_index(j_aux) == 1) + useful_node_for_N1star = 2; + } + } + else + { + partition_father_nodes = aux_nodes_father_nodes; + coord_subdomain = aux_points; + //useful=true; + //int non_aux_node=-1; //one of the nodes of this partition is actually a real node, which has repeated father node + int non_aux_node_father_node = -1; //the real node id + //we have to check the 3 of them: + for (int j = 0; j < 3; j++) + { + if (partition_father_nodes(j, 0) == partition_father_nodes(j, 1)) + { + //non_aux_node=j; + non_aux_node_father_node = partition_father_nodes(j, 0); + } + } + for (int j = 0; j < 3; j++) + { + if (aux_node_enrichment_shape_function_index(j) > -1) //that is, local node j it is a useful node: + { + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(j)) = j; + + if (partition_father_nodes(j, 0) == non_aux_node_father_node || partition_father_nodes(j, 1) == non_aux_node_father_node) + { + if (aux_node_enrichment_shape_function_index(j) == 0) + useful_node_for_N0star = j; + if (aux_node_enrichment_shape_function_index(j) == 1) + useful_node_for_N1star = j; + } + } + //to replace the standard shape functions: + if (aux_nodes_father_nodes(j, 0) == aux_nodes_father_nodes(j, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(j, 0)) = j; + } + //found_last_partition=true; + } + //calculate data of this partition + double temp_area; + CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); + if (temp_area > 1.0e-20) //ok, it does not have zero area { - rGradientnegative(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + //KRATOS_ERROR(std::logic_error, "method not implemented", ""); + rVolumes(partition_number) = temp_area; + //we look for the gauss point of the partition: + double x_GP_partition = one_third * (coord_subdomain(0, 0) + coord_subdomain(1, 0) + coord_subdomain(2, 0)); + double y_GP_partition = one_third * (coord_subdomain(0, 1) + coord_subdomain(1, 1) + coord_subdomain(2, 1)); + double z_GP_partition = 0.0; + //we reset the coord_subdomain matrix so that we have the whole element again: + coord_subdomain = rPoints; + //and we calculate its shape function values + CalculatePosition(coord_subdomain, x_GP_partition, y_GP_partition, z_GP_partition, N); + //we check the partition sign. + const double partition_sign = (N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)) / fabs(N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)); + //rPartitionsSign(partition_number)=partition_sign; + + rGPShapeFunctionValues(partition_number, 0) = N(0); + rGPShapeFunctionValues(partition_number, 1) = N(1); + rGPShapeFunctionValues(partition_number, 2) = N(2); + + //compute enriched shape function values + double dist = 0.0; + double abs_dist = 0.0; + for (int j = 0; j < 3; j++) + { + dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; + abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; + } + + if (partition_sign < 0.0) + rPartitionsSign[partition_number] = -1.0; + else + rPartitionsSign[partition_number] = 1.0; + + //We use the sublement shape functions and derivatives: + //we loop the 2 enrichment shape functions: + for (int index_shape_function = 0; index_shape_function < 2; index_shape_function++) //enrichment shape function + { + if (active_node_in_enrichment_shape_function(index_shape_function) > -1) //recall some of them are inactive: + { + NEnriched(partition_number, index_shape_function + 3) = one_third; //only one gauss point. if more were to be used, it would still be simple (1/2,1/2,0);(0,1/2,1/2);(1/2,0,1/2); + for (int j = 0; j < 2; j++) //x,y,(z) + { + rGradientsValue[partition_number](index_shape_function + 3, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(index_shape_function), j); + } + } + else + { + NEnriched(partition_number, index_shape_function + 3) = 0.0; + for (int j = 0; j < 2; j++) //x,y,(z) + { + rGradientsValue[partition_number](index_shape_function + 3, j) = 0.0; + } + } + } + + array_1d replacement_shape_function_nodes = ZeroVector(3); + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + int active_node = -1; + for (int j = 0; j < 3; j++) //number_of_nodes in the subelement + if (partition_father_nodes(j, 0) == index_shape_function && partition_father_nodes(j, 1) == index_shape_function) + { + active_node = j; + break; + } + if (active_node > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + rGradientsValue[partition_number](index_shape_function, j) = DN_DX_subdomain(active_node, j); + NEnriched(partition_number, index_shape_function) = one_third; + replacement_shape_function_nodes(index_shape_function) = active_node; + } + else + { + for (int j = 0; j < 2; j++) //x,y,(z) + rGradientsValue[partition_number](index_shape_function, j) = 0.0; + replacement_shape_function_nodes(index_shape_function) = -1; + } + } + + //We use the sublement shape functions and derivatives: + //we loop the 3 replacement shape functions: + unsigned int number_of_real_nodes = 0; //(each partition can have either 1 or 2); + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //enrichment shape function + { + if (active_node_in_replacement_shape_function(index_shape_function) > -1) //recall some of them are inactive: + number_of_real_nodes++; + } + + if (useful_node_for_N0star > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + { + if (partition_sign > 0) + { + //first two rows are for the side where N*1 = 1 + //row 1 is for gradN*1 + rGradientpositive(3, j) = DN_DX_subdomain(useful_node_for_N0star, j); + //row 2 is for gradN*2 + if (active_node_in_enrichment_shape_function(1) > -1) + rGradientpositive(4, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientpositive(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + else + { + rGradientnegative(3, j) = DN_DX_subdomain(useful_node_for_N0star, j); + if (active_node_in_enrichment_shape_function(1) > -1) + rGradientnegative(4, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientnegative(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + } + } + if (useful_node_for_N1star > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + { + if (partition_sign > 0) + { + //rows 3 and 4 are for the side where N*2 = 1 + //row 4 is for gradN*2 + rGradientpositive(9, j) = DN_DX_subdomain(useful_node_for_N1star, j); + //row 3 is for gradN*1 + if (active_node_in_enrichment_shape_function(0) > -1) + rGradientpositive(8, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientpositive(index_shape_function + 5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + else + { + rGradientnegative(9, j) = DN_DX_subdomain(useful_node_for_N1star, j); + if (active_node_in_enrichment_shape_function(0) > -1) + rGradientnegative(8, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientnegative(index_shape_function + 5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + } + } + + partition_number++; } - } + else + found_empty_partition = true; } - } + if (found_empty_partition == false) + KRATOS_WATCH("WROOOONGGGGGGGGGGG"); + + //KRATOS_WATCH(NEnriched) + return 3; + KRATOS_CATCH(""); } - if(useful_node_for_N1star > -1) + + //2D: 2 enrichment functions for capturing weak discontinities. All the shape functions follow the criteria of Partition of Unity. + static int CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints(Geometry> &trianglegeom, BoundedMatrix &rPoints, BoundedMatrix &DN_DX, array_1d &rDistances, array_1d &rVolumes, BoundedMatrix &rGPShapeFunctionValues, array_1d &rPartitionsSign, std::vector &rGradientsValue, BoundedMatrix &NEnriched, BoundedMatrix &rGradientpositive, BoundedMatrix &rGradientnegative, BoundedMatrix &father_nodes, std::vector &PRUEBA, array_1d &weight) { - for (int j = 0; j < 2; j++) //x,y,(z) - { - if(partition_sign>0) + KRATOS_TRY + + const double one_third = 1.0 / 3.0; + BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) + BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc + BoundedMatrix coord_subdomain_aux; + BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives + + double most_common_sign = 0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity + double Area; //area of the complete element + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; //default, when no interfase has been found + Area = CalculateVolume2D(rPoints); + array_1d cut_edges; + array_1d aux_nodes_relative_locations; + BoundedMatrix aux_nodes_father_nodes; + BoundedMatrix DN_DX_subdomainaux_1aux; //used to retrieve derivatives + + //to begin with we must check whether our element is cut or not by the interfase. + if ((rDistances(0) * rDistances(1)) > 0.0 && (rDistances(0) * rDistances(2)) > 0.0) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element { - //rows 3 and 4 are for the side where N*2 = 1 - //row 4 is for gradN*2 - rGradientpositive(9, j)=DN_DX_subdomain(useful_node_for_N1star, j); - //row 3 is for gradN*1 - if (active_node_in_enrichment_shape_function(0) > -1) - rGradientpositive(8, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) - { - rGradientpositive(index_shape_function+5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); - } - } + rVolumes(0) = Area; + rGPShapeFunctionValues(0, 0) = one_third; + rGPShapeFunctionValues(0, 1) = one_third; + rGPShapeFunctionValues(0, 2) = one_third; + NEnriched(0, 0) = 0.0; + //type_of_cut=1; + for (int j = 0; j < 2; j++) + rGradientsValue[0](0, j) = 0.0; + if (rDistances(0) < 0.0) + rPartitionsSign[0] = -1.0; + else + rPartitionsSign[0] = 1.0; + //KRATOS_WATCH("one element not in the intefase") + return 1; } - else + + const double unsigned_distance0 = fabs(rDistances(0)); + const double unsigned_distance1 = fabs(rDistances(1)); + const double unsigned_distance2 = fabs(rDistances(2)); + //we begin by finding the largest distance: + double longest_distance = fabs(unsigned_distance0); + if (unsigned_distance1 > longest_distance) + longest_distance = unsigned_distance1; + if (unsigned_distance2 > longest_distance) + longest_distance = unsigned_distance2; + //Now we set a maximum relative distance + //const double tolerable_distance =longest_distance*0.001;// 0.001 // (1/1,000,000 seems to have good results) + + //const double epsilon = 1e-15; //1.00e-9; + //compute the gradient of the distance and normalize it + array_1d grad_d; + noalias(grad_d) = prod(trans(DN_DX), rDistances); + + array_1d exact_distance = rDistances; + array_1d abs_distance = ZeroVector(3); + + if ((rDistances(0) * rDistances(1)) < 0.0) //edge 12 is cut + cut_edges[0] = true; + else + cut_edges[0] = false; + if ((rDistances(1) * rDistances(2)) < 0.0) //edge 23 is cut. + cut_edges[1] = true; + else + cut_edges[1] = false; + if ((rDistances(2) * rDistances(0)) < 0.0) //edge 23 is cut. + cut_edges[2] = true; + else + cut_edges[2] = false; + + //We have 3 edges, meaning we created 3 aux nodes. But one of them actually matches the position of a real node (the one that is not on an interface edge is displaced to one of the ends (a node) + //the new shape functions are built by setting the values in all (real and aux) nodes to zero except in one of the interphase nodes. in the array aux_node_shape_function_index we assign this value + array_1d aux_node_enrichment_shape_function_index; //when not used, it must be -1; + + int shape_function_id = 0; + father_nodes(0, 0) = -1; + father_nodes(0, 1) = -1; + father_nodes(0, 2) = -1; + father_nodes(1, 0) = -1; + father_nodes(1, 1) = -1; + father_nodes(1, 2) = -1; + father_nodes(2, 0) = -1; + father_nodes(2, 1) = -1; + father_nodes(2, 2) = -1; + + //KRATOS_WATCH(father_nodes); + for (unsigned int i = 0; i < 3; i++) //we go over the 3 edges: { - rGradientnegative(9, j)=DN_DX_subdomain(useful_node_for_N1star, j); - if(active_node_in_enrichment_shape_function(0) > -1) - rGradientnegative(8, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); + int edge_begin_node = i; + int edge_end_node = i + 1; + if (edge_end_node == 3) + edge_end_node = 0; //it's a triangle, so node 3 is actually node 0 - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + if (cut_edges(i) == true) { - rGradientnegative(index_shape_function+5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + aux_nodes_relative_locations(i) = fabs(rDistances(edge_end_node) / (rDistances(edge_end_node) - rDistances(edge_begin_node))); //position in 'natural' coordinates of edge 12, 1 when it passes over node 1. (it is over the edge 01) + + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; + aux_node_enrichment_shape_function_index(i) = shape_function_id; + father_nodes(i, 0) = edge_begin_node; + father_nodes(i, 1) = edge_end_node; + father_nodes(i, 2) = shape_function_id; + shape_function_id++; + } + else + { //< + if (fabs(rDistances(edge_end_node)) < fabs(rDistances(edge_begin_node))) //if edge is not cut, we collapse the aux node into the node which has the highest absolute value to have "nicer" (less "slivery") subelements + { + aux_nodes_relative_locations(i) = 0.0; + aux_nodes_father_nodes(i, 0) = edge_end_node; + aux_nodes_father_nodes(i, 1) = edge_end_node; + } + else + { + aux_nodes_relative_locations(i) = 1.0; + aux_nodes_father_nodes(i, 0) = edge_begin_node; + aux_nodes_father_nodes(i, 1) = edge_begin_node; + } + aux_node_enrichment_shape_function_index(i) = -1; } - } - } - } - } - - partition_number++; - - } - else - found_empty_partition=true; - } - if (found_empty_partition==false) - KRATOS_WATCH("WROOOONGGGGGGGGGGG"); - //KRATOS_WATCH(NEnriched) - return 3; - KRATOS_CATCH(""); + //and we save the coordinate of the new aux nodes: + for (unsigned int j = 0; j < 2; j++) + { //x,y coordinates + aux_points(i, j) = rPoints(edge_begin_node, j) * aux_nodes_relative_locations(i) + rPoints(edge_end_node, j) * (1.0 - aux_nodes_relative_locations(i)); + } + } - } + array_1d base_point; + if (cut_edges(0) == true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge + { + base_point[0] = aux_points(0, 0); + base_point[1] = aux_points(0, 1); + } + else //it means aux_point 0 is a clone of other point, so we go to the second edge. + { + base_point[0] = aux_points(1, 0); + base_point[1] = aux_points(1, 1); + } + for (int i_node = 0; i_node < 3; i_node++) + { + double d = (rPoints(i_node, 0) - base_point[0]) * grad_d[0] + (rPoints(i_node, 1) - base_point[1]) * grad_d[1]; + abs_distance[i_node] = fabs(d); + } - //2D: 2 enrichment functions for capturing weak discontinities. All the shape functions follow the criteria of Partition of Unity. - static int CalculateEnrichedShapeFuncionsExtendedmodified_gausspoints(Geometry< Node<3> >& trianglegeom,BoundedMatrix& rPoints, BoundedMatrix& DN_DX,array_1d& rDistances, array_1d& rVolumes, BoundedMatrix& rGPShapeFunctionValues, array_1d& rPartitionsSign, std::vector& rGradientsValue, BoundedMatrix& NEnriched,BoundedMatrix& rGradientpositive,BoundedMatrix& rGradientnegative ,BoundedMatrix& father_nodes,std::vector& PRUEBA, array_1d& weight) - { - KRATOS_TRY + //assign correct sign to exact distance + for (int i = 0; i < 3; i++) + { + if (rDistances[i] < 0.0) + { + exact_distance[i] = -abs_distance[i]; + --most_common_sign; + } + else + { + exact_distance[i] = abs_distance[i]; + ++most_common_sign; + } + } - const double one_third=1.0/3.0; - BoundedMatrix aux_points; //for auxiliary nodes 4(between 1 and 2) ,5(between 2 and 3) ,6 (between 3 and 1) - BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc - BoundedMatrix coord_subdomain_aux; - BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives + //compute exact distance gradients + array_1d exact_distance_gradient; + noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - double most_common_sign=0; //the side of the cut in which two nodes are found (same sign) will be the ones that remains unchanged when builing the discontinuity - double Area;//area of the complete element - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; //default, when no interfase has been found - Area = CalculateVolume2D( rPoints ); - array_1d cut_edges; - array_1d aux_nodes_relative_locations; - BoundedMatrix aux_nodes_father_nodes; - BoundedMatrix DN_DX_subdomainaux_1aux; //used to retrieve derivatives + array_1d abs_distance_gradient; + noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - //to begin with we must check whether our element is cut or not by the interfase. - if( (rDistances(0)*rDistances(1))>0.0 && (rDistances(0)*rDistances(2))>0.0 ) //it means that this element IS NOT cut by the interfase. we must return data of a normal, non-enriched element - { - rVolumes(0)=Area; - rGPShapeFunctionValues(0,0)=one_third; rGPShapeFunctionValues(0,1)=one_third; rGPShapeFunctionValues(0,2)=one_third; - NEnriched(0,0) = 0.0; - //type_of_cut=1; - for (int j = 0; j < 2; j++) - rGradientsValue[0](0, j) = 0.0; - if (rDistances(0) < 0.0) rPartitionsSign[0] = -1.0; - else rPartitionsSign[0] = 1.0; - //KRATOS_WATCH("one element not in the intefase") - return 1; - } - - const double unsigned_distance0=fabs(rDistances(0)); - const double unsigned_distance1=fabs(rDistances(1)); - const double unsigned_distance2=fabs(rDistances(2)); - //we begin by finding the largest distance: - double longest_distance=fabs(unsigned_distance0); - if (unsigned_distance1>longest_distance) - longest_distance=unsigned_distance1; - if (unsigned_distance2>longest_distance) - longest_distance=unsigned_distance2; - //Now we set a maximum relative distance - //const double tolerable_distance =longest_distance*0.001;// 0.001 // (1/1,000,000 seems to have good results) - - //const double epsilon = 1e-15; //1.00e-9; - //compute the gradient of the distance and normalize it - array_1d grad_d; - noalias(grad_d) = prod(trans(DN_DX), rDistances); - - array_1d exact_distance = rDistances; - array_1d abs_distance = ZeroVector(3); - - - if ((rDistances(0)*rDistances(1))<0.0) //edge 12 is cut - cut_edges[0]=true; - else - cut_edges[0]=false; - if ((rDistances(1)*rDistances(2))<0.0) //edge 23 is cut. - cut_edges[1]=true; - else - cut_edges[1]=false; - if ((rDistances(2)*rDistances(0))<0.0) //edge 23 is cut. - cut_edges[2]=true; - else - cut_edges[2]=false; - - //We have 3 edges, meaning we created 3 aux nodes. But one of them actually matches the position of a real node (the one that is not on an interface edge is displaced to one of the ends (a node) - //the new shape functions are built by setting the values in all (real and aux) nodes to zero except in one of the interphase nodes. in the array aux_node_shape_function_index we assign this value - array_1d aux_node_enrichment_shape_function_index; //when not used, it must be -1; - - int shape_function_id=0; - father_nodes(0,0)=-1; - father_nodes(0,1)=-1; - father_nodes(0,2)=-1; - father_nodes(1,0)=-1; - father_nodes(1,1)=-1; - father_nodes(1,2)=-1; - father_nodes(2,0)=-1; - father_nodes(2,1)=-1; - father_nodes(2,2)=-1; - - //KRATOS_WATCH(father_nodes); - for (unsigned int i=0; i<3; i++) //we go over the 3 edges: - { - int edge_begin_node=i; - int edge_end_node=i+1; - if (edge_end_node==3) edge_end_node=0; //it's a triangle, so node 3 is actually node 0 - - if(cut_edges(i)==true) - { - aux_nodes_relative_locations(i)=fabs(rDistances(edge_end_node)/(rDistances(edge_end_node)-rDistances(edge_begin_node) ) ) ; //position in 'natural' coordinates of edge 12, 1 when it passes over node 1. (it is over the edge 01) - - aux_nodes_father_nodes(i,0)=edge_begin_node; - aux_nodes_father_nodes(i,1)=edge_end_node; - aux_node_enrichment_shape_function_index(i)=shape_function_id; - father_nodes(i,0)=edge_begin_node; - father_nodes(i,1)=edge_end_node; - father_nodes(i,2)=shape_function_id; - shape_function_id++; - - - } - else - {//< - if(fabs(rDistances(edge_end_node)) max_aux_dist_on_cut) + max_aux_dist_on_cut = abs_dist_on_cut; + } + } + //we reset all data: + rGradientsValue[0] = ZeroMatrix(5, 2); + rGradientsValue[1] = ZeroMatrix(5, 2); + rGradientsValue[2] = ZeroMatrix(5, 2); - //and we save the coordinate of the new aux nodes: - for (unsigned int j=0;j<2;j++){ //x,y coordinates - aux_points(i,j)= rPoints(edge_begin_node,j) * aux_nodes_relative_locations(i) + rPoints(edge_end_node,j) * (1.0- aux_nodes_relative_locations(i)); - } - } + NEnriched = ZeroMatrix(3, 5); + rGPShapeFunctionValues = ZeroMatrix(3, 3); + //now we must check the 4 created partitions of the domain. + //one has been collapsed, so we discard it and therefore save only one. + unsigned int partition_number = 0; // + //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area + //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. + bool found_empty_partition = false; - array_1d base_point; - if (cut_edges(0)==true) // it means it is a cut edge, if it was 0.0 or 1.0 then it would be an uncut edge - { - base_point[0] = aux_points(0,0); - base_point[1] = aux_points(0,1); + //the enrichment is directly the shape functions created by using the partition. + //we have to save for the enrichment 0 and 1 which is the node that will be active, that is, whose shape function value is zero (for some partitions all 3 shape functions are inactive) - } - else //it means aux_point 0 is a clone of other point, so we go to the second edge. - { - base_point[0] = aux_points(1,0); - base_point[1] = aux_points(1,1); - } + for (int i = 0; i < 4; i++) //i partition + { - for (int i_node = 0; i_node < 3; i_node++) - { - double d = (rPoints(i_node,0) - base_point[0]) * grad_d[0] + (rPoints(i_node,1) - base_point[1]) * grad_d[1] ; - abs_distance[i_node] = fabs(d); - } + array_1d active_node_in_enrichment_shape_function; + active_node_in_enrichment_shape_function(0) = -1; + active_node_in_enrichment_shape_function(1) = -1; //initialized as if all are inactive -> gradient=0; + //the same but for the replacement shape functions + array_1d active_node_in_replacement_shape_function; + active_node_in_replacement_shape_function(0) = -1; + active_node_in_replacement_shape_function(1) = -1; + active_node_in_replacement_shape_function(2) = -1; //initialized as if all are inactive -> gradient=0; + + int j_aux = i + 2; + if (j_aux > 2) + j_aux -= 3; + BoundedMatrix partition_father_nodes; + array_1d N; //bool useful=false; + + int useful_node_for_N0star = -1; + int useful_node_for_N1star = -1; + + if (i < 3) + { + partition_father_nodes(0, 0) = i; + partition_father_nodes(0, 1) = i; + partition_father_nodes(1, 0) = aux_nodes_father_nodes(i, 0); //we are using i aux node + partition_father_nodes(1, 1) = aux_nodes_father_nodes(i, 1); //we are using i aux node + partition_father_nodes(2, 0) = aux_nodes_father_nodes(j_aux, 0); //we are using j_aux node + partition_father_nodes(2, 1) = aux_nodes_father_nodes(j_aux, 1); //we are using j_aux node + + coord_subdomain(0, 0) = rPoints(i, 0); + coord_subdomain(0, 1) = rPoints(i, 1); + coord_subdomain(1, 0) = aux_points(i, 0); + coord_subdomain(1, 1) = aux_points(i, 1); + coord_subdomain(2, 0) = aux_points(j_aux, 0); + coord_subdomain(2, 1) = aux_points(j_aux, 1); + + //KRATOS_WATCH(coord_subdomain) + //notice that local nodes 2 and 3 and the possible candidates, with indexes i and j_aux: + if (aux_node_enrichment_shape_function_index(i) > -1) //that is, local node 2 it is a useful node: + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(i)) = 1; //saving that local node 2 will be active for either enrichment 1 or 2. + // else we do nothing, we are not saving this node and the -1 stays + + //now the same for the local node 3 (j_aux) + if (aux_node_enrichment_shape_function_index(j_aux) > -1) //that is, local node 3 it is a useful node: + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(j_aux)) = 2; //saving that local node 3 will be active for either enrichment 1 or 2. + // else we do nothing, we are not saving this node and the -1 stays + + active_node_in_replacement_shape_function(i) = 0; //standard shape function i will be replaced by the one of local subelement node 1 + //now local nodes 2 and 3 + if (aux_nodes_father_nodes(i, 0) == aux_nodes_father_nodes(i, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(i, 0)) = 1; + if (aux_nodes_father_nodes(j_aux, 0) == aux_nodes_father_nodes(j_aux, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(j_aux, 0)) = 2; + // if( (aux_nodes_father_nodes(i,0)!=aux_nodes_father_nodes(i,1)) && (aux_nodes_father_nodes(j_aux,0)!=aux_nodes_father_nodes(j_aux,1))) + //{ + // useful=true; + //} + + coord_subdomain(0, 0) = rPoints(i, 0); + coord_subdomain(0, 1) = rPoints(i, 1); + coord_subdomain(1, 0) = aux_points(i, 0); + coord_subdomain(1, 1) = aux_points(i, 1); + coord_subdomain(2, 0) = aux_points(j_aux, 0); + coord_subdomain(2, 1) = aux_points(j_aux, 1); + + //an aux_node is useful when one of its father nodes is the real node of the subelement. that means that the edge is part of the subelement. + if (partition_father_nodes(1, 0) == i || partition_father_nodes(1, 1) == i) //if one of the father nodes of node_aux_i is equal to the real node i + { + if (aux_node_enrichment_shape_function_index(i) == 0) + useful_node_for_N0star = 1; + if (aux_node_enrichment_shape_function_index(i) == 1) + useful_node_for_N1star = 1; + } + if (partition_father_nodes(2, 0) == j_aux || partition_father_nodes(2, 1) == j_aux) //if one of the father nodes of node_aux_i is equal to the real node i + { + if (aux_node_enrichment_shape_function_index(j_aux) == 0) + useful_node_for_N0star = 2; + if (aux_node_enrichment_shape_function_index(j_aux) == 1) + useful_node_for_N1star = 2; + } + } + else + { + //the last partition, made by the 3 aux nodes. + partition_father_nodes = aux_nodes_father_nodes; + coord_subdomain = aux_points; + //useful=true; + //int non_aux_node=-1; //one of the nodes of this partition is actually a real node, which has repeated father node + int non_aux_node_father_node = -1; //the real node id + //we have to check the 3 of them: + for (int j = 0; j < 3; j++) + { + if (partition_father_nodes(j, 0) == partition_father_nodes(j, 1)) + { + //non_aux_node=j; + non_aux_node_father_node = partition_father_nodes(j, 0); + } + } + for (int j = 0; j < 3; j++) + { + if (aux_node_enrichment_shape_function_index(j) > -1) //that is, local node j it is a useful node: + { + active_node_in_enrichment_shape_function(aux_node_enrichment_shape_function_index(j)) = j; + + if (partition_father_nodes(j, 0) == non_aux_node_father_node || partition_father_nodes(j, 1) == non_aux_node_father_node) + { + if (aux_node_enrichment_shape_function_index(j) == 0) + useful_node_for_N0star = j; + if (aux_node_enrichment_shape_function_index(j) == 1) + useful_node_for_N1star = j; + } + } + + //to replace the standard shape functions: + if (aux_nodes_father_nodes(j, 0) == aux_nodes_father_nodes(j, 1)) + active_node_in_replacement_shape_function(aux_nodes_father_nodes(j, 0)) = j; + } + } - //assign correct sign to exact distance - for (int i = 0; i < 3; i++) - { - if (rDistances[i] < 0.0) - { - exact_distance[i] = -abs_distance[i]; - --most_common_sign; - } - else - { - exact_distance[i] = abs_distance[i]; - ++most_common_sign; - } - } - - //compute exact distance gradients - array_1d exact_distance_gradient; - noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - - array_1d abs_distance_gradient; - noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - - - double max_aux_dist_on_cut = -1; - for (int edge = 0; edge < 3; edge++) - { - const int i = edge; - int j = edge+1; - if (j==3) j=0; - if (rDistances[i] * rDistances[j] < 0.0) - { - const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); - //compute the position of the edge node - double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); - if(abs_dist_on_cut > max_aux_dist_on_cut) max_aux_dist_on_cut = abs_dist_on_cut; - } - } - //we reset all data: - rGradientsValue[0]=ZeroMatrix(5,2); - rGradientsValue[1]=ZeroMatrix(5,2); - rGradientsValue[2]=ZeroMatrix(5,2); - - NEnriched=ZeroMatrix(3,5); - rGPShapeFunctionValues=ZeroMatrix(3,3); - - //now we must check the 4 created partitions of the domain. - //one has been collapsed, so we discard it and therefore save only one. - unsigned int partition_number=0; // - //the 3 first partitions are created using 2 auxiliary nodes and a normal node. at least one of these will be discarded due to zero area - //the last one is composed by the 3 auxiliary nodes. it 'looks' wrong, but since at least one has been collapsed, it actually has a normal node. - bool found_empty_partition=false; - - //the enrichment is directly the shape functions created by using the partition. - //we have to save for the enrichment 0 and 1 which is the node that will be active, that is, whose shape function value is zero (for some partitions all 3 shape functions are inactive) - - for ( int i=0; i<4; i++) //i partition - { + //calculate data of this partition + double temp_area; + CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); + if (temp_area > 1.0e-20) //ok, it does not have zero area + { - array_1d active_node_in_enrichment_shape_function; - active_node_in_enrichment_shape_function(0)=-1; active_node_in_enrichment_shape_function(1)=-1; //initialized as if all are inactive -> gradient=0; - //the same but for the replacement shape functions - array_1d active_node_in_replacement_shape_function; - active_node_in_replacement_shape_function(0)=-1; active_node_in_replacement_shape_function(1)=-1; active_node_in_replacement_shape_function(2)=-1; //initialized as if all are inactive -> gradient=0; - - int j_aux = i + 2; - if (j_aux>2) j_aux -= 3; - BoundedMatrix partition_father_nodes; - array_1d N; //bool useful=false; - - int useful_node_for_N0star=-1; - int useful_node_for_N1star=-1; - - if (i<3) - { - partition_father_nodes(0,0)=i; - partition_father_nodes(0,1)=i; - partition_father_nodes(1,0)=aux_nodes_father_nodes(i,0); //we are using i aux node - partition_father_nodes(1,1)=aux_nodes_father_nodes(i,1); //we are using i aux node - partition_father_nodes(2,0)=aux_nodes_father_nodes(j_aux,0); //we are using j_aux node - partition_father_nodes(2,1)=aux_nodes_father_nodes(j_aux,1); //we are using j_aux node - - - coord_subdomain(0,0)=rPoints(i,0); - coord_subdomain(0,1)=rPoints(i,1); - coord_subdomain(1,0)=aux_points(i,0); - coord_subdomain(1,1)=aux_points(i,1); - coord_subdomain(2,0)=aux_points(j_aux,0); - coord_subdomain(2,1)=aux_points(j_aux,1); - - //KRATOS_WATCH(coord_subdomain) - //notice that local nodes 2 and 3 and the possible candidates, with indexes i and j_aux: - if (aux_node_enrichment_shape_function_index(i)> -1) //that is, local node 2 it is a useful node: - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(i) )=1; //saving that local node 2 will be active for either enrichment 1 or 2. - // else we do nothing, we are not saving this node and the -1 stays - - //now the same for the local node 3 (j_aux) - if (aux_node_enrichment_shape_function_index(j_aux)> -1) //that is, local node 3 it is a useful node: - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(j_aux) )=2; //saving that local node 3 will be active for either enrichment 1 or 2. - // else we do nothing, we are not saving this node and the -1 stays - - active_node_in_replacement_shape_function(i)=0; //standard shape function i will be replaced by the one of local subelement node 1 - //now local nodes 2 and 3 - if (aux_nodes_father_nodes(i,0)==aux_nodes_father_nodes(i,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(i,0))=1; - if (aux_nodes_father_nodes(j_aux,0)==aux_nodes_father_nodes(j_aux,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(j_aux,0))=2; - // if( (aux_nodes_father_nodes(i,0)!=aux_nodes_father_nodes(i,1)) && (aux_nodes_father_nodes(j_aux,0)!=aux_nodes_father_nodes(j_aux,1))) - //{ - // useful=true; - //} - - coord_subdomain(0,0)=rPoints(i,0); - coord_subdomain(0,1)=rPoints(i,1); - coord_subdomain(1,0)=aux_points(i,0); - coord_subdomain(1,1)=aux_points(i,1); - coord_subdomain(2,0)=aux_points(j_aux,0); - coord_subdomain(2,1)=aux_points(j_aux,1); - - - //an aux_node is useful when one of its father nodes is the real node of the subelement. that means that the edge is part of the subelement. - if(partition_father_nodes(1,0)==i || partition_father_nodes(1,1)==i) //if one of the father nodes of node_aux_i is equal to the real node i - { - if(aux_node_enrichment_shape_function_index(i)==0) - useful_node_for_N0star=1; - if(aux_node_enrichment_shape_function_index(i)==1) - useful_node_for_N1star=1; - } - if(partition_father_nodes(2,0)==j_aux || partition_father_nodes(2,1)==j_aux) //if one of the father nodes of node_aux_i is equal to the real node i - { - if(aux_node_enrichment_shape_function_index(j_aux)==0) - useful_node_for_N0star=2; - if(aux_node_enrichment_shape_function_index(j_aux)==1) - useful_node_for_N1star=2; - } - } - else - { - //the last partition, made by the 3 aux nodes. - partition_father_nodes=aux_nodes_father_nodes; - coord_subdomain=aux_points; - //useful=true; - //int non_aux_node=-1; //one of the nodes of this partition is actually a real node, which has repeated father node - int non_aux_node_father_node=-1; //the real node id - //we have to check the 3 of them: - for (int j = 0; j < 3; j++) - { - if(partition_father_nodes(j,0)==partition_father_nodes(j,1)) - { - //non_aux_node=j; - non_aux_node_father_node=partition_father_nodes(j,0); - } - } - for (int j = 0; j < 3; j++) - { - if (aux_node_enrichment_shape_function_index(j)> -1) //that is, local node j it is a useful node: - { - active_node_in_enrichment_shape_function( aux_node_enrichment_shape_function_index(j) ) = j; + rVolumes(partition_number) = temp_area; + //we look for the gauss point of the partition: + double x_GP_partition = one_third * (coord_subdomain(0, 0) + coord_subdomain(1, 0) + coord_subdomain(2, 0)); + double y_GP_partition = one_third * (coord_subdomain(0, 1) + coord_subdomain(1, 1) + coord_subdomain(2, 1)); + double z_GP_partition = 0.0; + coord_subdomain_aux = coord_subdomain; + //we reset the coord_subdomain matrix so that we have the whole element again: + coord_subdomain = rPoints; + //and we calculate its shape function values + CalculatePosition(coord_subdomain, x_GP_partition, y_GP_partition, z_GP_partition, N); + //we check the partition sign. + const double partition_sign = (N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)) / fabs(N(0) * rDistances(0) + N(1) * rDistances(1) + N(2) * rDistances(2)); + //rPartitionsSign(partition_number)=partition_sign; + + rGPShapeFunctionValues(partition_number, 0) = N(0); + rGPShapeFunctionValues(partition_number, 1) = N(1); + rGPShapeFunctionValues(partition_number, 2) = N(2); + + //compute enriched shape function values + + typedef GeometryData::IntegrationMethod IntegrationMethod; + IntegrationMethod mThisIntegrationMethod; + std::vector mInvJ0; + Vector mDetJ0; + + Geometry>::PointsArrayType NewPoints; + Node<3>::Pointer p_new_node; + int id_local = 0; + for (unsigned int j = 0; j != 3; j++) + { + p_new_node = Node<3>::Pointer(new Node<3>(id_local, coord_subdomain_aux(j, 0), coord_subdomain_aux(j, 1), coord_subdomain_aux(j, 2))); + NewPoints.push_back(p_new_node); + id_local++; + } - if(partition_father_nodes(j,0)==non_aux_node_father_node || partition_father_nodes(j,1)==non_aux_node_father_node) - { - if (aux_node_enrichment_shape_function_index(j)==0) - useful_node_for_N0star=j; - if (aux_node_enrichment_shape_function_index(j)==1) - useful_node_for_N1star=j; - } - } + Geometry>::Pointer pGeom = trianglegeom.Create(NewPoints); + //const unsigned int number_of_points = pGeom->size(); + //KRATOS_WATCH(number_of_points); + mThisIntegrationMethod = GeometryData::GI_GAUSS_2; - //to replace the standard shape functions: - if (aux_nodes_father_nodes(j,0)==aux_nodes_father_nodes(j,1)) - active_node_in_replacement_shape_function(aux_nodes_father_nodes(j,0))=j; - } + typedef Geometry>::IntegrationPointsArrayType IntegrationPointsArrayType; + //const GeomtryType::IntegrationPointsArrayType& integration_points = pGeom->IntegrationPoints(mThisIntegrationMethod); + const IntegrationPointsArrayType &integration_points = pGeom->IntegrationPoints(mThisIntegrationMethod); - } - - //calculate data of this partition - double temp_area; - CalculateGeometryData(coord_subdomain, DN_DX_subdomain, temp_area); - if (temp_area > 1.0e-20) //ok, it does not have zero area - { - - rVolumes(partition_number)=temp_area; - //we look for the gauss point of the partition: - double x_GP_partition = one_third * ( coord_subdomain(0,0) + coord_subdomain(1,0) + coord_subdomain(2,0) ); - double y_GP_partition = one_third * ( coord_subdomain(0,1) + coord_subdomain(1,1) + coord_subdomain(2,1) ); - double z_GP_partition = 0.0; - coord_subdomain_aux = coord_subdomain; - //we reset the coord_subdomain matrix so that we have the whole element again: - coord_subdomain = rPoints; - //and we calculate its shape function values - CalculatePosition ( coord_subdomain , x_GP_partition ,y_GP_partition ,z_GP_partition , N); - //we check the partition sign. - const double partition_sign = (N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2))/fabs(N(0)*rDistances(0) + N(1)*rDistances(1) + N(2)*rDistances(2)); - //rPartitionsSign(partition_number)=partition_sign; - - rGPShapeFunctionValues(partition_number,0)=N(0); - rGPShapeFunctionValues(partition_number,1)=N(1); - rGPShapeFunctionValues(partition_number,2)=N(2); - - //compute enriched shape function values - - typedef GeometryData::IntegrationMethod IntegrationMethod; - IntegrationMethod mThisIntegrationMethod; - std::vector< Matrix > mInvJ0; - Vector mDetJ0; + mInvJ0.resize(integration_points.size()); + mDetJ0.resize(integration_points.size(), false); - Geometry< Node<3> >::PointsArrayType NewPoints; - Node<3>::Pointer p_new_node; - int id_local=0; - for (unsigned int j=0; j!=3; j++) - { - p_new_node = Node<3>::Pointer(new Node<3>(id_local, coord_subdomain_aux(j,0), coord_subdomain_aux(j,1), coord_subdomain_aux(j,2))); - NewPoints.push_back(p_new_node); - id_local++; - } + //KRATOS_WATCH(integration_points.size()); + //KRATOS_ERROR(std::logic_error, "element with zero area found", ""); + Element::GeometryType::JacobiansType J0; + J0 = pGeom->Jacobian(J0, mThisIntegrationMethod); Geometry< Node<3> >::Pointer pGeom = trianglegeom.Create(NewPoints); //const unsigned int number_of_points = pGeom->size(); //KRATOS_WATCH(number_of_points); mThisIntegrationMethod= GeometryData::IntegrationMethod::GI_GAUSS_2; - typedef Geometry >::IntegrationPointsArrayType IntegrationPointsArrayType; - //const GeomtryType::IntegrationPointsArrayType& integration_points = pGeom->IntegrationPoints(mThisIntegrationMethod); - const IntegrationPointsArrayType& integration_points = pGeom->IntegrationPoints(mThisIntegrationMethod); + double xp = 0.0; + double yp = 0.0; + double temp_areaaux_2 = 0.0; + bounded_matrix N_new = ZeroMatrix(4, 8); - mInvJ0.resize(integration_points.size()); - mDetJ0.resize(integration_points.size(),false); + for (unsigned int PointNumber = 0; PointNumber < integration_points.size(); PointNumber++) + { + //unsigned int number_of_nodes = pGeom->PointsNumber(); + //unsigned int dimension = pGeom->WorkingSpaceDimension(); + const Vector &N = row(Ncontainer, PointNumber); - //KRATOS_WATCH(integration_points.size()); - //KRATOS_ERROR(std::logic_error, "element with zero area found", ""); - Element::GeometryType::JacobiansType J0; - J0 = pGeom->Jacobian(J0, mThisIntegrationMethod); + MathUtils::InvertMatrix(J0[PointNumber], mInvJ0[PointNumber], mDetJ0[PointNumber]); + double Weight = integration_points[PointNumber].Weight() * mDetJ0[PointNumber]; const Matrix& Ncontainer = pGeom->ShapeFunctionsValues(GeometryData::IntegrationMethod::GI_GAUSS_2); - double xp=0.0; - double yp=0.0; - double temp_areaaux_2=0.0; - bounded_matrix N_new=ZeroMatrix(4,8); + for (unsigned int tt = 0; tt < 3; tt++) + { + xp += N[tt] * coord_subdomain_aux(tt, 0); + yp += N[tt] * coord_subdomain_aux(tt, 1); + } - for(unsigned int PointNumber = 0; PointNumberPointsNumber(); - //unsigned int dimension = pGeom->WorkingSpaceDimension(); - const Vector& N=row(Ncontainer,PointNumber); + for (unsigned int h = 0; h < 3; h++) //loop por los nodos del subelemento + { - MathUtils::InvertMatrix(J0[PointNumber],mInvJ0[PointNumber],mDetJ0[PointNumber]); - double Weight = integration_points[PointNumber].Weight()* mDetJ0[PointNumber]; + bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes + for (unsigned int i = 0; i < 3; i++) + for (unsigned int j = 0; j < 2; j++) + original_coordinates(i, j) = rPoints(i, j); - xp=0.0; - yp=0.0; + original_coordinates(h, 0) = xp; + original_coordinates(h, 1) = yp; - for (unsigned int tt=0; tt<3; tt++) - { - xp += N[tt] * coord_subdomain_aux(tt,0); - yp += N[tt] * coord_subdomain_aux(tt,1); - } + CalculateGeometryData(original_coordinates, DN_DX_subdomainaux_1aux, temp_areaaux_2); //222 - for (unsigned int h=0; h<3; h++) //loop por los nodos del subelemento - { + PRUEBA[partition_number](PointNumber, h) = temp_areaaux_2 / Area; // * Weight; + weight(partition_number) = Weight; + } + } - bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes - for (unsigned int i = 0; i < 3; i++) - for (unsigned int j = 0; j < 2; j++) - original_coordinates(i, j) = rPoints(i, j); + double dist = 0.0; + double abs_dist = 0.0; + for (int j = 0; j < 3; j++) + { + dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; + abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; + } + if (partition_sign < 0.0) + rPartitionsSign[partition_number] = -1.0; + else + rPartitionsSign[partition_number] = 1.0; - original_coordinates(h,0) = xp; - original_coordinates(h,1) = yp; + //We use the sublement shape functions and derivatives: + //we loop the 2 enrichment shape functions: + for (int index_shape_function = 0; index_shape_function < 2; index_shape_function++) //enrichment shape function + { + if (active_node_in_enrichment_shape_function(index_shape_function) > -1) //recall some of them are inactive: + { + NEnriched(partition_number, index_shape_function + 3) = one_third; //only one gauss point. if more were to be used, it would still be simple (1/2,1/2,0);(0,1/2,1/2);(1/2,0,1/2); + for (int j = 0; j < 2; j++) //x,y,(z) + { + rGradientsValue[partition_number](index_shape_function + 3, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(index_shape_function), j); + } + } + else + { + NEnriched(partition_number, index_shape_function + 3) = 0.0; + //NEnriched(partition_number, index_shape_function +2) = 0.0; + for (int j = 0; j < 2; j++) //x,y,(z) + { + rGradientsValue[partition_number](index_shape_function + 3, j) = 0.0; + //KRATOS_WATCH(rGradientsValue); + //rGradientsValue[partition_number](index_shape_function+2, j) = 0.0; + } + } + } + array_1d replacement_shape_function_nodes = ZeroVector(3); + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + int active_node = -1; + for (int j = 0; j < 3; j++) //number_of_nodes in the subelement + if (partition_father_nodes(j, 0) == index_shape_function && partition_father_nodes(j, 1) == index_shape_function) + { + active_node = j; + break; + } + if (active_node > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + rGradientsValue[partition_number](index_shape_function, j) = DN_DX_subdomain(active_node, j); + NEnriched(partition_number, index_shape_function) = one_third; + replacement_shape_function_nodes(index_shape_function) = active_node; + } + else + { + for (int j = 0; j < 2; j++) //x,y,(z) + rGradientsValue[partition_number](index_shape_function, j) = 0.0; + replacement_shape_function_nodes(index_shape_function) = -1; + } + } - CalculateGeometryData(original_coordinates, DN_DX_subdomainaux_1aux, temp_areaaux_2);//222 + //We use the sublement shape functions and derivatives: + //we loop the 3 replacement shape functions: + unsigned int number_of_real_nodes = 0; //(each partition can have either 1 or 2); + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //enrichment shape function + { + if (active_node_in_replacement_shape_function(index_shape_function) > -1) //recall some of them are inactive: + number_of_real_nodes++; + } - PRUEBA[partition_number](PointNumber,h) = temp_areaaux_2/Area;// * Weight; - weight(partition_number)=Weight; - } + if (useful_node_for_N0star > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + { + if (partition_sign > 0) + { + //first two rows are for the side where N*1 = 1 + //row 1 is for gradN*1 + rGradientpositive(3, j) = DN_DX_subdomain(useful_node_for_N0star, j); + //row 2 is for gradN*2 + if (active_node_in_enrichment_shape_function(1) > -1) + rGradientpositive(4, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientpositive(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + else + { + rGradientnegative(3, j) = DN_DX_subdomain(useful_node_for_N0star, j); + //KRATOS_WATCH(rGradientnegative); + if (active_node_in_enrichment_shape_function(1) > -1) + rGradientnegative(4, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientnegative(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + } + } + if (useful_node_for_N1star > -1) + { + for (int j = 0; j < 2; j++) //x,y,(z) + { + if (partition_sign > 0) + { + //rows 3 and 4 are for the side where N*2 = 1 + //row 4 is for gradN*2 + rGradientpositive(9, j) = DN_DX_subdomain(useful_node_for_N1star, j); + //row 3 is for gradN*1 + if (active_node_in_enrichment_shape_function(0) > -1) + rGradientpositive(8, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); + //KRATOS_WATCH(rGradientpositive); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientpositive(index_shape_function + 5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + else + { + rGradientnegative(9, j) = DN_DX_subdomain(useful_node_for_N1star, j); + if (active_node_in_enrichment_shape_function(0) > -1) + rGradientnegative(8, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); + //KRATOS_WATCH(rGradientnegative); + + for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function + { + if (replacement_shape_function_nodes(index_shape_function) > -1) + { + rGradientnegative(index_shape_function + 5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + } + } + } + } + } - } + partition_number++; + } + else + found_empty_partition = true; + } + if (found_empty_partition == false) + KRATOS_WATCH("WROOOONGGGGGGGGGGG"); - double dist = 0.0; - double abs_dist = 0.0; - for (int j = 0; j < 3; j++) - { - dist += rGPShapeFunctionValues(partition_number, j) * exact_distance[j]; - abs_dist += rGPShapeFunctionValues(partition_number, j) * abs_distance[j]; + return 3; + KRATOS_CATCH(""); } - if (partition_sign < 0.0) - rPartitionsSign[partition_number] = -1.0; - else - rPartitionsSign[partition_number] = 1.0; - - //We use the sublement shape functions and derivatives: - //we loop the 2 enrichment shape functions: - for (int index_shape_function = 0; index_shape_function < 2; index_shape_function++) //enrichment shape function + //for 3D + static int CalculateEnrichedShapeFuncions_Simplified(Geometry> &rGeom, BoundedMatrix &rPoints, BoundedMatrix &DN_DX, array_1d &rDistances, array_1d &rVolumes, BoundedMatrix &rShapeFunctionValues, array_1d &rPartitionsSign, std::vector &rGradientsValue, std::vector &rGradientsValueaux, BoundedMatrix &NEnriched, int &number_interface_elements, BoundedMatrix &coord_interface_nodes, array_1d &area_interface, array_1d &area_inter, array_1d &N_Star, bool &switch_off_e, std::vector &edges_t, std::vector &nodes, std::vector &original_edges, std::vector &rGradientaux1, int &totalnodes, std::vector &interface_nodes, BoundedMatrix &Ngauss_new, std::vector &Tres, std::vector &PRUEBA, array_1d &weight) { - if (active_node_in_enrichment_shape_function(index_shape_function) > -1) //recall some of them are inactive: - { - NEnriched(partition_number, index_shape_function+3 ) = one_third ; //only one gauss point. if more were to be used, it would still be simple (1/2,1/2,0);(0,1/2,1/2);(1/2,0,1/2); - for (int j = 0; j < 2; j++) //x,y,(z) + KRATOS_TRY + + const int n_nodes = 4; // it works only for tetrahedra + const int n_edges = 6; // it works only for tetrahedra + bool switch_off_ee = false; + const int edge_i[] = {0, 0, 0, 1, 1, 2}; + const int edge_j[] = {1, 2, 3, 2, 3, 3}; + //int z=0; + //int n=0; + std::vector edges_o(8); + + for (unsigned int i = 0; i < 8; i++) { - rGradientsValue[partition_number](index_shape_function+3, j) = DN_DX_subdomain(active_node_in_enrichment_shape_function(index_shape_function),j); + edges_o[i].resize(5, 3, false); //2 values of the 2 shape functions, and derivates in (xyz) direction). } - } - else - { - NEnriched(partition_number, index_shape_function+3 ) = 0.0; - //NEnriched(partition_number, index_shape_function +2) = 0.0; - for (int j = 0; j < 2; j++) //x,y,(z) + const double epsilon = 1e-15; //1.00e-9; + const double near_factor = 1.00e-12; + + bounded_matrix coord_node = ZeroMatrix(4, 3); + + int number_of_partitions = 1; + for (unsigned int i = 0; i < 8; i++) //// 5 + for (unsigned int j = 0; j < 5; j++) + for (unsigned int k = 0; k < 3; k++) + edges_t[i](j, k) = -1.0; + + for (unsigned int i = 0; i < 8; i++) //// 5 + for (unsigned int j = 0; j < 5; j++) + for (unsigned int k = 0; k < 3; k++) + original_edges[i](j, k) = -1.0; + + for (unsigned int i = 0; i < 6; i++) //4 + for (unsigned int j = 0; j < 8; j++) + for (unsigned int k = 0; k < 3; k++) + rGradientaux1[i](j, k) = 0.0; + + array_1d edges_dx; // It will be initialize later + array_1d edges_dy; // It will be initialize later + array_1d edges_dz; // It will be initialize later + array_1d edges_length; // It will be initialize later + // The divided part length from first node of edge respect to the edge length + array_1d edge_division_i = ZeroVector(n_edges); // The 0 is for no split + // The divided part length from second node of edge respect to the edge length + array_1d edge_division_j = ZeroVector(n_edges); // The 0 is for no split + + bounded_matrix aux_coordinates; //8 is the max number of nodes and aux_nodes + for (unsigned int i = 0; i < 4; i++) + for (unsigned int j = 0; j < 3; j++) + aux_coordinates(i, j) = rPoints(i, j); + for (unsigned int i = 4; i < 8; i++) + for (unsigned int j = 0; j < 3; j++) + aux_coordinates(i, j) = -10000.0; //set to a large number so that errors will be evident + + int split_edge[] = {0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1}; + int new_node_id = 4; + bounded_matrix length = ZeroMatrix(4, 4); + + //int n_zero_distance_nodes = 0; + int n_negative_distance_nodes = 0; + int n_positive_distance_nodes = 0; + array_1d signs(4, -2); //[] = {-2, -2, -2, -2}; + //int zero_distance_nodes[] = {-1, -1, -1, -1}; + array_1d negative_distance_nodes(4, -1); //[] = {-1, -1, -1, -1}; + array_1d positive_distance_nodes(4, -1); //[] = {-1, -1, -1, -1}; + + for (int i = 0; i < 6; i++) + for (int j = 0; j < n_nodes; j++) + rShapeFunctionValues(i, j) = 0.25; + + for (int i = 0; i < 6; i++) + for (int j = 0; j < 8; j++) + Ngauss_new(i, j) = 0.0; + //compute the gradient of the distance and normalize it + array_1d grad_d; + noalias(grad_d) = prod(trans(DN_DX), rDistances); + double norm = norm_2(grad_d); + if (norm > epsilon) + grad_d /= (norm); + + array_1d exact_distance = rDistances; + array_1d abs_distance = ZeroVector(n_nodes); + double sub_volumes_sum = 0.00; + + //compute edge lenghts and max_lenght + double max_lenght = 0.0; + for (int edge = 0; edge < n_edges; edge++) { - rGradientsValue[partition_number](index_shape_function+3, j) = 0.0; - //KRATOS_WATCH(rGradientsValue); - //rGradientsValue[partition_number](index_shape_function+2, j) = 0.0; - } - } + const int i = edge_i[edge]; + const int j = edge_j[edge]; - } + double dx = rPoints(j, 0) - rPoints(i, 0); + double dy = rPoints(j, 1) - rPoints(i, 1); + double dz = rPoints(j, 2) - rPoints(i, 2); - array_1d replacement_shape_function_nodes = ZeroVector(3); - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - int active_node=-1; - for (int j = 0; j < 3; j++) //number_of_nodes in the subelement - if (partition_father_nodes(j,0)==index_shape_function && partition_father_nodes(j,1)==index_shape_function) - { - active_node=j; - break; - } - if(active_node> -1) - { - for (int j = 0; j < 2; j++) //x,y,(z) - rGradientsValue[partition_number](index_shape_function, j) = DN_DX_subdomain(active_node,j); - NEnriched(partition_number, index_shape_function ) = one_third; - replacement_shape_function_nodes(index_shape_function) = active_node; - } - else - { - for (int j = 0; j < 2; j++) //x,y,(z) - rGradientsValue[partition_number](index_shape_function, j) = 0.0; - replacement_shape_function_nodes(index_shape_function) = -1; - } - } + double l = sqrt(dx * dx + dy * dy + dz * dz); - //We use the sublement shape functions and derivatives: - //we loop the 3 replacement shape functions: - unsigned int number_of_real_nodes=0; //(each partition can have either 1 or 2); - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //enrichment shape function - { - if (active_node_in_replacement_shape_function(index_shape_function) > -1) //recall some of them are inactive: - number_of_real_nodes++; - } + edges_dx[edge] = dx; + edges_dy[edge] = dy; + edges_dz[edge] = dz; + edges_length[edge] = l; - if(useful_node_for_N0star > -1) - { - for (int j = 0; j < 2; j++) //x,y,(z) - { - if(partition_sign>0) + if (l > max_lenght) + max_lenght = l; + } + + double relatively_close = near_factor * max_lenght; + array_1d collapsed_node; + //identify collapsed nodes + for (unsigned int i = 0; i < 4; i++) { - //first two rows are for the side where N*1 = 1 - //row 1 is for gradN*1 - rGradientpositive(3, j)=DN_DX_subdomain(useful_node_for_N0star, j); - //row 2 is for gradN*2 - if (active_node_in_enrichment_shape_function(1) > -1) - rGradientpositive(4, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + if (fabs(rDistances[i]) < relatively_close) { - rGradientpositive(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + collapsed_node[i] = true; + rDistances[i] = 0.0; + // KRATOS_WATCH("********************************!!!!!!!!!!!!!!!!!!!!!!!!!!!! collapsed node") } - } + else + collapsed_node[i] = false; + + abs_distance[i] = fabs(rDistances[i]); } - else + + //now decide splitting pattern + for (int edge = 0; edge < n_edges; edge++) { - rGradientnegative(3, j) =DN_DX_subdomain(useful_node_for_N0star, j); - //KRATOS_WATCH(rGradientnegative); - if (active_node_in_enrichment_shape_function(1) > -1) - rGradientnegative(4, j) =DN_DX_subdomain(active_node_in_enrichment_shape_function(1), j); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + const int i = edge_i[edge]; + const int j = edge_j[edge]; + if (rDistances[i] * rDistances[j] < 0.0) { - rGradientnegative(index_shape_function, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); + + if (collapsed_node[i] == false && collapsed_node[j] == false) + { + split_edge[edge + 4] = new_node_id; + edge_division_i[edge] = tmp; + edge_division_j[edge] = 1.00 - tmp; + + //compute the position of the edge node + for (unsigned int k = 0; k < 3; k++) + aux_coordinates(new_node_id, k) = rPoints(i, k) * edge_division_j[edge] + rPoints(j, k) * edge_division_i[edge]; + + new_node_id++; + } } - } } - } - } - if(useful_node_for_N1star > -1) - { - for (int j = 0; j < 2; j++) //x,y,(z) - { - if(partition_sign>0) + totalnodes = new_node_id; + for (int aux = 0; aux < 4; aux++) { - //rows 3 and 4 are for the side where N*2 = 1 - //row 4 is for gradN*2 - rGradientpositive(9, j)=DN_DX_subdomain(useful_node_for_N1star, j); - //row 3 is for gradN*1 - if (active_node_in_enrichment_shape_function(0) > -1) - rGradientpositive(8, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); - //KRATOS_WATCH(rGradientpositive); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + nodes[aux](0, 0) = rPoints(aux, 0); + nodes[aux](0, 1) = rPoints(aux, 1); + nodes[aux](0, 2) = rPoints(aux, 2); + } + + for (int aux = 4; aux < new_node_id; aux++) + { + nodes[aux](0, 0) = aux_coordinates(aux, 0); + nodes[aux](0, 1) = aux_coordinates(aux, 1); + nodes[aux](0, 2) = aux_coordinates(aux, 2); + } + + //compute the abs exact distance for all of the nodes + if (new_node_id > 4) //at least one edge is cut + { + array_1d base_point; + base_point[0] = aux_coordinates(4, 0); + base_point[1] = aux_coordinates(4, 1); + base_point[2] = aux_coordinates(4, 2); + + for (int i_node = 0; i_node < n_nodes; i_node++) { - rGradientpositive(index_shape_function+5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + double d = (rPoints(i_node, 0) - base_point[0]) * grad_d[0] + + (rPoints(i_node, 1) - base_point[1]) * grad_d[1] + + (rPoints(i_node, 2) - base_point[2]) * grad_d[2]; + abs_distance[i_node] = fabs(d); } - } } - else + + for (int i_node = 0; i_node < n_nodes; i_node++) { - rGradientnegative(9, j)=DN_DX_subdomain(useful_node_for_N1star, j); - if(active_node_in_enrichment_shape_function(0) > -1) - rGradientnegative(8, j)=DN_DX_subdomain(active_node_in_enrichment_shape_function(0), j); - //KRATOS_WATCH(rGradientnegative); - - for (int index_shape_function = 0; index_shape_function < 3; index_shape_function++) //replacement shape function - { - if(replacement_shape_function_nodes(index_shape_function)>-1) + if (rDistances[i_node] < 0.00) + { + signs[i_node] = -1; + negative_distance_nodes[n_negative_distance_nodes++] = i_node; + } + else { - rGradientnegative(index_shape_function+5, j) = DN_DX_subdomain(replacement_shape_function_nodes(index_shape_function), j); + signs[i_node] = 1; + positive_distance_nodes[n_positive_distance_nodes++] = i_node; } - } } - } - } - - partition_number++; - - } - else - found_empty_partition=true; - } - if (found_empty_partition==false) - KRATOS_WATCH("WROOOONGGGGGGGGGGG"); - - return 3; - KRATOS_CATCH(""); - - } - - //for 3D - static int CalculateEnrichedShapeFuncions_Simplified(Geometry< Node<3> >& rGeom,BoundedMatrix& rPoints, BoundedMatrix& DN_DX, array_1d& rDistances, array_1d& rVolumes, BoundedMatrix& rShapeFunctionValues,array_1d& rPartitionsSign, std::vector& rGradientsValue, std::vector& rGradientsValueaux, BoundedMatrix& NEnriched,int& number_interface_elements,BoundedMatrix& coord_interface_nodes, array_1d& area_interface, array_1d& area_inter, array_1d& N_Star, bool& switch_off_e, std::vector& edges_t,std::vector& nodes,std::vector& original_edges, std::vector& rGradientaux1, int& totalnodes, std::vector& interface_nodes, BoundedMatrix& Ngauss_new, std::vector& Tres, std::vector& PRUEBA, array_1d& weight) - { - KRATOS_TRY - - const int n_nodes = 4; // it works only for tetrahedra - const int n_edges = 6; // it works only for tetrahedra - bool switch_off_ee=false; - const int edge_i[] = {0, 0, 0, 1, 1, 2}; - const int edge_j[] = {1, 2, 3, 2, 3, 3}; - //int z=0; - //int n=0; - std::vector< Matrix > edges_o(8); - - for (unsigned int i = 0; i < 8; i++) - { - edges_o[i].resize(5, 3, false); //2 values of the 2 shape functions, and derivates in (xyz) direction). - } - - const double epsilon = 1e-15; //1.00e-9; - const double near_factor = 1.00e-12; - - bounded_matrix coord_node=ZeroMatrix(4,3); - - int number_of_partitions = 1; - for (unsigned int i = 0; i < 8; i++) //// 5 - for (unsigned int j = 0; j < 5; j++) - for (unsigned int k = 0; k < 3; k++) - edges_t[i](j,k) =-1.0; - - for (unsigned int i = 0; i < 8; i++) //// 5 - for (unsigned int j = 0; j < 5; j++) - for (unsigned int k = 0; k < 3; k++) - original_edges[i](j,k) =-1.0; - - for (unsigned int i = 0; i < 6; i++) //4 - for (unsigned int j = 0; j < 8; j++) - for (unsigned int k = 0; k < 3; k++) - rGradientaux1[i](j,k) =0.0; - - array_1d edges_dx; // It will be initialize later - array_1d edges_dy; // It will be initialize later - array_1d edges_dz; // It will be initialize later - array_1d edges_length; // It will be initialize later - // The divided part length from first node of edge respect to the edge length - array_1d edge_division_i = ZeroVector(n_edges); // The 0 is for no split - // The divided part length from second node of edge respect to the edge length - array_1d edge_division_j = ZeroVector(n_edges); // The 0 is for no split - - bounded_matrix aux_coordinates; //8 is the max number of nodes and aux_nodes - for (unsigned int i = 0; i < 4; i++) - for (unsigned int j = 0; j < 3; j++) - aux_coordinates(i, j) = rPoints(i, j); - for (unsigned int i = 4; i < 8; i++) - for (unsigned int j = 0; j < 3; j++) - aux_coordinates(i, j) = -10000.0; //set to a large number so that errors will be evident - - int split_edge[] = {0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1}; - int new_node_id = 4; - bounded_matrix length = ZeroMatrix(4, 4); - - //int n_zero_distance_nodes = 0; - int n_negative_distance_nodes = 0; - int n_positive_distance_nodes = 0; - array_1d signs(4,-2);//[] = {-2, -2, -2, -2}; - //int zero_distance_nodes[] = {-1, -1, -1, -1}; - array_1d negative_distance_nodes(4,-1);//[] = {-1, -1, -1, -1}; - array_1d positive_distance_nodes(4,-1);//[] = {-1, -1, -1, -1}; - - for (int i = 0; i < 6; i++) - for (int j = 0; j < n_nodes; j++) - rShapeFunctionValues(i, j) = 0.25; - - for (int i = 0; i < 6; i++) - for (int j = 0; j < 8; j++) - Ngauss_new(i, j) = 0.0; - //compute the gradient of the distance and normalize it - array_1d grad_d; - noalias(grad_d) = prod(trans(DN_DX), rDistances); - double norm = norm_2(grad_d); - if (norm > epsilon) - grad_d /= (norm); - - array_1d exact_distance = rDistances; - array_1d abs_distance = ZeroVector(n_nodes); - double sub_volumes_sum = 0.00; - - //compute edge lenghts and max_lenght - double max_lenght = 0.0; - for (int edge = 0; edge < n_edges; edge++) - { - const int i = edge_i[edge]; - const int j = edge_j[edge]; - - double dx = rPoints(j, 0) - rPoints(i, 0); - double dy = rPoints(j, 1) - rPoints(i, 1); - double dz = rPoints(j, 2) - rPoints(i, 2); - - double l = sqrt(dx * dx + dy * dy + dz * dz); - - edges_dx[edge] = dx; - edges_dy[edge] = dy; - edges_dz[edge] = dz; - edges_length[edge] = l; - - if(l > max_lenght) - max_lenght = l; - } - - double relatively_close = near_factor*max_lenght; - array_1d collapsed_node; - //identify collapsed nodes - for (unsigned int i=0; i<4; i++) - { - if(fabs(rDistances[i]) < relatively_close) - { - collapsed_node[i] = true; - rDistances[i] = 0.0; - // KRATOS_WATCH("********************************!!!!!!!!!!!!!!!!!!!!!!!!!!!! collapsed node") - } - else - collapsed_node[i] = false; - - abs_distance[i] = fabs(rDistances[i]); - } - - //now decide splitting pattern - for (int edge = 0; edge < n_edges; edge++) - { - const int i = edge_i[edge]; - const int j = edge_j[edge]; - if (rDistances[i] * rDistances[j] < 0.0) - { - const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); - - if (collapsed_node[i] == false && collapsed_node[j] == false) - { - split_edge[edge + 4] = new_node_id; - edge_division_i[edge] = tmp; - edge_division_j[edge] = 1.00 - tmp; - - //compute the position of the edge node - for (unsigned int k = 0; k < 3; k++) - aux_coordinates(new_node_id, k) = rPoints(i, k) * edge_division_j[edge] + rPoints(j, k) * edge_division_i[edge]; - - new_node_id++; - } - } - } - totalnodes=new_node_id; - for(int aux = 0; aux < 4; aux++) - { - nodes[aux](0,0)=rPoints(aux, 0); - nodes[aux](0,1)=rPoints(aux, 1); - nodes[aux](0,2)=rPoints(aux, 2); - - } - - for(int aux = 4; aux < new_node_id; aux++) - { - nodes[aux](0,0)=aux_coordinates(aux, 0); - nodes[aux](0,1)=aux_coordinates(aux, 1); - nodes[aux](0,2)=aux_coordinates(aux, 2); - - } - - //compute the abs exact distance for all of the nodes - if(new_node_id > 4) //at least one edge is cut - { - array_1d base_point; - base_point[0] = aux_coordinates(4,0); - base_point[1] = aux_coordinates(4,1); - base_point[2] = aux_coordinates(4,2); - - - for (int i_node = 0; i_node < n_nodes; i_node++) - { - double d = (rPoints(i_node,0) - base_point[0]) * grad_d[0] + - (rPoints(i_node,1) - base_point[1]) * grad_d[1] + - (rPoints(i_node,2) - base_point[2]) * grad_d[2] ; - abs_distance[i_node] = fabs(d); - } - - } - - - for (int i_node = 0; i_node < n_nodes; i_node++) - { - if (rDistances[i_node] < 0.00) - { - signs[i_node] = -1; - negative_distance_nodes[n_negative_distance_nodes++] = i_node; - } - else - { - signs[i_node] = 1; - positive_distance_nodes[n_positive_distance_nodes++] = i_node; - } - } - - //assign correct sign to exact distance - for (int i = 0; i < n_nodes; i++) - { - if (rDistances[i] < 0.0) - exact_distance[i] = -abs_distance[i]; - else - exact_distance[i] = abs_distance[i]; - } - - //compute exact distance gradients - array_1d exact_distance_gradient; - noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - - array_1d abs_distance_gradient; - noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - - int number_of_splitted_edges = new_node_id - 4; //number of splitted edges - - double volume = edges_dx[0] * edges_dy[1] * edges_dz[2] - - edges_dx[0] * edges_dz[1] * edges_dy[2] + - edges_dy[0] * edges_dz[1] * edges_dx[2] - - edges_dy[0] * edges_dx[1] * edges_dz[2] + - edges_dz[0] * edges_dx[1] * edges_dy[2] - - edges_dz[0] * edges_dy[1] * edges_dx[2]; - - const double one_sixth = 1.00 / 6.00; - volume *= one_sixth; - - if (number_of_splitted_edges == 0) // no splitting - { - - rVolumes[0] = volume; - sub_volumes_sum = volume; - //take the sign from the node with min distance - double min_distance = 1e9; - for (int j = 0; j < 4; j++) - if(exact_distance[j] < min_distance) min_distance = exact_distance[j]; - - if(min_distance < 0.0) - rPartitionsSign[0] = -1.0; - else - rPartitionsSign[0] = 1.0; - - number_of_partitions = 1; - - for (int j = 0; j < 4; j++) - rShapeFunctionValues(0, j) = 0.25; - - for (int j = 0; j < number_of_partitions; j++) - NEnriched(j, 0) = 0.0; - - rGradientsValue[0] = ZeroMatrix(1,3); - } - else //if (number_of_splitted_edges == 4) - { - //define the splitting mode for the tetrahedra - int edge_ids[6]; - TetrahedraSplit::TetrahedraSplitMode(split_edge, edge_ids); - int nel; //number of elements generated - int n_splitted_edges; //number of splitted edges - int nint; //number of internal nodes - int t[56]; - TetrahedraSplit::Split_Tetrahedra(edge_ids, t, &nel, &n_splitted_edges, &nint); - - if (nint != 0) - KRATOS_ERROR<<"requiring an internal node for splitting ... can not accept this"; - - //now obtain the tetras and compute their center coordinates and volume - array_1d center_position; - for (int i = 0; i < nel; i++) - { - int i0, i1, i2, i3; //indices of the subtetrahedra - TetrahedraSplit::TetrahedraGetNewConnectivityGID(i, t, split_edge, &i0, &i1, &i2, &i3); - - double sub_volume = ComputeSubTetraVolumeAndCenter(aux_coordinates, center_position, i0, i1, i2, i3); - - rVolumes[i] = sub_volume; - - sub_volumes_sum += sub_volume; - - array_1d N; - ComputeElementCoordinates(N, center_position, rPoints, volume); - for (int j = 0; j < 4; j++) - rShapeFunctionValues(i, j) = N[j]; - - } - number_of_partitions = nel; - } - - BoundedMatrix DN_DX_subdomainaux1; //used to retrieve derivatives - BoundedMatrix coord_subdomainaux1; - double temp_areaaux1=0.0; - - - CalculateGeometryData(rPoints, DN_DX_subdomainaux1, temp_areaaux1);//222 - - if (number_of_partitions > 1) // we won't calculate the N and its gradients for element without partitions - { - //compute the maximum absolute distance on the cut so to normalize the shape functions - //now decide splitting pattern - double max_aux_dist_on_cut = -1; - for (int edge = 0; edge < n_edges; edge++) - { - const int i = edge_i[edge]; - const int j = edge_j[edge]; - if (rDistances[i] * rDistances[j] < 0.0) - { - const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); - - //compute the position of the edge node - double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); - - if(abs_dist_on_cut > max_aux_dist_on_cut) max_aux_dist_on_cut = abs_dist_on_cut; - } - } - - if(max_aux_dist_on_cut < 1e-9*max_lenght) - max_aux_dist_on_cut = 1e-9*max_lenght; - - int edge_ids[6]; - TetrahedraSplit::TetrahedraSplitMode(split_edge, edge_ids); - int nel; //number of elements generated - int n_splitted_edges; //number of splitted edges - int nint; //number of internal nodes - int t[56]; - TetrahedraSplit::Split_Tetrahedra(edge_ids, t, &nel, &n_splitted_edges, &nint); - - if (nint != 0) - KRATOS_ERROR<<"requiring an internal node for splitting ... can not accept this"; - coord_node=ZeroMatrix(2,3); - coord_interface_nodes=ZeroMatrix(2,3); - - array_1d center_position; - N_Star= ZeroVector(6); - - area_interface= ZeroVector(6); - area_inter=ZeroVector(6); - - BoundedMatrix DN_DX_subdomainaux; //used to retrieve derivatives - BoundedMatrix DN_DX_subdomainaux_1; //used to retrieve derivatives - BoundedMatrix DN_DX_subdomainaux_1aux; //used to retrieve derivatives - BoundedMatrix coord_subdomainaux; - BoundedMatrix coord_subdomainaux_aux; - double temp_areaaux=0.0; - int local=0; - - for (unsigned int i = 0; i < 6; i++) - { - PRUEBA[i].resize(4, 4, false); - PRUEBA[i] *=0.0; - } - - for (unsigned int i = 0; i < 6; i++) - { - Tres[i] *=0.0; - } - - array_1d N; - bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes - for (unsigned int i = 0; i < 4; i++) - for (unsigned int j = 0; j < 3; j++) - original_coordinates(i, j) = rPoints(i, j); - - ///para el elemento global - double temp_areaaux_1=0.0; - CalculateGeometryData(rPoints, DN_DX_subdomainaux_1aux, temp_areaaux_1);//222 - - - for (int i = 0; i < number_of_partitions; i++) - { - //compute enriched shape function values - - int i0, i1, i2, i3; //indices of the subtetrahedra - TetrahedraSplit::TetrahedraGetNewConnectivityGID(i, t, split_edge, &i0, &i1, &i2, &i3); - - BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives - BoundedMatrix coord_xg; //use - - coord_xg=ZeroMatrix(4,3); - - array_1d partition_nodes; - //double temp_area; - partition_nodes[0]=i0; - partition_nodes[1]=i1; - partition_nodes[2]=i2; - partition_nodes[3]=i3; - //double interface_area=0.0; - - int nummm=0; - for (unsigned int j=0; j!=4; j++) - {//4 nodes of the partition - const int node_id=partition_nodes[j]; - if(node_id>3){ - nummm++; - } - } - - std::vector > PointsOfFSTriangle; - PointsOfFSTriangle.reserve(3); - - //int position=0; - - for (unsigned int j=0; j!=4; j++) - { - for (unsigned int k=0; k!=3; k++) {//x,y,z - const int node_id=partition_nodes[j]; - coord_subdomainaux(j,k)= aux_coordinates( node_id ,k ); - } - } - - - for (unsigned int i = 0; i < 3; i++) - { - center_position[i] = aux_coordinates(0, i) + aux_coordinates(1, i) + aux_coordinates(2, i) + aux_coordinates(3, i); - } - center_position *= 0.25; - - CalculateGeometryData(coord_subdomainaux, DN_DX_subdomainaux, temp_areaaux);//222 - - typedef GeometryData::IntegrationMethod IntegrationMethod; - IntegrationMethod mThisIntegrationMethod; - std::vector< Matrix > mInvJ0; - Vector mDetJ0; - array_1d msN; BoundedMatrix msDN_DX; @@ -1946,542 +1706,780 @@ namespace Kratos double yp=0.0; double zp=0.0; - double temp_areaaux_2=0.0; - bounded_matrix N_new=ZeroMatrix(4,8); + //compute exact distance gradients + array_1d exact_distance_gradient; + noalias(exact_distance_gradient) = prod(trans(DN_DX), exact_distance); - for(unsigned int PointNumber = 0; PointNumberPointsNumber(); - //unsigned int dimension = pGeom->WorkingSpaceDimension(); - const Vector& N=row(Ncontainer,PointNumber); + array_1d abs_distance_gradient; + noalias(abs_distance_gradient) = prod(trans(DN_DX), abs_distance); - MathUtils::InvertMatrix(J0[PointNumber],mInvJ0[PointNumber],mDetJ0[PointNumber]); - double Weight = integration_points[PointNumber].Weight()* mDetJ0[PointNumber]; + int number_of_splitted_edges = new_node_id - 4; //number of splitted edges - xp=0.0; - yp=0.0; - zp=0.0; + double volume = edges_dx[0] * edges_dy[1] * edges_dz[2] - + edges_dx[0] * edges_dz[1] * edges_dy[2] + + edges_dy[0] * edges_dz[1] * edges_dx[2] - + edges_dy[0] * edges_dx[1] * edges_dz[2] + + edges_dz[0] * edges_dx[1] * edges_dy[2] - + edges_dz[0] * edges_dy[1] * edges_dx[2]; - for (unsigned int tt=0; tt!=4; tt++) - { - xp += N[tt] * coord_subdomainaux(tt,0); - yp += N[tt] * coord_subdomainaux(tt,1); - zp += N[tt] * coord_subdomainaux(tt,2); - } + const double one_sixth = 1.00 / 6.00; + volume *= one_sixth; - for (unsigned int j=0; j!=4; j++) //loop por los nodos del subelemento - { - bounded_matrix aux_coordinates_aux; - aux_coordinates_aux=aux_coordinates; + if (number_of_splitted_edges == 0) // no splitting + { - bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes - for (unsigned int i = 0; i < 4; i++) - for (unsigned int j = 0; j < 3; j++) - original_coordinates(i, j) = rPoints(i, j); + rVolumes[0] = volume; + sub_volumes_sum = volume; + //take the sign from the node with min distance + double min_distance = 1e9; + for (int j = 0; j < 4; j++) + if (exact_distance[j] < min_distance) + min_distance = exact_distance[j]; + if (min_distance < 0.0) + rPartitionsSign[0] = -1.0; + else + rPartitionsSign[0] = 1.0; - const int node_idaux=partition_nodes[j]; + number_of_partitions = 1; - aux_coordinates_aux(node_idaux,0)=xp; - aux_coordinates_aux(node_idaux,1)=yp; - aux_coordinates_aux(node_idaux,2)=zp; + for (int j = 0; j < 4; j++) + rShapeFunctionValues(0, j) = 0.25; - original_coordinates(j,0) = xp; - original_coordinates(j,1) = yp; - original_coordinates(j,2) = zp; + for (int j = 0; j < number_of_partitions; j++) + NEnriched(j, 0) = 0.0; - for (unsigned int jj=0; jj!=4; jj++) - { - for (unsigned int k=0; k!=3; k++) - {//x,y,z - const int node_id=partition_nodes[jj]; - coord_subdomainaux_aux(jj,k)= aux_coordinates_aux( node_id ,k ); - } + rGradientsValue[0] = ZeroMatrix(1, 3); } + else //if (number_of_splitted_edges == 4) + { + //define the splitting mode for the tetrahedra + int edge_ids[6]; + TetrahedraSplit::TetrahedraSplitMode(split_edge, edge_ids); + int nel; //number of elements generated + int n_splitted_edges; //number of splitted edges + int nint; //number of internal nodes + int t[56]; + TetrahedraSplit::Split_Tetrahedra(edge_ids, t, &nel, &n_splitted_edges, &nint); + + if (nint != 0) + KRATOS_ERROR << "requiring an internal node for splitting ... can not accept this"; + + //now obtain the tetras and compute their center coordinates and volume + array_1d center_position; + for (int i = 0; i < nel; i++) + { + int i0, i1, i2, i3; //indices of the subtetrahedra + TetrahedraSplit::TetrahedraGetNewConnectivityGID(i, t, split_edge, &i0, &i1, &i2, &i3); - ///para las coordenadas globales - CalculateGeometryData(original_coordinates, DN_DX_subdomainaux_1aux, temp_areaaux_2);//222 - - PRUEBA[i](PointNumber,j) = temp_areaaux_2/temp_areaaux_1; - weight(i)=Weight; - - } + double sub_volume = ComputeSubTetraVolumeAndCenter(aux_coordinates, center_position, i0, i1, i2, i3); - //int id_local_aux1=0; - //int id_local_aux2=0; + rVolumes[i] = sub_volume; - } + sub_volumes_sum += sub_volume; + array_1d N; + ComputeElementCoordinates(N, center_position, rPoints, volume); + for (int j = 0; j < 4; j++) + rShapeFunctionValues(i, j) = N[j]; + } + number_of_partitions = nel; + } + BoundedMatrix DN_DX_subdomainaux1; //used to retrieve derivatives + BoundedMatrix coord_subdomainaux1; + double temp_areaaux1 = 0.0; - bounded_matrix edges=ZeroMatrix(4,3); - bounded_matrix edged_enriched= ZeroMatrix(4,3); + CalculateGeometryData(rPoints, DN_DX_subdomainaux1, temp_areaaux1); //222 - array_1d edgeone; - array_1d edgetwo; - array_1d edgetriangle; - array_1d active_node_in_enrichment_shape_function; - active_node_in_enrichment_shape_function(0)=-1; active_node_in_enrichment_shape_function(1)=-1; - array_1d active_node_in_replacement_shape_function; - active_node_in_replacement_shape_function(0)=-1; active_node_in_replacement_shape_function(1)=-1; + if (number_of_partitions > 1) // we won't calculate the N and its gradients for element without partitions + { + //compute the maximum absolute distance on the cut so to normalize the shape functions + //now decide splitting pattern + double max_aux_dist_on_cut = -1; + for (int edge = 0; edge < n_edges; edge++) + { + const int i = edge_i[edge]; + const int j = edge_j[edge]; + if (rDistances[i] * rDistances[j] < 0.0) + { + const double tmp = fabs(rDistances[i]) / (fabs(rDistances[i]) + fabs(rDistances[j])); + //compute the position of the edge node + double abs_dist_on_cut = abs_distance[i] * tmp + abs_distance[j] * (1.00 - tmp); - edges(0,0)=partition_nodes[0]; - edges(0,1)=partition_nodes[2]; - edges(0,2)=partition_nodes[1]; + if (abs_dist_on_cut > max_aux_dist_on_cut) + max_aux_dist_on_cut = abs_dist_on_cut; + } + } - edges(1,0)=partition_nodes[0]; - edges(1,1)=partition_nodes[3]; - edges(1,2)=partition_nodes[2]; + if (max_aux_dist_on_cut < 1e-9 * max_lenght) + max_aux_dist_on_cut = 1e-9 * max_lenght; + + int edge_ids[6]; + TetrahedraSplit::TetrahedraSplitMode(split_edge, edge_ids); + int nel; //number of elements generated + int n_splitted_edges; //number of splitted edges + int nint; //number of internal nodes + int t[56]; + TetrahedraSplit::Split_Tetrahedra(edge_ids, t, &nel, &n_splitted_edges, &nint); + + if (nint != 0) + KRATOS_ERROR << "requiring an internal node for splitting ... can not accept this"; + coord_node = ZeroMatrix(2, 3); + coord_interface_nodes = ZeroMatrix(2, 3); + + array_1d center_position; + N_Star = ZeroVector(6); + + area_interface = ZeroVector(6); + area_inter = ZeroVector(6); + + BoundedMatrix DN_DX_subdomainaux; //used to retrieve derivatives + BoundedMatrix DN_DX_subdomainaux_1; //used to retrieve derivatives + BoundedMatrix DN_DX_subdomainaux_1aux; //used to retrieve derivatives + BoundedMatrix coord_subdomainaux; + BoundedMatrix coord_subdomainaux_aux; + double temp_areaaux = 0.0; + int local = 0; + + for (unsigned int i = 0; i < 6; i++) + { + PRUEBA[i].resize(4, 4, false); + PRUEBA[i] *= 0.0; + } - edges(2,0)=partition_nodes[0]; - edges(2,1)=partition_nodes[1]; - edges(2,2)=partition_nodes[3]; + for (unsigned int i = 0; i < 6; i++) + { + Tres[i] *= 0.0; + } - edges(3,0)=partition_nodes[2]; - edges(3,1)=partition_nodes[3]; - edges(3,2)=partition_nodes[1]; + array_1d N; + bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes + for (unsigned int i = 0; i < 4; i++) + for (unsigned int j = 0; j < 3; j++) + original_coordinates(i, j) = rPoints(i, j); + ///para el elemento global + double temp_areaaux_1 = 0.0; + CalculateGeometryData(rPoints, DN_DX_subdomainaux_1aux, temp_areaaux_1); //222 - int shape_function_id=0; - int shape_function_aux_id=0; - for(int i_aux=0; i_aux<4;i_aux++) - { - shape_function_id=0; - shape_function_aux_id=0; - active_node_in_enrichment_shape_function(0)=-1; active_node_in_enrichment_shape_function(1)=-1; + for (int i = 0; i < number_of_partitions; i++) + { + //compute enriched shape function values + + int i0, i1, i2, i3; //indices of the subtetrahedra + TetrahedraSplit::TetrahedraGetNewConnectivityGID(i, t, split_edge, &i0, &i1, &i2, &i3); + + BoundedMatrix coord_subdomain; //used to pass arguments when we must calculate areas, shape functions, etc BoundedMatrix DN_DX_subdomain; //used to retrieve derivatives + BoundedMatrix coord_xg; //use + + coord_xg = ZeroMatrix(4, 3); + + array_1d partition_nodes; + //double temp_area; + partition_nodes[0] = i0; + partition_nodes[1] = i1; + partition_nodes[2] = i2; + partition_nodes[3] = i3; + //double interface_area=0.0; + + int nummm = 0; + for (unsigned int j = 0; j != 4; j++) + { //4 nodes of the partition + const int node_id = partition_nodes[j]; + if (node_id > 3) + { + nummm++; + } + } - active_node_in_replacement_shape_function(0)=-1; active_node_in_replacement_shape_function(1)=-1; + std::vector> PointsOfFSTriangle; + PointsOfFSTriangle.reserve(3); - edgeone(0)=-1; edgeone(1)=-1; + //int position=0; - edgetwo(0)=-1; edgetwo(1)=-1; + for (unsigned int j = 0; j != 4; j++) + { + for (unsigned int k = 0; k != 3; k++) + { //x,y,z + const int node_id = partition_nodes[j]; + coord_subdomainaux(j, k) = aux_coordinates(node_id, k); + } + } - edgetriangle(0)=-1;edgetriangle(1)=-1;edgetriangle(2)=-1; + for (unsigned int i = 0; i < 3; i++) + { + center_position[i] = aux_coordinates(0, i) + aux_coordinates(1, i) + aux_coordinates(2, i) + aux_coordinates(3, i); + } + center_position *= 0.25; - for (int j=0;j<3;j++) - { - if(edges(i_aux,j)<4) - { - active_node_in_replacement_shape_function(shape_function_id)=edges(i_aux,j); - shape_function_id++; - } - else - { - active_node_in_enrichment_shape_function(shape_function_aux_id)=edges(i_aux,j); - shape_function_aux_id++; - } - } + CalculateGeometryData(coord_subdomainaux, DN_DX_subdomainaux, temp_areaaux); //222 + typedef GeometryData::IntegrationMethod IntegrationMethod; + IntegrationMethod mThisIntegrationMethod; + std::vector mInvJ0; + Vector mDetJ0; - //int t_max = shape_function_id; + array_1d msN; + BoundedMatrix msDN_DX; + //double Area=0.0; - unsigned int index=shape_function_aux_id; + Geometry>::PointsArrayType NewPoints; + Node<3>::Pointer p_new_node; + int id_local = 0; + for (unsigned int j = 0; j != 4; j++) + { + id_local = partition_nodes[j]; + p_new_node = Node<3>::Pointer(new Node<3>(id_local, coord_subdomainaux(j, 0), coord_subdomainaux(j, 1), coord_subdomainaux(j, 2))); + NewPoints.push_back(p_new_node); + id_local++; + } + Geometry>::Pointer pGeom = rGeom.Create(NewPoints); + //const unsigned int number_of_points = pGeom->size(); + //number of gauss points + mThisIntegrationMethod = GeometryData::GI_GAUSS_2; - for (unsigned int pos=0; pos -1) //that is, loca - { - if(active_node_in_enrichment_shape_function(pos)==split_edge[4+edge_aux]) - { - if(pos==0) - { - edgeone(0)=edge_i[edge_aux]; - edgeone(1)=edge_j[edge_aux]; - - - } - else - { - edgetwo(0)=edge_i[edge_aux]; - edgetwo(1)=edge_j[edge_aux]; - } - } - } - } - } - bool well=false; - for (unsigned int pos=0; pos>::IntegrationPointsArrayType IntegrationPointsArrayType; - edgetriangle(0)=edgeone(0); - edgetriangle(1)=edgeone(1); - for (unsigned int pos=0; pos<2; pos++) - { + const IntegrationPointsArrayType &integration_points = pGeom->IntegrationPoints(mThisIntegrationMethod); - if(edgetriangle(pos)==edgetwo(0)) - { - edgetriangle(2)=edgetwo(1); - } - if(edgetriangle(pos)==edgetwo(1)) { - edgetriangle(2)=edgetwo(0); - } - } + mInvJ0.resize(integration_points.size()); + mDetJ0.resize(integration_points.size(), false); - if(index==1) well=true; - if(index==1) - { + Element::GeometryType::JacobiansType J0; + J0 = pGeom->Jacobian(J0, mThisIntegrationMethod); - for (unsigned int pos=0; pos<2; pos++) - { + const Matrix &Ncontainer = pGeom->ShapeFunctionsValues(GeometryData::GI_GAUSS_2); + double xp = 0.0; + double yp = 0.0; + double zp = 0.0; - if(edgetriangle(pos)==active_node_in_replacement_shape_function(0)) - { - edgetriangle(2)= active_node_in_replacement_shape_function(1); - } - if(edgetriangle(pos)==active_node_in_replacement_shape_function(1)) - { - edgetriangle(2)=active_node_in_replacement_shape_function(0); - } - } - } - if(well==true) - { - for (unsigned int jj=0; jj<3; jj++){ - original_edges[i](i_aux,jj)=edgetriangle(jj); - } - } - - for(int aux=0; aux<2;aux++) - { - for (unsigned int edge_aux=0; edge_aux<6; edge_aux++) - { - if(active_node_in_replacement_shape_function(aux)==edge_i[edge_aux] or active_node_in_replacement_shape_function(aux)==edge_j[edge_aux] ) - { - if (split_edge[4+edge_aux]> -1) - { + double temp_areaaux_2 = 0.0; + bounded_matrix N_new = ZeroMatrix(4, 8); - if(active_node_in_enrichment_shape_function(0)==split_edge[4+edge_aux]) - { - if(well==true) + for (unsigned int PointNumber = 0; PointNumber < integration_points.size(); PointNumber++) { - for (int j=0;j<3;j++) - { - edges_t[i](i_aux,j)=edges(i_aux,j); + //unsigned int number_of_nodes = pGeom->PointsNumber(); + //unsigned int dimension = pGeom->WorkingSpaceDimension(); + const Vector &N = row(Ncontainer, PointNumber); + + MathUtils::InvertMatrix(J0[PointNumber], mInvJ0[PointNumber], mDetJ0[PointNumber]); + double Weight = integration_points[PointNumber].Weight() * mDetJ0[PointNumber]; + + xp = 0.0; + yp = 0.0; + zp = 0.0; + + for (unsigned int tt = 0; tt != 4; tt++) + { + xp += N[tt] * coord_subdomainaux(tt, 0); + yp += N[tt] * coord_subdomainaux(tt, 1); + zp += N[tt] * coord_subdomainaux(tt, 2); + } + + for (unsigned int j = 0; j != 4; j++) //loop por los nodos del subelemento + { + bounded_matrix aux_coordinates_aux; + aux_coordinates_aux = aux_coordinates; + + bounded_matrix original_coordinates; //8 is the max number of nodes and aux_nodes + for (unsigned int i = 0; i < 4; i++) + for (unsigned int j = 0; j < 3; j++) + original_coordinates(i, j) = rPoints(i, j); + + const int node_idaux = partition_nodes[j]; + + aux_coordinates_aux(node_idaux, 0) = xp; + aux_coordinates_aux(node_idaux, 1) = yp; + aux_coordinates_aux(node_idaux, 2) = zp; + + original_coordinates(j, 0) = xp; + original_coordinates(j, 1) = yp; + original_coordinates(j, 2) = zp; + + for (unsigned int jj = 0; jj != 4; jj++) + { + for (unsigned int k = 0; k != 3; k++) + { //x,y,z + const int node_id = partition_nodes[jj]; + coord_subdomainaux_aux(jj, k) = aux_coordinates_aux(node_id, k); + } + } + + ///para las coordenadas globales + CalculateGeometryData(original_coordinates, DN_DX_subdomainaux_1aux, temp_areaaux_2); //222 + + PRUEBA[i](PointNumber, j) = temp_areaaux_2 / temp_areaaux_1; + weight(i) = Weight; + } + + //int id_local_aux1=0; + //int id_local_aux2=0; + } - } + bounded_matrix edges = ZeroMatrix(4, 3); + bounded_matrix edged_enriched = ZeroMatrix(4, 3); + + array_1d edgeone; + array_1d edgetwo; + array_1d edgetriangle; + array_1d active_node_in_enrichment_shape_function; + active_node_in_enrichment_shape_function(0) = -1; + active_node_in_enrichment_shape_function(1) = -1; + array_1d active_node_in_replacement_shape_function; + active_node_in_replacement_shape_function(0) = -1; + active_node_in_replacement_shape_function(1) = -1; + + edges(0, 0) = partition_nodes[0]; + edges(0, 1) = partition_nodes[2]; + edges(0, 2) = partition_nodes[1]; + + edges(1, 0) = partition_nodes[0]; + edges(1, 1) = partition_nodes[3]; + edges(1, 2) = partition_nodes[2]; + + edges(2, 0) = partition_nodes[0]; + edges(2, 1) = partition_nodes[1]; + edges(2, 2) = partition_nodes[3]; + + edges(3, 0) = partition_nodes[2]; + edges(3, 1) = partition_nodes[3]; + edges(3, 2) = partition_nodes[1]; + + int shape_function_id = 0; + int shape_function_aux_id = 0; + for (int i_aux = 0; i_aux < 4; i_aux++) + { + shape_function_id = 0; + shape_function_aux_id = 0; + active_node_in_enrichment_shape_function(0) = -1; + active_node_in_enrichment_shape_function(1) = -1; + + active_node_in_replacement_shape_function(0) = -1; + active_node_in_replacement_shape_function(1) = -1; + + edgeone(0) = -1; + edgeone(1) = -1; + + edgetwo(0) = -1; + edgetwo(1) = -1; + + edgetriangle(0) = -1; + edgetriangle(1) = -1; + edgetriangle(2) = -1; + + for (int j = 0; j < 3; j++) + { + if (edges(i_aux, j) < 4) + { + active_node_in_replacement_shape_function(shape_function_id) = edges(i_aux, j); + shape_function_id++; + } + else + { + active_node_in_enrichment_shape_function(shape_function_aux_id) = edges(i_aux, j); + shape_function_aux_id++; + } + } + + //int t_max = shape_function_id; + + unsigned int index = shape_function_aux_id; + + for (unsigned int pos = 0; pos < index; pos++) + { + for (unsigned int edge_aux = 0; edge_aux < 6; edge_aux++) + { + if (split_edge[4 + edge_aux] > -1) //that is, loca + { + if (active_node_in_enrichment_shape_function(pos) == split_edge[4 + edge_aux]) + { + if (pos == 0) + { + edgeone(0) = edge_i[edge_aux]; + edgeone(1) = edge_j[edge_aux]; + } + else + { + edgetwo(0) = edge_i[edge_aux]; + edgetwo(1) = edge_j[edge_aux]; + } + } + } + } + } + bool well = false; + for (unsigned int pos = 0; pos < index; pos++) + { + for (unsigned int k = 0; k < 2; k++) + { + if (edgeone(pos) == edgetwo(k)) + well = true; + } + } + + edgetriangle(0) = edgeone(0); + edgetriangle(1) = edgeone(1); + for (unsigned int pos = 0; pos < 2; pos++) + { + + if (edgetriangle(pos) == edgetwo(0)) + { + edgetriangle(2) = edgetwo(1); + } + if (edgetriangle(pos) == edgetwo(1)) + { + edgetriangle(2) = edgetwo(0); + } + } + + if (index == 1) + well = true; + if (index == 1) + { + + for (unsigned int pos = 0; pos < 2; pos++) + { + + if (edgetriangle(pos) == active_node_in_replacement_shape_function(0)) + { + edgetriangle(2) = active_node_in_replacement_shape_function(1); + } + if (edgetriangle(pos) == active_node_in_replacement_shape_function(1)) + { + edgetriangle(2) = active_node_in_replacement_shape_function(0); + } + } + } + if (well == true) + { + for (unsigned int jj = 0; jj < 3; jj++) + { + original_edges[i](i_aux, jj) = edgetriangle(jj); + } + } + + for (int aux = 0; aux < 2; aux++) + { + for (unsigned int edge_aux = 0; edge_aux < 6; edge_aux++) + { + if ((active_node_in_replacement_shape_function(aux) == edge_i[edge_aux]) || (active_node_in_replacement_shape_function(aux) == edge_j[edge_aux])) + { + if (split_edge[4 + edge_aux] > -1) + { + + if (active_node_in_enrichment_shape_function(0) == split_edge[4 + edge_aux]) + { + if (well == true) + { + for (int j = 0; j < 3; j++) + { + edges_t[i](i_aux, j) = edges(i_aux, j); + } + } + edges_o[i](i_aux, 0) = edge_i[edge_aux]; + edges_o[i](i_aux, 1) = edge_j[edge_aux]; + edges_o[i](i_aux, 0) = active_node_in_enrichment_shape_function(1); + } + else if (active_node_in_enrichment_shape_function(1) == split_edge[4 + edge_aux]) + { + if (well == true) + { + for (int j = 0; j < 3; j++) + { + edges_t[i](i_aux, j) = edges(i_aux, j); + } + } + edges_o[i](i_aux, 0) = edge_i[edge_aux]; + edges_o[i](i_aux, 1) = edge_j[edge_aux]; + edges_o[i](i_aux, 0) = active_node_in_enrichment_shape_function(0); + } + + } // + } + } + } } - edges_o[i](i_aux,0)=edge_i[edge_aux]; - edges_o[i](i_aux,1)=edge_j[edge_aux]; - edges_o[i](i_aux,0)=active_node_in_enrichment_shape_function(1); - } - else if(active_node_in_enrichment_shape_function(1)==split_edge[4+edge_aux]) - { - if(well==true) + for (unsigned int j = 0; j != 4; j++) { - for (int j=0;j<3;j++) - { - edges_t[i](i_aux,j)=edges(i_aux,j); - } + for (unsigned int k = 0; k != 3; k++) + { + const int node_id = partition_nodes[j]; + rGradientaux1[i](node_id, k) = DN_DX_subdomainaux(j, k); + Ngauss_new(i, node_id) = 0.25; + } } - edges_o[i](i_aux,0)=edge_i[edge_aux]; - edges_o[i](i_aux,1)=edge_j[edge_aux]; - edges_o[i](i_aux,0)=active_node_in_enrichment_shape_function(0); - } - }// - } - } - } - } - for (unsigned int j=0; j!=4; j++) - { - for (unsigned int k=0; k!=3; k++) { - const int node_id=partition_nodes[j]; - rGradientaux1[i](node_id,k)= DN_DX_subdomainaux(j,k); - Ngauss_new(i,node_id)=0.25; + double dist = 0.0; + double abs_dist = 0.0; + for (int j = 0; j < 4; j++) + { + dist += rShapeFunctionValues(i, j) * exact_distance[j]; + abs_dist += rShapeFunctionValues(i, j) * abs_distance[j]; + } + if (dist < 0.0) + rPartitionsSign[i] = -1.0; + else + rPartitionsSign[i] = 1.0; - } - } + if (nummm == 3) + { + if (rPartitionsSign[i] == 1.0) + { + int index = 0; + for (unsigned int j = 0; j != 4; j++) + { + const int node_id = partition_nodes[j]; + if (node_id > 3) + { + interface_nodes[local](0, index) = node_id; + + index++; + } + } + local++; + } + } - double dist = 0.0; - double abs_dist = 0.0; - for (int j = 0; j < 4; j++) - { - dist += rShapeFunctionValues(i, j) * exact_distance[j]; - abs_dist += rShapeFunctionValues(i, j) * abs_distance[j]; - } - if (dist < 0.0) - rPartitionsSign[i] = -1.0; - else - rPartitionsSign[i] = 1.0; - - if(nummm==3) - { - if(rPartitionsSign[i] == 1.0 ) - { - int index=0; - for (unsigned int j=0; j!=4; j++) - { - const int node_id=partition_nodes[j]; - if(node_id>3) { - interface_nodes[local](0,index)=node_id; + NEnriched(i, 0) = 0.5 * (abs_dist - rPartitionsSign[i] * dist); + //normalizing + NEnriched(i, 0) /= max_aux_dist_on_cut; - index++; - } + for (int j = 0; j < 3; j++) + { + rGradientsValue[i](0, j) = (0.5 / max_aux_dist_on_cut) * (abs_distance_gradient[j] - rPartitionsSign[i] * exact_distance_gradient[j]); + } + } + } + else + { + NEnriched(0, 0) = 0.0; + switch_off_ee = true; + switch_off_e = switch_off_ee; + for (int j = 0; j < 3; j++) + rGradientsValue[0](0, j) = 0.0; } - local++; - } + return number_of_partitions; + KRATOS_CATCH(""); } - NEnriched(i, 0) = 0.5 * (abs_dist - rPartitionsSign[i] * dist); - //normalizing - NEnriched(i, 0) /= max_aux_dist_on_cut; - - for (int j = 0; j < 3; j++) + private: + static void ComputeElementCoordinates(array_1d &N, const array_1d ¢er_position, BoundedMatrix &rPoints, const double vol) { - rGradientsValue[i](0, j) = (0.5/max_aux_dist_on_cut) * (abs_distance_gradient[j] - rPartitionsSign[i] * exact_distance_gradient[j]); + double x0 = rPoints(0, 0); //geom[0].X(); + double y0 = rPoints(0, 1); //geom[0].Y(); + double z0 = rPoints(0, 2); //geom[0].Z(); + double x1 = rPoints(1, 0); //geom[1].X(); + double y1 = rPoints(1, 1); //geom[1].Y(); + double z1 = rPoints(1, 2); //geom[1].Z(); + double x2 = rPoints(2, 0); //geom[2].X(); + double y2 = rPoints(2, 1); //geom[2].Y(); + double z2 = rPoints(2, 2); //geom[2].Z(); + double x3 = rPoints(3, 0); //geom[3].X(); + double y3 = rPoints(3, 1); //geom[3].Y(); + double z3 = rPoints(3, 2); //geom[3].Z(); + + double xc = center_position[0]; + double yc = center_position[1]; + double zc = center_position[2]; + + double inv_vol = 1.0 / vol; + // N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; + // N[1] = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, xc, yc, zc) * inv_vol; + // N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; + // N[3] = CalculateVol(x3, y3, z3, x0, y0, z0, x2, y2, z2, xc, yc, zc) * inv_vol; + N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; + N[1] = CalculateVol(x0, y0, z0, x2, y2, z2, x3, y3, z3, xc, yc, zc) * inv_vol; + N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; + N[3] = CalculateVol(x1, y1, z1, x2, y2, z2, x0, y0, z0, xc, yc, zc) * inv_vol; } - } - } - else - { - NEnriched(0,0) = 0.0; - switch_off_ee=true; - switch_off_e=switch_off_ee; - for (int j = 0; j < 3; j++) - rGradientsValue[0](0, j) = 0.0; - } - - return number_of_partitions; - KRATOS_CATCH(""); - } - - - - private: - - - static void ComputeElementCoordinates(array_1d & N, const array_1d & center_position, BoundedMatrix & rPoints, const double vol) - { - double x0 = rPoints(0, 0); //geom[0].X(); - double y0 = rPoints(0, 1); //geom[0].Y(); - double z0 = rPoints(0, 2); //geom[0].Z(); - double x1 = rPoints(1, 0); //geom[1].X(); - double y1 = rPoints(1, 1); //geom[1].Y(); - double z1 = rPoints(1, 2); //geom[1].Z(); - double x2 = rPoints(2, 0); //geom[2].X(); - double y2 = rPoints(2, 1); //geom[2].Y(); - double z2 = rPoints(2, 2); //geom[2].Z(); - double x3 = rPoints(3, 0); //geom[3].X(); - double y3 = rPoints(3, 1); //geom[3].Y(); - double z3 = rPoints(3, 2); //geom[3].Z(); - - double xc = center_position[0]; - double yc = center_position[1]; - double zc = center_position[2]; - - double inv_vol = 1.0 / vol; - // N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; - // N[1] = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, xc, yc, zc) * inv_vol; - // N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; - // N[3] = CalculateVol(x3, y3, z3, x0, y0, z0, x2, y2, z2, xc, yc, zc) * inv_vol; - N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; - N[1] = CalculateVol(x0, y0, z0, x2, y2, z2, x3, y3, z3, xc, yc, zc) * inv_vol; - N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; - N[3] = CalculateVol(x1, y1, z1, x2, y2, z2, x0, y0, z0, xc, yc, zc) * inv_vol; - - } - - static inline double CalculateVol(const double x0, const double y0, const double z0,const double x1, const double y1, const double z1,const double x2, const double y2, const double z2,const double x3, const double y3, const double z3) - { - double x10 = x1 - x0; - double y10 = y1 - y0; - double z10 = z1 - z0; - - double x20 = x2 - x0; - double y20 = y2 - y0; - double z20 = z2 - z0; - - double x30 = x3 - x0; - double y30 = y3 - y0; - double z30 = z3 - z0; - - double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; - return detJ * 0.1666666666666666666667; - } - - //2d - static inline void CalculateGeometryData(const bounded_matrix & coordinates,BoundedMatrix& DN_DX,array_1d& N,double& Area) - { - double x10 = coordinates(1,0) - coordinates(0,0); - double y10 = coordinates(1,1) - coordinates(0,1); - - double x20 = coordinates(2,0) - coordinates(0,0); - double y20 = coordinates(2,1) - coordinates (0,1); - - //Jacobian is calculated: - // |dx/dxi dx/deta| |x1-x0 x2-x0| - //J=| |= | | - // |dy/dxi dy/deta| |y1-y0 y2-y0| - - - double detJ = x10 * y20-y10 * x20; - - DN_DX(0,0) = -y20 + y10; - DN_DX(0,1) = x20 - x10; - DN_DX(1,0) = y20 ; - DN_DX(1,1) = -x20 ; - DN_DX(2,0) = -y10 ; - DN_DX(2,1) = x10 ; - - DN_DX /= detJ; - N[0] = 0.333333333333333; - N[1] = 0.333333333333333; - N[2] = 0.333333333333333; - - Area = 0.5*detJ; - } - - //template - static inline double CalculateVolume2D( const bounded_matrix & coordinates) - { - double x10 = coordinates(1,0) - coordinates(0,0); - double y10 = coordinates(1,1) - coordinates(0,1); - - double x20 = coordinates(2,0) - coordinates(0,0); - double y20 = coordinates(2,1) - coordinates (0,1); - double detJ = x10 * y20-y10 * x20; - return 0.5*detJ; - } - - static inline bool CalculatePosition(const bounded_matrix & coordinates,const double xc, const double yc, const double zc, array_1d & N ) - { - double x0 = coordinates(0,0); - double y0 = coordinates(0,1); - double x1 = coordinates(1,0); - double y1 = coordinates(1,1); - double x2 = coordinates(2,0); - double y2 = coordinates(2,1); - - double area = CalculateVol(x0, y0, x1, y1, x2, y2); - double inv_area = 0.0; - if (area == 0.0) - { - KRATOS_ERROR<<"element with zero area found"; - } else - { - inv_area = 1.0 / area; - } + static inline double CalculateVol(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double x3, const double y3, const double z3) + { + double x10 = x1 - x0; + double y10 = y1 - y0; + double z10 = z1 - z0; - N[0] = CalculateVol(x1, y1, x2, y2, xc, yc) * inv_area; - N[1] = CalculateVol(x2, y2, x0, y0, xc, yc) * inv_area; - N[2] = CalculateVol(x0, y0, x1, y1, xc, yc) * inv_area; - //KRATOS_WATCH(N); + double x20 = x2 - x0; + double y20 = y2 - y0; + double z20 = z2 - z0; - if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0) //if the xc yc is inside the triangle return true - return true; + double x30 = x3 - x0; + double y30 = y3 - y0; + double z30 = z3 - z0; - return false; - } + double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + return detJ * 0.1666666666666666666667; + } - static inline double CalculateVol(const double x0, const double y0,const double x1, const double y1,const double x2, const double y2) - { - return 0.5 * ((x1 - x0)*(y2 - y0)- (y1 - y0)*(x2 - x0)); - } + //2d + static inline void CalculateGeometryData(const bounded_matrix &coordinates, BoundedMatrix &DN_DX, array_1d &N, double &Area) + { + double x10 = coordinates(1, 0) - coordinates(0, 0); + double y10 = coordinates(1, 1) - coordinates(0, 1); - static inline void CalculateGeometryData(const bounded_matrix & coordinates,BoundedMatrix& DN_DX, double& Area) - { - double x10 = coordinates(1,0) - coordinates(0,0); - double y10 = coordinates(1,1) - coordinates(0,1); + double x20 = coordinates(2, 0) - coordinates(0, 0); + double y20 = coordinates(2, 1) - coordinates(0, 1); - double x20 = coordinates(2,0) - coordinates(0,0); - double y20 = coordinates(2,1) - coordinates (0,1); + //Jacobian is calculated: + // |dx/dxi dx/deta| |x1-x0 x2-x0| + //J=| |= | | + // |dy/dxi dy/deta| |y1-y0 y2-y0| - //Jacobian is calculated: - // |dx/dxi dx/deta| |x1-x0 x2-x0| - //J=| |= | | - // |dy/dxi dy/deta| |y1-y0 y2-y0| + double detJ = x10 * y20 - y10 * x20; + DN_DX(0, 0) = -y20 + y10; + DN_DX(0, 1) = x20 - x10; + DN_DX(1, 0) = y20; + DN_DX(1, 1) = -x20; + DN_DX(2, 0) = -y10; + DN_DX(2, 1) = x10; - double detJ = x10 * y20-y10 * x20; + DN_DX /= detJ; + N[0] = 0.333333333333333; + N[1] = 0.333333333333333; + N[2] = 0.333333333333333; - DN_DX(0,0) = -y20 + y10; - DN_DX(0,1) = x20 - x10; - DN_DX(1,0) = y20 ; - DN_DX(1,1) = -x20 ; - DN_DX(2,0) = -y10 ; - DN_DX(2,1) = x10 ; + Area = 0.5 * detJ; + } - DN_DX /= detJ; + //template + static inline double CalculateVolume2D(const bounded_matrix &coordinates) + { + double x10 = coordinates(1, 0) - coordinates(0, 0); + double y10 = coordinates(1, 1) - coordinates(0, 1); + + double x20 = coordinates(2, 0) - coordinates(0, 0); + double y20 = coordinates(2, 1) - coordinates(0, 1); + double detJ = x10 * y20 - y10 * x20; + return 0.5 * detJ; + } - Area = 0.5*detJ; - } + static inline bool CalculatePosition(const bounded_matrix &coordinates, const double xc, const double yc, const double zc, array_1d &N) + { + double x0 = coordinates(0, 0); + double y0 = coordinates(0, 1); + double x1 = coordinates(1, 0); + double y1 = coordinates(1, 1); + double x2 = coordinates(2, 0); + double y2 = coordinates(2, 1); + + double area = CalculateVol(x0, y0, x1, y1, x2, y2); + double inv_area = 0.0; + if (area == 0.0) + { + KRATOS_ERROR << "element with zero area found"; + } + else + { + inv_area = 1.0 / area; + } + N[0] = CalculateVol(x1, y1, x2, y2, xc, yc) * inv_area; + N[1] = CalculateVol(x2, y2, x0, y0, xc, yc) * inv_area; + N[2] = CalculateVol(x0, y0, x1, y1, xc, yc) * inv_area; + //KRATOS_WATCH(N); - static inline void CalculateGeometryData( BoundedMatrix & coordinates, BoundedMatrix& DN_DX,double& Volume) - { - double x10 = coordinates(1,0) - coordinates(0,0); - double y10 = coordinates(1,1) - coordinates(0,1); - double z10 = coordinates(1,2) - coordinates(0,2); + if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0) //if the xc yc is inside the triangle return true + return true; - double x20 = coordinates(2,0) - coordinates(0,0); - double y20 = coordinates(2,1) - coordinates (0,1); - double z20 = coordinates(2,2) - coordinates (0,2); + return false; + } - double x30 = coordinates(3,0) - coordinates(0,0); - double y30 = coordinates(3,1) - coordinates (0,1); - double z30 = coordinates(3,2) - coordinates (0,2); + static inline double CalculateVol(const double x0, const double y0, const double x1, const double y1, const double x2, const double y2) + { + return 0.5 * ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0)); + } - double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + static inline void CalculateGeometryData(const bounded_matrix &coordinates, BoundedMatrix &DN_DX, double &Area) + { + double x10 = coordinates(1, 0) - coordinates(0, 0); + double y10 = coordinates(1, 1) - coordinates(0, 1); - DN_DX(0,0) = -y20 * z30 + y30 * z20 + y10 * z30 - z10 * y30 - y10 * z20 + z10 * y20; - DN_DX(0,1) = -z20 * x30 + x20 * z30 - x10 * z30 + z10 * x30 + x10 * z20 - z10 * x20; - DN_DX(0,2) = -x20 * y30 + y20 * x30 + x10 * y30 - y10 * x30 - x10 * y20 + y10 * x20; - DN_DX(1,0) = y20 * z30 - y30 * z20; - DN_DX(1,1) = z20 * x30 - x20 * z30; - DN_DX(1,2) = x20 * y30 - y20 * x30; - DN_DX(2,0) = -y10 * z30 + z10 * y30; - DN_DX(2,1) = x10 * z30 - z10 * x30; - DN_DX(2,2) = -x10 * y30 + y10 * x30; - DN_DX(3,0) = y10 * z20 - z10 * y20; - DN_DX(3,1) = -x10 * z20 + z10 * x20; - DN_DX(3,2) = x10 * y20 - y10 * x20; + double x20 = coordinates(2, 0) - coordinates(0, 0); + double y20 = coordinates(2, 1) - coordinates(0, 1); - DN_DX /= detJ; + //Jacobian is calculated: + // |dx/dxi dx/deta| |x1-x0 x2-x0| + //J=| |= | | + // |dy/dxi dy/deta| |y1-y0 y2-y0| - Volume = detJ*0.1666666666666666666667; - } + double detJ = x10 * y20 - y10 * x20; - static double ComputeSubTetraVolumeAndCenter(const bounded_matrix & aux_coordinates, array_1d & center_position, const int i0, const int i1, const int i2, const int i3) - { - double x10 = aux_coordinates(i1, 0) - aux_coordinates(i0, 0); //geom[1].X() - geom[0].X(); - double y10 = aux_coordinates(i1, 1) - aux_coordinates(i0, 1); // geom[1].Y() - geom[0].Y(); - double z10 = aux_coordinates(i1, 2) - aux_coordinates(i0, 2); // geom[1].Z() - geom[0].Z(); + DN_DX(0, 0) = -y20 + y10; + DN_DX(0, 1) = x20 - x10; + DN_DX(1, 0) = y20; + DN_DX(1, 1) = -x20; + DN_DX(2, 0) = -y10; + DN_DX(2, 1) = x10; - double x20 = aux_coordinates(i2, 0) - aux_coordinates(i0, 0); // geom[2].X() - geom[0].X(); - double y20 = aux_coordinates(i2, 1) - aux_coordinates(i0, 1); // geom[2].Y() - geom[0].Y(); - double z20 = aux_coordinates(i2, 2) - aux_coordinates(i0, 2); // geom[2].Z() - geom[0].Z(); + DN_DX /= detJ; - double x30 = aux_coordinates(i3, 0) - aux_coordinates(i0, 0); // geom[3].X() - geom[0].X(); - double y30 = aux_coordinates(i3, 1) - aux_coordinates(i0, 1); // geom[3].Y() - geom[0].Y(); - double z30 = aux_coordinates(i3, 2) - aux_coordinates(i0, 2); // geom[3].Z() - geom[0].Z(); + Area = 0.5 * detJ; + } - double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; - double vol = detJ * 0.1666666666666666666667; + static inline void CalculateGeometryData(BoundedMatrix &coordinates, BoundedMatrix &DN_DX, double &Volume) + { + double x10 = coordinates(1, 0) - coordinates(0, 0); + double y10 = coordinates(1, 1) - coordinates(0, 1); + double z10 = coordinates(1, 2) - coordinates(0, 2); + + double x20 = coordinates(2, 0) - coordinates(0, 0); + double y20 = coordinates(2, 1) - coordinates(0, 1); + double z20 = coordinates(2, 2) - coordinates(0, 2); + + double x30 = coordinates(3, 0) - coordinates(0, 0); + double y30 = coordinates(3, 1) - coordinates(0, 1); + double z30 = coordinates(3, 2) - coordinates(0, 2); + + double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + + DN_DX(0, 0) = -y20 * z30 + y30 * z20 + y10 * z30 - z10 * y30 - y10 * z20 + z10 * y20; + DN_DX(0, 1) = -z20 * x30 + x20 * z30 - x10 * z30 + z10 * x30 + x10 * z20 - z10 * x20; + DN_DX(0, 2) = -x20 * y30 + y20 * x30 + x10 * y30 - y10 * x30 - x10 * y20 + y10 * x20; + DN_DX(1, 0) = y20 * z30 - y30 * z20; + DN_DX(1, 1) = z20 * x30 - x20 * z30; + DN_DX(1, 2) = x20 * y30 - y20 * x30; + DN_DX(2, 0) = -y10 * z30 + z10 * y30; + DN_DX(2, 1) = x10 * z30 - z10 * x30; + DN_DX(2, 2) = -x10 * y30 + y10 * x30; + DN_DX(3, 0) = y10 * z20 - z10 * y20; + DN_DX(3, 1) = -x10 * z20 + z10 * x20; + DN_DX(3, 2) = x10 * y20 - y10 * x20; + + DN_DX /= detJ; + + Volume = detJ * 0.1666666666666666666667; + } - for (unsigned int i = 0; i < 3; i++) - { - center_position[i] = aux_coordinates(i0, i) + aux_coordinates(i1, i) + aux_coordinates(i2, i) + aux_coordinates(i3, i); - } - center_position *= 0.25; + static double ComputeSubTetraVolumeAndCenter(const bounded_matrix &aux_coordinates, array_1d ¢er_position, const int i0, const int i1, const int i2, const int i3) + { + double x10 = aux_coordinates(i1, 0) - aux_coordinates(i0, 0); //geom[1].X() - geom[0].X(); + double y10 = aux_coordinates(i1, 1) - aux_coordinates(i0, 1); // geom[1].Y() - geom[0].Y(); + double z10 = aux_coordinates(i1, 2) - aux_coordinates(i0, 2); // geom[1].Z() - geom[0].Z(); - return vol; - } + double x20 = aux_coordinates(i2, 0) - aux_coordinates(i0, 0); // geom[2].X() - geom[0].X(); + double y20 = aux_coordinates(i2, 1) - aux_coordinates(i0, 1); // geom[2].Y() - geom[0].Y(); + double z20 = aux_coordinates(i2, 2) - aux_coordinates(i0, 2); // geom[2].Z() - geom[0].Z(); + double x30 = aux_coordinates(i3, 0) - aux_coordinates(i0, 0); // geom[3].X() - geom[0].X(); + double y30 = aux_coordinates(i3, 1) - aux_coordinates(i0, 1); // geom[3].Y() - geom[0].Y(); + double z30 = aux_coordinates(i3, 2) - aux_coordinates(i0, 2); // geom[3].Z() - geom[0].Z(); + double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + double vol = detJ * 0.1666666666666666666667; + for (unsigned int i = 0; i < 3; i++) + { + center_position[i] = aux_coordinates(i0, i) + aux_coordinates(i1, i) + aux_coordinates(i2, i) + aux_coordinates(i3, i); + } + center_position *= 0.25; - }; + return vol; + } + }; } // namespace Kratos. diff --git a/applications/PFEM2Application/custom_utilities/particle_utilities.h b/applications/PFEM2Application/custom_utilities/particle_utilities.h index 00638672526d..da806b6f768e 100644 --- a/applications/PFEM2Application/custom_utilities/particle_utilities.h +++ b/applications/PFEM2Application/custom_utilities/particle_utilities.h @@ -10,8 +10,8 @@ // Main authors: Author Julio Marti. // -#if !defined(KRATOS_PARTICLES_UTILITIES_INCLUDED ) -#define KRATOS_PARTICLES_UTILITIES_INCLUDED +#if !defined(KRATOS_PARTICLES_UTILITIES_INCLUDED) +#define KRATOS_PARTICLES_UTILITIES_INCLUDED #define PRESSURE_ON_EULERIAN_MESH #define USE_FEW_PARTICLES @@ -23,7 +23,6 @@ // External includes - // Project includes #include "includes/define.h" #include "includes/model_part.h" @@ -48,1971 +47,1931 @@ namespace Kratos { - template< class T, std::size_t dim > - class DistanceCalculator1 - { - public: - - double operator()(T const& p1, T const& p2) - { - double dist = 0.0; - for (std::size_t i = 0; i < dim; i++) - { - double tmp = p1[i] - p2[i]; - dist += tmp*tmp; - } - return dist; //square distance because it is easier to work without the square root// - } - - }; - - template class ParticleUtils - { - public: - KRATOS_CLASS_POINTER_DEFINITION(ParticleUtils); - - - void EstimateTime(ModelPart& rEulerianModelPart,const double max_dt) - { - - KRATOS_TRY - // KRATOS_ERROR(std::logic_error, "NEGATIVE VALUE OF Time step estimated" , ""); - //initializee dt with max dt - //initialize dt with incredible value - double /*dt, glob_min_dt,*/ dummy; - // double h, nu; - array_1d N = ZeroVector(3); - array_1d aux = ZeroVector(3); //dimension = number of nodes - array_1d vel = ZeroVector(3); //dimension = number of nodes - BoundedMatrix DN_DX = ZeroMatrix(3,2); - array_1d ms_vel_gauss = ZeroVector(2); //dimesion coincides with space dimension - - //initialize it with given value - // glob_min_dt=max_dt; - - - // dt=0.0; - for(ModelPart::ElementsContainerType::iterator im = rEulerianModelPart.ElementsBegin() ; im !=rEulerianModelPart.ElementsEnd() ; ++im) - { - GeometryUtils::CalculateGeometryData(im->GetGeometry(),DN_DX,N,dummy); - - double h = sqrt(2.00*dummy); - - array_1d const& v = im->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); - ms_vel_gauss[0] = v[0]; - ms_vel_gauss[1] = v[1]; - - //direction of the height is stored in the auxilliary vector - for (unsigned int i=1; i<3; i++) - { - array_1d const& vi = im->GetGeometry()[i].FastGetSolutionStepValue(VELOCITY); - ms_vel_gauss[0] += vi[0]; - ms_vel_gauss[1] += vi[1]; - } - ms_vel_gauss *=0.3333; - - double norm_u = ms_vel_gauss[0]*ms_vel_gauss[0] + ms_vel_gauss[1]*ms_vel_gauss[1]; - norm_u = sqrt(norm_u); - - double courant= norm_u * max_dt / h; - - double& counter = im->GetValue(POISSON_RATIO); - counter = courant; - - } - KRATOS_CATCH(""); - } - - void VisualizationModelPart(ModelPart& rCompleteModelPart, ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart) - { - KRATOS_TRY; - - rCompleteModelPart.Elements() = rEulerianModelPart.Elements(); - rCompleteModelPart.Nodes() = rEulerianModelPart.Nodes(); + template + class DistanceCalculator1 + { + public: + double operator()(T const &p1, T const &p2) + { + double dist = 0.0; + for (std::size_t i = 0; i < dim; i++) + { + double tmp = p1[i] - p2[i]; + dist += tmp * tmp; + } + return dist; //square distance because it is easier to work without the square root// + } + }; + + template + class ParticleUtils + { + public: + KRATOS_CLASS_POINTER_DEFINITION(ParticleUtils); + + void EstimateTime(ModelPart &rEulerianModelPart, const double max_dt) + { + + KRATOS_TRY + // KRATOS_ERROR(std::logic_error, "NEGATIVE VALUE OF Time step estimated" , ""); + //initializee dt with max dt + //initialize dt with incredible value + double /*dt, glob_min_dt,*/ dummy; + // double h, nu; + array_1d N = ZeroVector(3); + array_1d aux = ZeroVector(3); //dimension = number of nodes + array_1d vel = ZeroVector(3); //dimension = number of nodes + BoundedMatrix DN_DX = ZeroMatrix(3, 2); + array_1d ms_vel_gauss = ZeroVector(2); //dimesion coincides with space dimension + + //initialize it with given value + // glob_min_dt=max_dt; + + // dt=0.0; + for (ModelPart::ElementsContainerType::iterator im = rEulerianModelPart.ElementsBegin(); im != rEulerianModelPart.ElementsEnd(); ++im) + { + GeometryUtils::CalculateGeometryData(im->GetGeometry(), DN_DX, N, dummy); + + double h = sqrt(2.00 * dummy); + + array_1d const &v = im->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); + ms_vel_gauss[0] = v[0]; + ms_vel_gauss[1] = v[1]; + + //direction of the height is stored in the auxilliary vector + for (unsigned int i = 1; i < 3; i++) + { + array_1d const &vi = im->GetGeometry()[i].FastGetSolutionStepValue(VELOCITY); + ms_vel_gauss[0] += vi[0]; + ms_vel_gauss[1] += vi[1]; + } + ms_vel_gauss *= 0.3333; + + double norm_u = ms_vel_gauss[0] * ms_vel_gauss[0] + ms_vel_gauss[1] * ms_vel_gauss[1]; + norm_u = sqrt(norm_u); - unsigned int id; - if(rEulerianModelPart.Nodes().size()!= 0) - id = (rEulerianModelPart.Nodes().end() - 1)->Id() + 1; - else - id = 1; - - //preallocate the memory needed - int tot_nodes = rEulerianModelPart.Nodes().size() + rLagrangianModelPart.Nodes().size(); - rCompleteModelPart.Nodes().reserve( tot_nodes ); + double courant = norm_u * max_dt / h; - //note that here we renumber the nodes - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); - node_it != rLagrangianModelPart.NodesEnd(); node_it++) - { - node_it->SetId(id++); - rCompleteModelPart.AddNode(*(node_it.base())); - } + double &counter = im->GetValue(POISSON_RATIO); + counter = courant; + } + KRATOS_CATCH(""); + } + + void VisualizationModelPart(ModelPart &rCompleteModelPart, ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart) + { + KRATOS_TRY; - KRATOS_CATCH(""); - } + rCompleteModelPart.Elements() = rEulerianModelPart.Elements(); + rCompleteModelPart.Nodes() = rEulerianModelPart.Nodes(); + unsigned int id; + if (rEulerianModelPart.Nodes().size() != 0) + id = (rEulerianModelPart.Nodes().end() - 1)->Id() + 1; + else + id = 1; + + //preallocate the memory needed + int tot_nodes = rEulerianModelPart.Nodes().size() + rLagrangianModelPart.Nodes().size(); + rCompleteModelPart.Nodes().reserve(tot_nodes); - void TransferToEulerianMesh_Face_Heat_Flux(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart) - { - KRATOS_TRY - //defintions for spatial search - typedef Node < 3 > PointType; - typedef Node < 3 > ::Pointer PointTypePointer; - typedef std::vector PointVector; - typedef std::vector::iterator PointIterator; - typedef std::vector DistanceVector; - typedef std::vector::iterator DistanceIterator; + //note that here we renumber the nodes + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); node_it++) + { + node_it->SetId(id++); + rCompleteModelPart.AddNode(*(node_it.base())); + } - //creating an auxiliary list for the new nodes - PointVector list_of_nodes; + KRATOS_CATCH(""); + } - //************* - // Bucket types - typedef Bucket< TDim, PointType, PointVector, PointTypePointer, PointIterator, DistanceIterator > BucketType; + void TransferToEulerianMesh_Face_Heat_Flux(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart) + { + KRATOS_TRY + //defintions for spatial search + typedef Node<3> PointType; + typedef Node<3>::Pointer PointTypePointer; + typedef std::vector PointVector; + typedef std::vector::iterator PointIterator; + typedef std::vector DistanceVector; + typedef std::vector::iterator DistanceIterator; - typedef Tree< KDTreePartition > tree; //Kdtree; + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; - //starting calculating time of construction of the kdtree - boost::timer kdtree_construction; + //************* + // Bucket types + typedef Bucket BucketType; - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); - node_it != rLagrangianModelPart.NodesEnd(); ++node_it) - { - PointTypePointer pnode = *(node_it.base()); + typedef Tree> tree; //Kdtree; - //putting the nodes of the destination_model part in an auxiliary list - list_of_nodes.push_back(pnode); - } + //starting calculating time of construction of the kdtree + boost::timer kdtree_construction; - std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + PointTypePointer pnode = *(node_it.base()); - //create a spatial database with the list of new nodes - unsigned int bucket_size = 20; - tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); + //putting the nodes of the destination_model part in an auxiliary list + list_of_nodes.push_back(pnode); + } - //work arrays - Node < 3 > work_point(0, 0.0, 0.0, 0.0); - unsigned int MaximumNumberOfResults = 10000; - PointVector Results(MaximumNumberOfResults); - DistanceVector SquaredResultsDistances(MaximumNumberOfResults); + std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; + //create a spatial database with the list of new nodes + unsigned int bucket_size = 20; + tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); - if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) - KRATOS_ERROR<<"Add ----NODAL_H---- variable!!!!!! ERROR"; + //work arrays + Node<3> work_point(0, 0.0, 0.0, 0.0); + unsigned int MaximumNumberOfResults = 10000; + PointVector Results(MaximumNumberOfResults); + DistanceVector SquaredResultsDistances(MaximumNumberOfResults); - double sigma = 0.0; - if (TDim == 2) - sigma = 10.0 / (7.0 * 3.1415926); - else - sigma = 1.0 / 3.1415926; + if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) + KRATOS_ERROR << "Add ----NODAL_H---- variable!!!!!! ERROR"; - for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) - { - if( (node_it)->FastGetSolutionStepValue(IS_FREE_SURFACE)==true or (node_it)->FastGetSolutionStepValue(IS_WATER)==1 ) - { //IS_FREE_SURFACE - work_point.X() = node_it->X(); - work_point.Y() = node_it->Y(); - work_point.Z() = node_it->Z(); + double sigma = 0.0; + if (TDim == 2) + sigma = 10.0 / (7.0 * 3.1415926); + else + sigma = 1.0 / 3.1415926; - double radius = 1.5 * node_it->FastGetSolutionStepValue(NODAL_H); + for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) + { + if (((node_it)->FastGetSolutionStepValue(IS_FREE_SURFACE) == true) || ((node_it)->FastGetSolutionStepValue(IS_WATER) == 1)) + { //IS_FREE_SURFACE + work_point.X() = node_it->X(); + work_point.Y() = node_it->Y(); + work_point.Z() = node_it->Z(); - //find all of the new nodes within the radius - int number_of_points_in_radius; + double radius = 1.5 * node_it->FastGetSolutionStepValue(NODAL_H); - //look between the new nodes which of them is inside the radius of the circumscribed cyrcle - number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); + //find all of the new nodes within the radius + int number_of_points_in_radius; - if (number_of_points_in_radius > 0) - { + //look between the new nodes which of them is inside the radius of the circumscribed cyrcle + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); - double& temperature = (node_it)->FastGetSolutionStepValue(FACE_HEAT_FLUX); - //double temperature=0.0; + if (number_of_points_in_radius > 0) + { - double temperature_aux = 0.0; + double &temperature = (node_it)->FastGetSolutionStepValue(FACE_HEAT_FLUX); + //double temperature=0.0; - double tot_weight = 0.0; + double temperature_aux = 0.0; - for (int k = 0; k < number_of_points_in_radius; k++) - { - double distance = sqrt(*(SquaredResultsDistances.begin() + k)); - double weight = SPHCubicKernel(sigma, distance, radius); + double tot_weight = 0.0; - PointIterator it_found = Results.begin() + k; + for (int k = 0; k < number_of_points_in_radius; k++) + { + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); - if((*it_found)->FastGetSolutionStepValue(IS_INTERFACE)==1) //MATERIAL_VARIABLE - { - temperature_aux += weight * (*it_found)->FastGetSolutionStepValue(INCIDENT_RADIATION_FUNCTION);//);//FACE_HEAT_FLUX - tot_weight += weight; - } - } - if(tot_weight>0.0) - { - temperature_aux /= tot_weight; - - temperature +=(0.5 * temperature_aux * 1.00); //1.5 //1.25 - } - } - } - - } - KRATOS_CATCH("") - } - - void TransferToEulerianMesh(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart) - { - KRATOS_TRY - - //defintions for spatial search - typedef Node < 3 > PointType; - typedef Node < 3 > ::Pointer PointTypePointer; - typedef std::vector PointVector; - typedef std::vector::iterator PointIterator; - typedef std::vector DistanceVector; - typedef std::vector::iterator DistanceIterator; - - //creating an auxiliary list for the new nodes - PointVector list_of_nodes; - //************* - // Bucket types - typedef Bucket< TDim, PointType, PointVector, PointTypePointer, PointIterator, DistanceIterator > BucketType; - - typedef Tree< KDTreePartition > tree; //Kdtree; - - //starting calculating time of construction of the kdtree - boost::timer kdtree_construction; - - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); - node_it != rLagrangianModelPart.NodesEnd(); ++node_it) - { - PointTypePointer pnode = *(node_it.base()); - - //putting the nodes of the destination_model part in an auxiliary list - list_of_nodes.push_back(pnode); - } - - std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; - - //create a spatial database with the list of new nodes - unsigned int bucket_size = 20; - tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); - - //work arrays - Node < 3 > work_point(0, 0.0, 0.0, 0.0); - unsigned int MaximumNumberOfResults = 10000; - PointVector Results(MaximumNumberOfResults); - DistanceVector SquaredResultsDistances(MaximumNumberOfResults); - - if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) - KRATOS_ERROR<<"Add ----NODAL_H---- variable!!!!!! ERROR"; - - double sigma = 0.0; - if (TDim == 2) - sigma = 10.0 / (7.0 * 3.1415926); - else - sigma = 1.0 / 3.1415926; - - for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) - { - if((node_it)->FastGetSolutionStepValue(IS_INTERFACE)==1) - { //IS_FREE_SURFACE - work_point.X() = node_it->X(); - work_point.Y() = node_it->Y(); - work_point.Z() = node_it->Z(); - //KRATOS_ERROR(std::logic_error, "Add ----NODAL_H---- variable!!!!!! ERROR", ""); - double radius = 2.0 * node_it->FastGetSolutionStepValue(NODAL_H); - - //find all of the new nodes within the radius - int number_of_points_in_radius; - - //look between the new nodes which of them is inside the radius of the circumscribed cyrcle - number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); - - if (number_of_points_in_radius > 0) - { - //double& temperature = (node_it)->FastGetSolutionStepValue(TEMPERATURE); - double temperature_aux = 0.0; - double tot_weight = 0.0; - for (int k = 0; k < number_of_points_in_radius; k++) - { - double distance = sqrt(*(SquaredResultsDistances.begin() + k)); - double weight = SPHCubicKernel(sigma, distance, radius); - PointIterator it_found = Results.begin() + k; - //if((*it_found)->FastGetSolutionStepValue(IS_BOUNDARY)>0.5) //MATERIAL_VARIABLE - if((*it_found)->FastGetSolutionStepValue(IS_FREE_SURFACE) ==1 or (*it_found)->FastGetSolutionStepValue(IS_WATER) ==1 ) //MATERIAL_VARIABLE - { - double tempp=0.0; - tempp=(*it_found)->FastGetSolutionStepValue(YCH4); - //KRATOS_ERROR(std::logic_error, "nodo without temperature", ""); - if(tempp<298.0) tempp=298.0; - //else tempp=(*it_found)->FastGetSolutionStepValue(YCH4); - temperature_aux += weight * tempp;//temperature - tot_weight += weight; - //KRATOS_ERROR(std::logic_error, "Add ----NODAL_H---- variable!!!!!! ERROR", ""); - } - } - if(tot_weight>0.0) - { - temperature_aux /= tot_weight; - (node_it)->FastGetSolutionStepValue(FUEL)=temperature_aux; - } - else - { - KRATOS_WATCH(tot_weight); - KRATOS_WATCH((node_it)->X()); - KRATOS_WATCH((node_it)->Y()); - if((node_it)->FastGetSolutionStepValue(TEMPERATURE)<298.0) (node_it)->FastGetSolutionStepValue(FUEL)=298.0; - else (node_it)->FastGetSolutionStepValue(FUEL)=(node_it)->FastGetSolutionStepValue(TEMPERATURE); - } - } - } - else - { - //(node_it)->FastGetSolutionStepValue(FUEL)=(node_it)->FastGetSolutionStepValue(TEMPERATURE); - } - } - KRATOS_CATCH("") - } - - void TransferToEulerianMeshShapeBased_aux(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart, BinBasedFastPointLocator& node_locator) - { - KRATOS_TRY - - Vector N; - const int max_results = 1000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - const int nparticles = rLagrangianModelPart.Nodes().size(); - -#pragma omp parallel for firstprivate(results,N) - for (int i = 0; i < nparticles; i++) - { - ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; - - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - - Element::Pointer pelement; - - bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); - - if (is_found == true) - { - Geometry >& geom = pelement->GetGeometry(); - BoundedMatrix msDN_DX; - array_1d N; - //array_1d N; - double Area=0.0; - GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); - - int s0=0; - int s1=0; - int s2=0; - int sum=0; - if(geom[0].FastGetSolutionStepValue(IS_INTERFACE)>0.5) s0=1; //IS_INTERFACE - if(geom[1].FastGetSolutionStepValue(IS_INTERFACE)>0.5) s1=1; - if(geom[2].FastGetSolutionStepValue(IS_INTERFACE)>0.5) s2=1; - sum=s0 + s1 + s2; - array_1d qrad=ZeroVector(2); - array_1d qrad_P1=ZeroVector(2); - array_1d interface_segment=ZeroVector(2); - array_1d normaledge1=ZeroVector(2); - for (unsigned int jj = 0; jj < 2; jj++) - { - for (unsigned int kk = 0; kk < 3; kk++) - { - qrad[jj] += msDN_DX(kk, jj) * geom[kk].FastGetSolutionStepValue(TEMPERATURE); - qrad_P1[jj] += msDN_DX(kk, jj) * geom[kk].FastGetSolutionStepValue(INCIDENT_RADIATION_FUNCTION); - } - } - - double faceheatflux=0.0; - //double faceheatflux_P1=0.0; - if(sum==2) - { - if((geom[1].FastGetSolutionStepValue(IS_INTERFACE)>0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE)>0.5)) //IS_INTERFACE - { - double norm=0.0; - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - interface_segment[0] = (geom[0].X()-geom[1].X()); - interface_segment[1] = (geom[0].Y()-geom[1].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - //double area1=norm; - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - - if((geom[1].FastGetSolutionStepValue(IS_INTERFACE)>0.5 && geom[2].FastGetSolutionStepValue(IS_INTERFACE)>0.5)) - { - double norm=0.0; - interface_segment[0] = (geom[1].X()-geom[2].X()); - interface_segment[1] = (geom[1].Y()-geom[2].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - //double area1=norm; - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - if((geom[2].FastGetSolutionStepValue(IS_INTERFACE)>0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE)>0.5)) - { - double norm=0.0; - interface_segment[0] = (geom[2].X()-geom[0].X()); - interface_segment[1] = (geom[2].Y()-geom[0].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - } - if(sum==1) - { - if((geom[1].FastGetSolutionStepValue(IS_INTERFACE)<0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE)<0.5)) //IS_INTERFACE - { - double norm=0.0; - interface_segment[0] = (geom[0].X()-geom[1].X()); - interface_segment[1] = (geom[0].Y()-geom[1].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - if((geom[1].FastGetSolutionStepValue(IS_INTERFACE)<0.5 && geom[2].FastGetSolutionStepValue(IS_INTERFACE)<0.5)) - { - double norm=0.0; - interface_segment[0] = (geom[1].X()-geom[2].X()); - interface_segment[1] = (geom[1].Y()-geom[2].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - if((geom[2].FastGetSolutionStepValue(IS_INTERFACE)<0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE)<0.5)) - { - double norm=0.0; - interface_segment[0] = (geom[2].X()-geom[0].X()); - interface_segment[1] = (geom[2].Y()-geom[0].Y()); - norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); - normaledge1(0)= -interface_segment[1]/norm; - normaledge1(1)= interface_segment[0]/norm; - faceheatflux += abs(1.0*(qrad[0]*normaledge1(0)+qrad[1]*normaledge1(1))*0.0131); - } - } - - (iparticle)->FastGetSolutionStepValue(FACE_HEAT_FLUX)+=(faceheatflux /*+ fhf+ faceheatflux_P1*/); - } - } - KRATOS_CATCH("") - } - ///3D - void CalculateNormal(ModelPart& full_model_part) - { - KRATOS_TRY - //resetting the normals - array_1d zero; - noalias(zero) = ZeroVector(3); - - for(ModelPart::NodesContainerType::const_iterator in = full_model_part.NodesBegin(); in!=full_model_part.NodesEnd(); in++) - { - in->FastGetSolutionStepValue(NORMAL) = zero; - } - - array_1d v1; - array_1d v2; - //array_1d& An =zero; - //double area_normal=0.0; - array_1d area_normal; - - for(ModelPart::ElementsContainerType::iterator iii = full_model_part.ElementsBegin(); iii != full_model_part.ElementsEnd(); iii++) - { - if( iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) - { - v1[0] = iii->GetGeometry()[1].X() -iii->GetGeometry()[3].X(); - v1[1] = iii->GetGeometry()[1].Y() - iii->GetGeometry()[3].Y(); - v1[2] = iii->GetGeometry()[1].Z() - iii->GetGeometry()[3].Z(); - - v2[0] = iii->GetGeometry()[2].X() - iii->GetGeometry()[3].X(); - v2[1] = iii->GetGeometry()[2].Y() - iii->GetGeometry()[3].Y(); - v2[2] = iii->GetGeometry()[2].Z() - iii->GetGeometry()[3].Z(); - - MathUtils::CrossProduct(area_normal,v1,v2); - //area_normal *= -0.5; - - array_1d msAuxVec = ZeroVector(3); - double c0 = abs(area_normal[0]); - double c1 = abs(area_normal[1]); - double c2 = abs(area_normal[2]); - msAuxVec[0]=c0; - msAuxVec[1]=c1; - msAuxVec[2]=c2; - // double norm_c =norm_2(msAuxVec); - - double norm_u = msAuxVec[0]*msAuxVec[0] + msAuxVec[1]*msAuxVec[1] + msAuxVec[2]*msAuxVec[2]; - double norm_c =sqrt(norm_u); - - iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - - } - if( iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + PointIterator it_found = Results.begin() + k; + + if ((*it_found)->FastGetSolutionStepValue(IS_INTERFACE) == 1) //MATERIAL_VARIABLE + { + temperature_aux += weight * (*it_found)->FastGetSolutionStepValue(INCIDENT_RADIATION_FUNCTION); //);//FACE_HEAT_FLUX + tot_weight += weight; + } + } + if (tot_weight > 0.0) + { + temperature_aux /= tot_weight; + + temperature += (0.5 * temperature_aux * 1.00); //1.5 //1.25 + } + } + } + } + KRATOS_CATCH("") + } + + void TransferToEulerianMesh(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart) + { + KRATOS_TRY + + //defintions for spatial search + typedef Node<3> PointType; + typedef Node<3>::Pointer PointTypePointer; + typedef std::vector PointVector; + typedef std::vector::iterator PointIterator; + typedef std::vector DistanceVector; + typedef std::vector::iterator DistanceIterator; + + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; + //************* + // Bucket types + typedef Bucket BucketType; + + typedef Tree> tree; //Kdtree; + + //starting calculating time of construction of the kdtree + boost::timer kdtree_construction; + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + PointTypePointer pnode = *(node_it.base()); + + //putting the nodes of the destination_model part in an auxiliary list + list_of_nodes.push_back(pnode); + } + + std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; + + //create a spatial database with the list of new nodes + unsigned int bucket_size = 20; + tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); + + //work arrays + Node<3> work_point(0, 0.0, 0.0, 0.0); + unsigned int MaximumNumberOfResults = 10000; + PointVector Results(MaximumNumberOfResults); + DistanceVector SquaredResultsDistances(MaximumNumberOfResults); + + if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) + KRATOS_ERROR << "Add ----NODAL_H---- variable!!!!!! ERROR"; + + double sigma = 0.0; + if (TDim == 2) + sigma = 10.0 / (7.0 * 3.1415926); + else + sigma = 1.0 / 3.1415926; + + for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) + { + if ((node_it)->FastGetSolutionStepValue(IS_INTERFACE) == 1) + { //IS_FREE_SURFACE + work_point.X() = node_it->X(); + work_point.Y() = node_it->Y(); + work_point.Z() = node_it->Z(); + //KRATOS_ERROR(std::logic_error, "Add ----NODAL_H---- variable!!!!!! ERROR", ""); + double radius = 2.0 * node_it->FastGetSolutionStepValue(NODAL_H); + + //find all of the new nodes within the radius + int number_of_points_in_radius; + + //look between the new nodes which of them is inside the radius of the circumscribed cyrcle + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); + + if (number_of_points_in_radius > 0) + { + //double& temperature = (node_it)->FastGetSolutionStepValue(TEMPERATURE); + double temperature_aux = 0.0; + double tot_weight = 0.0; + for (int k = 0; k < number_of_points_in_radius; k++) + { + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + PointIterator it_found = Results.begin() + k; + //if((*it_found)->FastGetSolutionStepValue(IS_BOUNDARY)>0.5) //MATERIAL_VARIABLE + if ((*it_found)->FastGetSolutionStepValue(IS_FREE_SURFACE) == 1 || (*it_found)->FastGetSolutionStepValue(IS_WATER) == 1) //MATERIAL_VARIABLE + { + double tempp = 0.0; + tempp = (*it_found)->FastGetSolutionStepValue(YCH4); + //KRATOS_ERROR(std::logic_error, "nodo without temperature", ""); + if (tempp < 298.0) + tempp = 298.0; + //else tempp=(*it_found)->FastGetSolutionStepValue(YCH4); + temperature_aux += weight * tempp; //temperature + tot_weight += weight; + //KRATOS_ERROR(std::logic_error, "Add ----NODAL_H---- variable!!!!!! ERROR", ""); + } + } + if (tot_weight > 0.0) + { + temperature_aux /= tot_weight; + (node_it)->FastGetSolutionStepValue(FUEL) = temperature_aux; + } + else + { + KRATOS_WATCH(tot_weight); + KRATOS_WATCH((node_it)->X()); + KRATOS_WATCH((node_it)->Y()); + if ((node_it)->FastGetSolutionStepValue(TEMPERATURE) < 298.0) + (node_it)->FastGetSolutionStepValue(FUEL) = 298.0; + else + (node_it)->FastGetSolutionStepValue(FUEL) = (node_it)->FastGetSolutionStepValue(TEMPERATURE); + } + } + } + else + { + //(node_it)->FastGetSolutionStepValue(FUEL)=(node_it)->FastGetSolutionStepValue(TEMPERATURE); + } + } + KRATOS_CATCH("") + } + + void TransferToEulerianMeshShapeBased_aux(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart, BinBasedFastPointLocator &node_locator) + { + KRATOS_TRY + + Vector N; + const int max_results = 1000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + const int nparticles = rLagrangianModelPart.Nodes().size(); + +#pragma omp parallel for firstprivate(results, N) + for (int i = 0; i < nparticles; i++) + { + ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; + + Node<3>::Pointer pparticle = *(iparticle.base()); + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + + Element::Pointer pelement; + + bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); + + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + BoundedMatrix msDN_DX; + array_1d N; + //array_1d N; + double Area = 0.0; + GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); + + int s0 = 0; + int s1 = 0; + int s2 = 0; + int sum = 0; + if (geom[0].FastGetSolutionStepValue(IS_INTERFACE) > 0.5) + s0 = 1; //IS_INTERFACE + if (geom[1].FastGetSolutionStepValue(IS_INTERFACE) > 0.5) + s1 = 1; + if (geom[2].FastGetSolutionStepValue(IS_INTERFACE) > 0.5) + s2 = 1; + sum = s0 + s1 + s2; + array_1d qrad = ZeroVector(2); + array_1d qrad_P1 = ZeroVector(2); + array_1d interface_segment = ZeroVector(2); + array_1d normaledge1 = ZeroVector(2); + for (unsigned int jj = 0; jj < 2; jj++) + { + for (unsigned int kk = 0; kk < 3; kk++) + { + qrad[jj] += msDN_DX(kk, jj) * geom[kk].FastGetSolutionStepValue(TEMPERATURE); + qrad_P1[jj] += msDN_DX(kk, jj) * geom[kk].FastGetSolutionStepValue(INCIDENT_RADIATION_FUNCTION); + } + } + + double faceheatflux = 0.0; + //double faceheatflux_P1=0.0; + if (sum == 2) + { + if ((geom[1].FastGetSolutionStepValue(IS_INTERFACE) > 0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE) > 0.5)) //IS_INTERFACE + { + double norm = 0.0; + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + interface_segment[0] = (geom[0].X() - geom[1].X()); + interface_segment[1] = (geom[0].Y() - geom[1].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + //double area1=norm; + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + + if ((geom[1].FastGetSolutionStepValue(IS_INTERFACE) > 0.5 && geom[2].FastGetSolutionStepValue(IS_INTERFACE) > 0.5)) + { + double norm = 0.0; + interface_segment[0] = (geom[1].X() - geom[2].X()); + interface_segment[1] = (geom[1].Y() - geom[2].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + //double area1=norm; + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + if ((geom[2].FastGetSolutionStepValue(IS_INTERFACE) > 0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE) > 0.5)) + { + double norm = 0.0; + interface_segment[0] = (geom[2].X() - geom[0].X()); + interface_segment[1] = (geom[2].Y() - geom[0].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + } + if (sum == 1) + { + if ((geom[1].FastGetSolutionStepValue(IS_INTERFACE) < 0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE) < 0.5)) //IS_INTERFACE + { + double norm = 0.0; + interface_segment[0] = (geom[0].X() - geom[1].X()); + interface_segment[1] = (geom[0].Y() - geom[1].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + if ((geom[1].FastGetSolutionStepValue(IS_INTERFACE) < 0.5 && geom[2].FastGetSolutionStepValue(IS_INTERFACE) < 0.5)) + { + double norm = 0.0; + interface_segment[0] = (geom[1].X() - geom[2].X()); + interface_segment[1] = (geom[1].Y() - geom[2].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + if ((geom[2].FastGetSolutionStepValue(IS_INTERFACE) < 0.5 && geom[0].FastGetSolutionStepValue(IS_INTERFACE) < 0.5)) + { + double norm = 0.0; + interface_segment[0] = (geom[2].X() - geom[0].X()); + interface_segment[1] = (geom[2].Y() - geom[0].Y()); + norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); + normaledge1(0) = -interface_segment[1] / norm; + normaledge1(1) = interface_segment[0] / norm; + faceheatflux += abs(1.0 * (qrad[0] * normaledge1(0) + qrad[1] * normaledge1(1)) * 0.0131); + } + } + + (iparticle)->FastGetSolutionStepValue(FACE_HEAT_FLUX) += (faceheatflux /*+ fhf+ faceheatflux_P1*/); + } + } + KRATOS_CATCH("") + } + ///3D + void CalculateNormal(ModelPart &full_model_part) { - v1[0] = iii->GetGeometry()[0].X() -iii->GetGeometry()[2].X(); - v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[2].Y(); - v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[2].Z(); - - v2[0] = iii->GetGeometry()[3].X() - iii->GetGeometry()[2].X(); - v2[1] = iii->GetGeometry()[3].Y() - iii->GetGeometry()[2].Y(); - v2[2] = iii->GetGeometry()[3].Z() - iii->GetGeometry()[2].Z(); - MathUtils::CrossProduct(area_normal,v1,v2); - //area_normal *= -0.5; - array_1d msAuxVec = ZeroVector(3); - double c0 = abs(area_normal[0]); - double c1 = abs(area_normal[1]); - double c2 = abs(area_normal[2]); - msAuxVec[0]=c0; - msAuxVec[1]=c1; - msAuxVec[2]=c2; - //double norm_c =norm_2(msAuxVec); - - double norm_u = msAuxVec[0]*msAuxVec[0] + msAuxVec[1]*msAuxVec[1] + msAuxVec[2]*msAuxVec[2]; - double norm_c =sqrt(norm_u); - - iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; + KRATOS_TRY + //resetting the normals + array_1d zero; + noalias(zero) = ZeroVector(3); + + for (ModelPart::NodesContainerType::const_iterator in = full_model_part.NodesBegin(); in != full_model_part.NodesEnd(); in++) + { + in->FastGetSolutionStepValue(NORMAL) = zero; + } + + array_1d v1; + array_1d v2; + //array_1d& An =zero; + //double area_normal=0.0; + array_1d area_normal; + + for (ModelPart::ElementsContainerType::iterator iii = full_model_part.ElementsBegin(); iii != full_model_part.ElementsEnd(); iii++) + { + if (iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + { + v1[0] = iii->GetGeometry()[1].X() - iii->GetGeometry()[3].X(); + v1[1] = iii->GetGeometry()[1].Y() - iii->GetGeometry()[3].Y(); + v1[2] = iii->GetGeometry()[1].Z() - iii->GetGeometry()[3].Z(); + + v2[0] = iii->GetGeometry()[2].X() - iii->GetGeometry()[3].X(); + v2[1] = iii->GetGeometry()[2].Y() - iii->GetGeometry()[3].Y(); + v2[2] = iii->GetGeometry()[2].Z() - iii->GetGeometry()[3].Z(); + + MathUtils::CrossProduct(area_normal, v1, v2); + //area_normal *= -0.5; + + array_1d msAuxVec = ZeroVector(3); + double c0 = abs(area_normal[0]); + double c1 = abs(area_normal[1]); + double c2 = abs(area_normal[2]); + msAuxVec[0] = c0; + msAuxVec[1] = c1; + msAuxVec[2] = c2; + // double norm_c =norm_2(msAuxVec); + + double norm_u = msAuxVec[0] * msAuxVec[0] + msAuxVec[1] * msAuxVec[1] + msAuxVec[2] * msAuxVec[2]; + double norm_c = sqrt(norm_u); + + iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + } + if (iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + { + v1[0] = iii->GetGeometry()[0].X() - iii->GetGeometry()[2].X(); + v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[2].Y(); + v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[2].Z(); + + v2[0] = iii->GetGeometry()[3].X() - iii->GetGeometry()[2].X(); + v2[1] = iii->GetGeometry()[3].Y() - iii->GetGeometry()[2].Y(); + v2[2] = iii->GetGeometry()[3].Z() - iii->GetGeometry()[2].Z(); + MathUtils::CrossProduct(area_normal, v1, v2); + //area_normal *= -0.5; + array_1d msAuxVec = ZeroVector(3); + double c0 = abs(area_normal[0]); + double c1 = abs(area_normal[1]); + double c2 = abs(area_normal[2]); + msAuxVec[0] = c0; + msAuxVec[1] = c1; + msAuxVec[2] = c2; + //double norm_c =norm_2(msAuxVec); + + double norm_u = msAuxVec[0] * msAuxVec[0] + msAuxVec[1] * msAuxVec[1] + msAuxVec[2] * msAuxVec[2]; + double norm_c = sqrt(norm_u); + + iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + } + + if (iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + { + v1[0] = iii->GetGeometry()[0].X() - iii->GetGeometry()[3].X(); + v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[3].Y(); + v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[3].Z(); + + v2[0] = iii->GetGeometry()[1].X() - iii->GetGeometry()[3].X(); + v2[1] = iii->GetGeometry()[1].Y() - iii->GetGeometry()[3].Y(); + v2[2] = iii->GetGeometry()[1].Z() - iii->GetGeometry()[3].Z(); + + MathUtils::CrossProduct(area_normal, v1, v2); + //area_normal *= -0.5; + array_1d msAuxVec = ZeroVector(3); + double c0 = abs(area_normal[0]); + double c1 = abs(area_normal[1]); + double c2 = abs(area_normal[2]); + msAuxVec[0] = c0; + msAuxVec[1] = c1; + msAuxVec[2] = c2; + + double norm_u = msAuxVec[0] * msAuxVec[0] + msAuxVec[1] * msAuxVec[1] + msAuxVec[2] * msAuxVec[2]; + double norm_c = sqrt(norm_u); + + iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + } + if (iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + { + v1[0] = iii->GetGeometry()[0].X() - iii->GetGeometry()[1].X(); + v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[1].Y(); + v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[1].Z(); + + v2[0] = iii->GetGeometry()[2].X() - iii->GetGeometry()[1].X(); + v2[1] = iii->GetGeometry()[2].Y() - iii->GetGeometry()[1].Y(); + v2[2] = iii->GetGeometry()[2].Z() - iii->GetGeometry()[1].Z(); + + MathUtils::CrossProduct(area_normal, v1, v2); + //area_normal *= -0.5; + array_1d msAuxVec = ZeroVector(3); + double c0 = abs(area_normal[0]); + double c1 = abs(area_normal[1]); + double c2 = abs(area_normal[2]); + msAuxVec[0] = c0; + msAuxVec[1] = c1; + msAuxVec[2] = c2; + // double norm_c =norm_2(msAuxVec); + + double norm_u = msAuxVec[0] * msAuxVec[0] + msAuxVec[1] * msAuxVec[1] + msAuxVec[2] * msAuxVec[2]; + double norm_c = sqrt(norm_u); + + iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal / norm_c; + } + } + for (ModelPart::NodesContainerType::iterator iii = full_model_part.NodesBegin(); iii != full_model_part.NodesEnd(); iii++) + { + + if (iii->FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + { + array_1d &value_y1 = iii->FastGetSolutionStepValue(NORMAL); + double norm_y1 = norm_2(value_y1); + value_y1 /= (norm_y1 + 1e-9); + } + } + + KRATOS_CATCH("") } - if( iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[3].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + void TransferToEulerianMeshShapeBased_aux_3D(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart, BinBasedFastPointLocator &node_locator) { - v1[0] = iii->GetGeometry()[0].X() -iii->GetGeometry()[3].X(); - v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[3].Y(); - v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[3].Z(); - - v2[0] = iii->GetGeometry()[1].X() - iii->GetGeometry()[3].X(); - v2[1] = iii->GetGeometry()[1].Y() - iii->GetGeometry()[3].Y(); - v2[2] = iii->GetGeometry()[1].Z() - iii->GetGeometry()[3].Z(); - - MathUtils::CrossProduct(area_normal,v1,v2); - //area_normal *= -0.5; - array_1d msAuxVec = ZeroVector(3); - double c0 = abs(area_normal[0]); - double c1 = abs(area_normal[1]); - double c2 = abs(area_normal[2]); - msAuxVec[0]=c0; - msAuxVec[1]=c1; - msAuxVec[2]=c2; - - double norm_u = msAuxVec[0]*msAuxVec[0] + msAuxVec[1]*msAuxVec[1] + msAuxVec[2]*msAuxVec[2]; - double norm_c =sqrt(norm_u); - - iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[3].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; + KRATOS_TRY + //typedef Node < 3 > PointType; + //typedef Node < 3 > ::Pointer PointTypePointer; + Vector N; + const int max_results = 1000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + const int nparticles = rLagrangianModelPart.Nodes().size(); +#pragma omp parallel for firstprivate(results, N) + for (int i = 0; i < nparticles; i++) + { + ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; + Node<3>::Pointer pparticle = *(iparticle.base()); + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + Element::Pointer pelement; + bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + BoundedMatrix msDN_DX; + array_1d N; + double Area = 0.0; + GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); + array_1d qrad = ZeroVector(3); + double temmp = 0.0; + for (unsigned int jj = 0; jj < 3; jj++) + { + for (unsigned int kk = 0; kk < 4; kk++) + { + temmp = geom[kk].FastGetSolutionStepValue(TEMPERATURE); + if (temmp < 298.0) + temmp = 298.0; + qrad[jj] += msDN_DX(kk, jj) * temmp; //geom[kk].FastGetSolutionStepValue(TEMPERATURE); + } + } + //double faceheatflux=0.0; + (iparticle)->FastGetSolutionStepValue(NORMAL) *= (-1.0); + (iparticle)->FastGetSolutionStepValue(FACE_HEAT_FLUX) += abs((iparticle)->FastGetSolutionStepValue(NORMAL_X) * qrad[0] + (iparticle)->FastGetSolutionStepValue(NORMAL_Y) * qrad[1] + (iparticle)->FastGetSolutionStepValue(NORMAL_Z) * qrad[2]) * 0.0131; + } + } + KRATOS_CATCH("") } - if( iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0 && iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) == 1.0) + //restarting the step from the beginning + void RestartStep(ModelPart &rModelPart) { - v1[0] = iii->GetGeometry()[0].X() -iii->GetGeometry()[1].X(); - v1[1] = iii->GetGeometry()[0].Y() - iii->GetGeometry()[1].Y(); - v1[2] = iii->GetGeometry()[0].Z() - iii->GetGeometry()[1].Z(); - - v2[0] = iii->GetGeometry()[2].X() - iii->GetGeometry()[1].X(); - v2[1] = iii->GetGeometry()[2].Y() - iii->GetGeometry()[1].Y(); - v2[2] = iii->GetGeometry()[2].Z() - iii->GetGeometry()[1].Z(); - - MathUtils::CrossProduct(area_normal,v1,v2); - //area_normal *= -0.5; - array_1d msAuxVec = ZeroVector(3); - double c0 = abs(area_normal[0]); - double c1 = abs(area_normal[1]); - double c2 = abs(area_normal[2]); - msAuxVec[0]=c0; - msAuxVec[1]=c1; - msAuxVec[2]=c2; - // double norm_c =norm_2(msAuxVec); - - double norm_u = msAuxVec[0]*msAuxVec[0] + msAuxVec[1]*msAuxVec[1] + msAuxVec[2]*msAuxVec[2]; - double norm_c =sqrt(norm_u); - - iii->GetGeometry()[0].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[2].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; - iii->GetGeometry()[1].FastGetSolutionStepValue(NORMAL) += area_normal/ norm_c; + KRATOS_TRY; + + //setting the variables to their value at the beginning of the time step + rModelPart.OverwriteSolutionStepData(1, 0); + + //setting the coordinates to their value at the beginning of the step + for (ModelPart::NodesContainerType::iterator node_it = rModelPart.NodesBegin(); node_it != rModelPart.NodesEnd(); node_it++) + { + array_1d &coords = node_it->Coordinates(); + const array_1d &old_disp = node_it->FastGetSolutionStepValue(DISPLACEMENT, 1); + + coords[0] = node_it->X0() + old_disp[0]; + coords[1] = node_it->Y0() + old_disp[1]; + coords[2] = node_it->Z0() + old_disp[2]; + } + + KRATOS_CATCH(""); } - } - for(ModelPart::NodesContainerType::iterator iii = full_model_part.NodesBegin(); iii != full_model_part.NodesEnd(); iii++) - { - - if(iii->FastGetSolutionStepValue(IS_BOUNDARY)==1.0){ - array_1d& value_y1 = iii->FastGetSolutionStepValue(NORMAL); - double norm_y1 =norm_2(value_y1); - value_y1 /=(norm_y1 + 1e-9); - } - } - - KRATOS_CATCH("") - } - - void TransferToEulerianMeshShapeBased_aux_3D(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart, BinBasedFastPointLocator& node_locator) - { - KRATOS_TRY - //typedef Node < 3 > PointType; - //typedef Node < 3 > ::Pointer PointTypePointer; - Vector N; - const int max_results = 1000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - const int nparticles = rLagrangianModelPart.Nodes().size(); -#pragma omp parallel for firstprivate(results,N) - for (int i = 0; i < nparticles; i++) - { - ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - Element::Pointer pelement; - bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); - if (is_found == true) - { - Geometry >& geom = pelement->GetGeometry(); - BoundedMatrix msDN_DX; - array_1d N; - double Area=0.0; - GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); - array_1d qrad=ZeroVector(3); - double temmp=0.0; - for (unsigned int jj = 0; jj < 3; jj++) - { - for (unsigned int kk = 0; kk < 4; kk++) - { - temmp=geom[kk].FastGetSolutionStepValue(TEMPERATURE); - if(temmp<298.0) temmp=298.0; - qrad[jj] += msDN_DX(kk, jj) * temmp;//geom[kk].FastGetSolutionStepValue(TEMPERATURE); - } - } - //double faceheatflux=0.0; - (iparticle)->FastGetSolutionStepValue(NORMAL) *=(-1.0); - (iparticle)->FastGetSolutionStepValue(FACE_HEAT_FLUX) += abs( (iparticle)->FastGetSolutionStepValue(NORMAL_X) * qrad[0] + (iparticle)->FastGetSolutionStepValue(NORMAL_Y) * qrad[1] + (iparticle)->FastGetSolutionStepValue(NORMAL_Z) * qrad[2]) *0.0131; - - } - } - KRATOS_CATCH("") - } - //restarting the step from the beginning - void RestartStep(ModelPart & rModelPart) - { - KRATOS_TRY; - - //setting the variables to their value at the beginning of the time step - rModelPart.OverwriteSolutionStepData(1, 0); - - //setting the coordinates to their value at the beginning of the step - for (ModelPart::NodesContainerType::iterator node_it = rModelPart.NodesBegin();node_it != rModelPart.NodesEnd(); node_it++) - { - array_1d & coords = node_it->Coordinates(); - const array_1d & old_disp = node_it->FastGetSolutionStepValue(DISPLACEMENT, 1); - - coords[0] = node_it->X0() + old_disp[0]; - coords[1] = node_it->Y0() + old_disp[1]; - coords[2] = node_it->Z0() + old_disp[2]; - } - - - KRATOS_CATCH(""); - } - - - void MoveMesh_Streamlines_freesurfaceflows(ModelPart& rModelPart, unsigned int substeps) - { - const double dt = rModelPart.GetProcessInfo()[DELTA_TIME]; - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - BinBasedFastPointLocator SearchStructure(rModelPart); - SearchStructure.UpdateSearchDatabase(); - - //do movement - array_1d veulerian; - //double temperature=0.0; - array_1d acc_particle; - Vector N; - const int max_results = 10000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - - const int nparticles = rModelPart.Nodes().size(); - -#pragma omp parallel for firstprivate(results,N,veulerian,acc_particle) - for (int i = 0; i < nparticles; i++) - { - //int substep = 0; - int subdivisions = 5; - //double temperature=0.0; - ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - //small_dt = dt / subdivisions; - - bool do_move = true; - bool first_time=false; - iparticle->FastGetSolutionStepValue(DISTANCE)=0.0; - - iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY) = iparticle->FastGetSolutionStepValue(VELOCITY,1); //AUX_VEL - - if(iparticle->Is(SLIP)) do_move = false; - - //iparticle->FastGetSolutionStepValue(TEMPERATURE) = 298.0; - if( do_move == true ) //note that we suppose the velocity components to be all fixed - { - array_1d old_position = pparticle->Coordinates(); - array_1d current_position = pparticle->Coordinates(); - noalias(iparticle->GetInitialPosition()) = old_position; - iparticle->FastGetSolutionStepValue(DISPLACEMENT,1) = ZeroVector(3); - //array_1d & vel_particle = iparticle->FastGetSolutionStepValue(VELOCITY); - //subdivisions=10; - const double small_dt = dt / subdivisions; - // - for (int substep = 0; substep < subdivisions; substep++) - { - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - Element::Pointer pelement; - bool is_found = SearchStructure.FindPointOnMesh(current_position, N, pelement, result_begin, max_results); - iparticle->Set(TO_ERASE, true); - //(iparticle)->GetValue(ERASE_FLAG) = true; - //KRATOS_WATCH(is_found); - if (is_found == true) - { - Geometry< Node < 3 > >& geom = pelement->GetGeometry(); - //int nn=0; - noalias(veulerian) = ZeroVector(3); //0.0;//N[0] * geom[0].FastGetSolutionStepValue(VELOCITY,1); - //temperature=0.0;//N[0] * geom[0].FastGetSolutionStepValue(TEMPERATURE); - for (unsigned int k = 0; k < geom.size(); k++) - { - noalias(veulerian) += N[k] * geom[k].FastGetSolutionStepValue(VELOCITY,1); - } - /*if(iparticle->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET)==1) + void MoveMesh_Streamlines_freesurfaceflows(ModelPart &rModelPart, unsigned int substeps) + { + const double dt = rModelPart.GetProcessInfo()[DELTA_TIME]; + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + BinBasedFastPointLocator SearchStructure(rModelPart); + SearchStructure.UpdateSearchDatabase(); + + //do movement + array_1d veulerian; + //double temperature=0.0; + array_1d acc_particle; + Vector N; + const int max_results = 10000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + + const int nparticles = rModelPart.Nodes().size(); + +#pragma omp parallel for firstprivate(results, N, veulerian, acc_particle) + for (int i = 0; i < nparticles; i++) + { + //int substep = 0; + int subdivisions = 5; + //double temperature=0.0; + ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; + Node<3>::Pointer pparticle = *(iparticle.base()); + //small_dt = dt / subdivisions; + + bool do_move = true; + bool first_time = false; + iparticle->FastGetSolutionStepValue(DISTANCE) = 0.0; + + iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY) = iparticle->FastGetSolutionStepValue(VELOCITY, 1); //AUX_VEL + + if (iparticle->Is(SLIP)) + do_move = false; + + //iparticle->FastGetSolutionStepValue(TEMPERATURE) = 298.0; + if (do_move == true) //note that we suppose the velocity components to be all fixed + { + array_1d old_position = pparticle->Coordinates(); + array_1d current_position = pparticle->Coordinates(); + noalias(iparticle->GetInitialPosition()) = old_position; + iparticle->FastGetSolutionStepValue(DISPLACEMENT, 1) = ZeroVector(3); + //array_1d & vel_particle = iparticle->FastGetSolutionStepValue(VELOCITY); + //subdivisions=10; + const double small_dt = dt / subdivisions; + // + for (int substep = 0; substep < subdivisions; substep++) + { + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + Element::Pointer pelement; + bool is_found = SearchStructure.FindPointOnMesh(current_position, N, pelement, result_begin, max_results); + iparticle->Set(TO_ERASE, true); + //(iparticle)->GetValue(ERASE_FLAG) = true; + //KRATOS_WATCH(is_found); + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + //int nn=0; + noalias(veulerian) = ZeroVector(3); //0.0;//N[0] * geom[0].FastGetSolutionStepValue(VELOCITY,1); + //temperature=0.0;//N[0] * geom[0].FastGetSolutionStepValue(TEMPERATURE); + for (unsigned int k = 0; k < geom.size(); k++) + { + noalias(veulerian) += N[k] * geom[k].FastGetSolutionStepValue(VELOCITY, 1); + } + /*if(iparticle->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET)==1) { veulerian(0)*=0.0; veulerian(2)*=0.0; }*/ - first_time=true; - noalias(current_position) += small_dt*veulerian; - pparticle->Set(TO_ERASE, false); - iparticle->FastGetSolutionStepValue(DISTANCE) += small_dt; - iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY)=veulerian; - } - else - { - double time1=iparticle->FastGetSolutionStepValue(DISTANCE); - array_1d acc; - acc[0] = 0.0; - acc[1] = -10.0; - acc[2] = 0.0; - if( first_time == false /*&& iparticle->Is(SLIP) == false*/ ) - { - noalias(current_position) += small_dt *iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY); - //noalias(current_position) += small_dt * small_dt * acc; - pparticle->Set(TO_ERASE, false); - } - else - { - time1 -=small_dt; - //double tiempo_restante=dt-time1; - noalias(current_position) += small_dt *iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY); - //noalias(current_position) += small_dt * small_dt * acc; - pparticle->Set(TO_ERASE, false); - } - - } - }//for - - //update the displacement BUT DO NOT OVERWRITE THE POSITION!! - iparticle->FastGetSolutionStepValue(DISPLACEMENT) = current_position - iparticle->GetInitialPosition(); - //KRATOS_WATCH(iparticle->FastGetSolutionStepValue(DISPLACEMENT)); - }//move - } - //compute mesh velocity - for(ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it!=rModelPart.NodesEnd(); it++) - { - //array_1d& dn = it->FastGetSolutionStepValue(DISPLACEMENT,1); - array_1d& dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); - noalias(it->Coordinates()) = it->GetInitialPosition(); - noalias(it->Coordinates()) += dn1; - } - } - - void MoveLonelyNodes(ModelPart& ThisModelPart) - { - KRATOS_TRY; - double Dt = ThisModelPart.GetProcessInfo()[DELTA_TIME]; - array_1d DeltaDisp, acc; - - for(ModelPart::NodeIterator i = ThisModelPart.NodesBegin() ; - i != ThisModelPart.NodesEnd() ; ++i) - { - if( - (i)->Is(SLIP) == false && - (i)->GetValue(NEIGHBOUR_ELEMENTS).size() == 0 && - ((i)->GetDof(VELOCITY_X).IsFixed() == false || (i)->GetDof(VELOCITY_Y).IsFixed() == false || (i)->GetDof(VELOCITY_Z).IsFixed() == false) - ) - { - //i->Set(TO_ERASE,true); - //set to zero the pressure - (i)->FastGetSolutionStepValue(PRESSURE) = 0; - const array_1d& old_vel = (i)->FastGetSolutionStepValue(VELOCITY,1); - array_1d& vel = (i)->FastGetSolutionStepValue(VELOCITY); - //array_1d& acc = (i)->FastGetSolutionStepValue(ACCELERATION); - noalias(acc) = (i)->FastGetSolutionStepValue(BODY_FORCE); - acc[0]= 0.0; - acc[1]= -10.0; - acc[2]= 0.0; - noalias(vel) = old_vel; - noalias(vel) += Dt * acc ; - - //calculate displacements - //noalias(DeltaDisp) = Dt * vel; - - //array_1d& disp = i->FastGetSolutionStepValue(DISPLACEMENT); - //noalias(disp) = i->FastGetSolutionStepValue(DISPLACEMENT,1); - //noalias(disp) += DeltaDisp; - noalias(i->Coordinates()) += Dt * Dt * acc; - - } - - } - - KRATOS_CATCH("") - } - - - void MarkExcessivelyCloseNodes(ModelPart::NodesContainerType& rNodes) - { - KRATOS_TRY; - KRATOS_WATCH("ENTERD Mark close nodes") - //double fact2 = admissible_distance_factor*admissible_distance_factor; - - for(ModelPart::NodesContainerType::iterator in = rNodes.begin(); in!=rNodes.end(); in++) - { - if(in->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) ==1) //if it is not a wall node i can erase + first_time = true; + noalias(current_position) += small_dt * veulerian; + pparticle->Set(TO_ERASE, false); + iparticle->FastGetSolutionStepValue(DISTANCE) += small_dt; + iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY) = veulerian; + } + else + { + double time1 = iparticle->FastGetSolutionStepValue(DISTANCE); + array_1d acc; + acc[0] = 0.0; + acc[1] = -10.0; + acc[2] = 0.0; + if (first_time == false /*&& iparticle->Is(SLIP) == false*/) + { + noalias(current_position) += small_dt * iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY); + //noalias(current_position) += small_dt * small_dt * acc; + pparticle->Set(TO_ERASE, false); + } + else + { + time1 -= small_dt; + //double tiempo_restante=dt-time1; + noalias(current_position) += small_dt * iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY); + //noalias(current_position) += small_dt * small_dt * acc; + pparticle->Set(TO_ERASE, false); + } + } + } //for + + //update the displacement BUT DO NOT OVERWRITE THE POSITION!! + iparticle->FastGetSolutionStepValue(DISPLACEMENT) = current_position - iparticle->GetInitialPosition(); + //KRATOS_WATCH(iparticle->FastGetSolutionStepValue(DISPLACEMENT)); + } //move + } + //compute mesh velocity + for (ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it != rModelPart.NodesEnd(); it++) + { + //array_1d& dn = it->FastGetSolutionStepValue(DISPLACEMENT,1); + array_1d &dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); + noalias(it->Coordinates()) = it->GetInitialPosition(); + noalias(it->Coordinates()) += dn1; + } + } + + void MoveLonelyNodes(ModelPart &ThisModelPart) { + KRATOS_TRY; + double Dt = ThisModelPart.GetProcessInfo()[DELTA_TIME]; + array_1d DeltaDisp, acc; - int nf=0; - //loop on neighbours and erase if they are too close - for( GlobalPointersVector< Node<3> >::iterator i = in->GetValue(NEIGHBOUR_NODES).begin(); i != in->GetValue(NEIGHBOUR_NODES).end(); i++) - { + for (ModelPart::NodeIterator i = ThisModelPart.NodesBegin(); + i != ThisModelPart.NodesEnd(); ++i) + { + if ( + (i)->Is(SLIP) == false && + (i)->GetValue(NEIGHBOUR_ELEMENTS).size() == 0 && + ((i)->GetDof(VELOCITY_X).IsFixed() == false || (i)->GetDof(VELOCITY_Y).IsFixed() == false || (i)->GetDof(VELOCITY_Z).IsFixed() == false)) + { + //i->Set(TO_ERASE,true); + //set to zero the pressure + (i)->FastGetSolutionStepValue(PRESSURE) = 0; + const array_1d &old_vel = (i)->FastGetSolutionStepValue(VELOCITY, 1); + array_1d &vel = (i)->FastGetSolutionStepValue(VELOCITY); + //array_1d& acc = (i)->FastGetSolutionStepValue(ACCELERATION); + noalias(acc) = (i)->FastGetSolutionStepValue(BODY_FORCE); + acc[0] = 0.0; + acc[1] = -10.0; + acc[2] = 0.0; + noalias(vel) = old_vel; + noalias(vel) += Dt * acc; + + //calculate displacements + //noalias(DeltaDisp) = Dt * vel; + + //array_1d& disp = i->FastGetSolutionStepValue(DISPLACEMENT); + //noalias(disp) = i->FastGetSolutionStepValue(DISPLACEMENT,1); + //noalias(disp) += DeltaDisp; + noalias(i->Coordinates()) += Dt * Dt * acc; + } + } - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - if( /*i->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) ==1 and*/ i->FastGetSolutionStepValue(IS_FREE_SURFACE) ==1) //we can erase the current node only if the neighb is not to be erased + KRATOS_CATCH("") + } + + void MarkExcessivelyCloseNodes(ModelPart::NodesContainerType &rNodes) + { + KRATOS_TRY; + KRATOS_WATCH("ENTERD Mark close nodes") + //double fact2 = admissible_distance_factor*admissible_distance_factor; + + for (ModelPart::NodesContainerType::iterator in = rNodes.begin(); in != rNodes.end(); in++) { - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - nf++; - //KRATOS_WATCH(nf) + if (in->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) == 1) //if it is not a wall node i can erase + { + + int nf = 0; + //loop on neighbours and erase if they are too close + for (GlobalPointersVector>::iterator i = in->GetValue(NEIGHBOUR_NODES).begin(); i != in->GetValue(NEIGHBOUR_NODES).end(); i++) + { + + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + if (/*i->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) ==1 and*/ i->FastGetSolutionStepValue(IS_FREE_SURFACE) == 1) //we can erase the current node only if the neighb is not to be erased + { + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + nf++; + //KRATOS_WATCH(nf) + } + if (nf >= 2) + { + in->FastGetSolutionStepValue(IS_WATER) = 1; + + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + } + } + } } - if(nf>=2) {in->FastGetSolutionStepValue(IS_WATER)= 1; - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - } - } + KRATOS_CATCH("") } - } - - KRATOS_CATCH("") - } - - void TransferToParticlesAirVelocity(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart, BinBasedFastPointLocator& node_locator) - { - KRATOS_TRY - //defintions for spatial search - //typedef Node < 3 > PointType; - //typedef Node < 3 > ::Pointer PointTypePointer; + void TransferToParticlesAirVelocity(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart, BinBasedFastPointLocator &node_locator) + { + KRATOS_TRY + //defintions for spatial search + //typedef Node < 3 > PointType; + //typedef Node < 3 > ::Pointer PointTypePointer; - Vector N; - const int max_results = 1000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - const int nparticles = rLagrangianModelPart.Nodes().size(); + Vector N; + const int max_results = 1000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + const int nparticles = rLagrangianModelPart.Nodes().size(); -#pragma omp parallel for firstprivate(results,N) - for (int i = 0; i < nparticles; i++) - { - ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; - - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - - Element::Pointer pelement; - - bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); - - if (is_found == true) - { - Geometry >& geom = pelement->GetGeometry(); - - BoundedMatrix msDN_DX; - - array_1d N; - - double Area=0.0; - GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); - - array_1d velocity=ZeroVector(3); - - array_1d temmp=ZeroVector(3); - //double temmp=0.0; - for (unsigned int jj = 0; jj < 3; jj++) - { - temmp=geom[jj].FastGetSolutionStepValue(VELOCITY); - velocity =N(jj) * temmp; - } - //KRATOS_WATCH(qrad); - //double faceheatflux=0.0; - (iparticle)->FastGetSolutionStepValue(ANGULAR_VELOCITY) = velocity; - } - } - KRATOS_CATCH("") - } - - double Calculate_Vol(ModelPart & rLagrangianModelPart) - { - KRATOS_TRY - - //defintions for spatial search - //typedef Node < 3 > PointType; - //typedef Node < 3 > ::Pointer PointTypePointer; - - //particles - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); node_it != rLagrangianModelPart.NodesEnd(); node_it++) - { - if( node_it->GetValue(NEIGHBOUR_ELEMENTS).size() != 0) (node_it)->FastGetSolutionStepValue(K0) = 0.0; - //if( node_it->FastGetSolutionStepValue(NODAL_MASS) == 0.0) KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - } - - for (ModelPart::ElementsContainerType::iterator el_it = rLagrangianModelPart.ElementsBegin();el_it != rLagrangianModelPart.ElementsEnd(); el_it++) - { - - Geometry >& geom = el_it->GetGeometry(); - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double z0 = geom[0].Z(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double z1 = geom[1].Z(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); - double z2 = geom[2].Z(); - double x3 = geom[3].X(); - double y3 = geom[3].Y(); - double z3 = geom[3].Z(); - double area=0.0; - - area=CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); - - geom[0].FastGetSolutionStepValue(K0) += area * 0.25; - geom[1].FastGetSolutionStepValue(K0) += area * 0.25; - geom[2].FastGetSolutionStepValue(K0) += area * 0.25; - geom[3].FastGetSolutionStepValue(K0) += area * 0.25; - - } - - double sum=0.0; - - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); node_it != rLagrangianModelPart.NodesEnd(); node_it++) - { - - sum +=(node_it)->FastGetSolutionStepValue(K0) ; - } - - return sum; - - KRATOS_CATCH("") - } - - void DetectAllOilClusters(ModelPart & mp_local_model_part) - { - int mnumber_of_oil_clusters=0; - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - inode->FastGetSolutionStepValue(DIAMETER) = -1; //OIL_CLUSTER - } - - for (ModelPart::ElementsContainerType::iterator ielem = mp_local_model_part.ElementsBegin();ielem != mp_local_model_part.ElementsEnd(); ielem++) - { - Geometry< Node<3> >& geom = ielem->GetGeometry(); - if(geom.size()>1) - { - ielem->GetValue(DIAMETER) = -1; - } - } - - - //fist we paint all the nodes connected to the outlet: - int color = 0; - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - if(inode->IsFixed(POROSITY) && inode->FastGetSolutionStepValue(DIAMETER)!=0) //nodes connected to the outlet are flagged as cluster zero. // if(inode->IsFixed(CONNECTED_TO_OUTLET) && inode->FastGetSolutionStepValue(OIL_CLUSTER)!=0) - { - ColorOilClusters(inode, 0); - } - } - - //having painted those nodes, we proceed with the rest of the colours - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - if(inode->FastGetSolutionStepValue(DIAMETER) < 0 ) - { - color++; - ColorOilClusters(inode, color); - } - } - - for (ModelPart::ElementsContainerType::iterator ielem = mp_local_model_part.ElementsBegin(); ielem != mp_local_model_part.ElementsEnd(); ielem++) - { - Geometry< Node<3> >& geom = ielem->GetGeometry(); - if(geom.size()>1 && ielem->GetValue(DIAMETER) < 0 ) - { - color++; - ielem->GetValue(DIAMETER) = color; - } - } - - //finally we flag the nodes with cluster=0 as connected to outlet - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - if(inode->FastGetSolutionStepValue(DIAMETER) == 0) - inode->FastGetSolutionStepValue(POROSITY)=1.0; - } - - mnumber_of_oil_clusters = color; - - double area=0.0; - array_1d velocity_a=ZeroVector(3); - array_1d velocity_p=ZeroVector(3); - array_1d temmp=ZeroVector(3); - array_1d drag_coefficient=ZeroVector(3); - - //KRATOS_WATCH(mnumber_of_oil_clusters); - int zz= mnumber_of_oil_clusters + 1; - for(int jj=0; jj< zz; jj++ ) - { - if(jj!=0) - { - if(jj==0) KRATOS_ERROR<<"element with zero vol found"; - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - area=0.0; - velocity_a=ZeroVector(3); - velocity_p=ZeroVector(3); - drag_coefficient=ZeroVector(3); - int nn=0; - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - int colour_p = (inode)->FastGetSolutionStepValue(DIAMETER); - if(colour_p==jj) - { - area += (inode)->FastGetSolutionStepValue(K0); - velocity_a += (inode)->FastGetSolutionStepValue(ANGULAR_VELOCITY); - velocity_p += (inode)->FastGetSolutionStepValue(VELOCITY); - nn++; - } - } - velocity_a *=(1.0/nn); - velocity_p *=(1.0/nn); - //KRATOS_WATCH("AREA_ANTES"); - //KRATOS_WATCH("area"); - ComputedDragCoefficient(area, velocity_a, velocity_p, drag_coefficient ); - - for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) - { - int colour_p = (inode)->FastGetSolutionStepValue(DIAMETER); - if(colour_p==jj) - { - inode->FastGetSolutionStepValue(DRAG_FORCE_X)=drag_coefficient(0); - inode->FastGetSolutionStepValue(DRAG_FORCE_Y)=drag_coefficient(1); - inode->FastGetSolutionStepValue(DRAG_FORCE_Z)=drag_coefficient(2); - } - } - - } - - } - - } - - void ComputedDragCoefficient(double nodal_mass, array_1d velocity_air, array_1d velocity_polymer, array_1d & drag_coefficient ) - { - KRATOS_TRY - - double drag_coeff=0.0; - //array_1d drag_coefficient=ZeroVector(3); - //nodal_mass=0.0; - array_1d vrelative; - - //nodal_mass=(node_it)->FastGetSolutionStepValue(NODAL_MASS); - double aux=nodal_mass * 3.0/(3.0*3.1416); - double Radius= pow(aux, 0.3333333); - double area=4.0 * 3.1416 * Radius * Radius; - noalias(vrelative)=velocity_air-velocity_polymer; - double norm_u = norm_2(vrelative); - double reynolds = 2 * Radius * norm_u / 0.00001; // 2 * mRadius * mNormOfSlipVel / mKinematicViscosity - if (reynolds < 0.01) - { - reynolds = 0.01; - } - CalculateNewtonianDragCoefficient(reynolds, drag_coeff); - noalias(drag_coefficient) = 0.5 * 1.0 * area * drag_coeff * norm_u* vrelative * (1.0 / nodal_mass); //drag_coeff = 0.5 * mFluidDensity * area * drag_coeff * mNormOfSlipVel; - KRATOS_CATCH("") - } - - - - void CalculateNewtonianDragCoefficient(const double reynolds, double& drag_coeff) - { - KRATOS_TRY - - if (reynolds < 1){ - drag_coeff = 24.0; // Reynolds; - } - else { - if (reynolds > 1000){ - drag_coeff = 0.44; - } - else{ - drag_coeff = 24.0 / reynolds * (1.0 + 0.15 * pow(reynolds, 0.687)); - } - } - - KRATOS_CATCH("") - } - - - void ColorOilClusters(ModelPart::NodesContainerType::iterator iNode, const int color) - { - if(iNode->GetSolutionStepValue(DIAMETER) < 0 ) // if(iNode->GetSolutionStepValue(OIL_CLUSTER) < 0 && ( water_fraction<0.99999999999999 || theta>1.57079632679) ) - iNode->GetSolutionStepValue(DIAMETER)=color; - - ModelPart::NodesContainerType front_nodes; - GlobalPointersVector& r_neighbour_elements = iNode->GetValue(NEIGHBOUR_ELEMENTS); - for(GlobalPointersVector::iterator i_neighbour_element = r_neighbour_elements.begin() ; i_neighbour_element != r_neighbour_elements.end() ; i_neighbour_element++) - { - if(i_neighbour_element->GetValue(DIAMETER) < 0 ) - { - i_neighbour_element->SetValue(DIAMETER, color); - - Element::GeometryType& p_geometry = i_neighbour_element->GetGeometry(); - - for(unsigned int i = 0; i < p_geometry.size(); i++) - { - if(p_geometry[i].GetSolutionStepValue(DIAMETER) < 0 ) - { - p_geometry[i].GetSolutionStepValue(DIAMETER) = color; - front_nodes.push_back(p_geometry(i)); - } - } - } - } - while(!front_nodes.empty()) - { - ModelPart::NodesContainerType new_front_nodes; - for(ModelPart::NodesContainerType::iterator i_node = front_nodes.begin() ; i_node != front_nodes.end() ; i_node++) - { - GlobalPointersVector& r_neighbour_elements = i_node->GetValue(NEIGHBOUR_ELEMENTS); - for(GlobalPointersVector::iterator i_neighbour_element = r_neighbour_elements.begin() ; i_neighbour_element != r_neighbour_elements.end() ; i_neighbour_element++) - { - if(i_neighbour_element->GetValue(DIAMETER) < 0 ) - { - i_neighbour_element->SetValue(DIAMETER, color); - - Element::GeometryType& p_geometry = i_neighbour_element->GetGeometry(); - - for(unsigned int i = 0; i < p_geometry.size(); i++) - { - if(p_geometry[i].GetSolutionStepValue(DIAMETER) < 0 ) - { - p_geometry[i].GetSolutionStepValue(DIAMETER) = color; - new_front_nodes.push_back(p_geometry(i)); - } - } - } - } - } - front_nodes.clear();// (o resize ( 0 ), si clear no existe) - for( ModelPart::NodesContainerType::iterator i_node = new_front_nodes.begin() ; i_node != new_front_nodes.end() ; i_node++) - front_nodes.push_back(*(i_node.base())); - - } - } - - - void movethermocouples(ModelPart& rEulerianModelPart, ModelPart& rLagrangianModelPart, BinBasedFastPointLocator& node_locator) - { - KRATOS_TRY - array_1d veulerian; - double temperature; - Vector N; - //double G; - const int max_results = 1000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - double dt =0.01; - const int nparticles = rLagrangianModelPart.Nodes().size(); - -#pragma omp parallel for firstprivate(results,N,veulerian,temperature) - for (int i = 0; i < nparticles; i++) - { - ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; - - int subdivisions=5.0; - const double small_dt = dt / subdivisions; - for (unsigned int substep = 0; substep < subdivisions; substep++) - { - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - Element::Pointer pelement; - bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); - if (is_found == true) - { - Geometry< Node < 3 > >& geom = pelement->GetGeometry(); - - //move according to the streamline - noalias(veulerian) = N[0] * geom[0].FastGetSolutionStepValue(VELOCITY, 1); - temperature = N[0] * geom[0].FastGetSolutionStepValue(YCH4); - for (unsigned int k = 1; k < geom.size(); k++) - { - noalias(veulerian) += N[k] * geom[k].FastGetSolutionStepValue(VELOCITY, 1); - temperature += N[k] * geom[k].FastGetSolutionStepValue(YCH4); - //KRATOS_WATCH(geom[k].FastGetSolutionStepValue(YCH4)); - } - double & temp = (iparticle)->FastGetSolutionStepValue(YCH4); - temp =temperature; - veulerian(0) *=0.0; - veulerian(2) *=0.0; - array_1d & disp = (iparticle)->FastGetSolutionStepValue(DISPLACEMENT); - noalias(disp) += small_dt*veulerian; - noalias(iparticle->Coordinates()) = iparticle->GetInitialPosition(); - noalias(iparticle->Coordinates()) += iparticle->FastGetSolutionStepValue(DISPLACEMENT); - } - } - } - - KRATOS_CATCH("") - } - - void TransferToEulerianMesh_2(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart) - { - KRATOS_TRY - - //defintions for spatial search - typedef Node < 3 > PointType; - typedef Node < 3 > ::Pointer PointTypePointer; - typedef std::vector PointVector; - typedef std::vector::iterator PointIterator; - typedef std::vector DistanceVector; - typedef std::vector::iterator DistanceIterator; - - //creating an auxiliary list for the new nodes - PointVector list_of_nodes; - - //************* - // Bucket types - typedef Bucket< TDim, PointType, PointVector, PointTypePointer, PointIterator, DistanceIterator > BucketType; - - typedef Tree< KDTreePartition > tree; //Kdtree; - - - //starting calculating time of construction of the kdtree - boost::timer kdtree_construction; - - for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); - node_it != rLagrangianModelPart.NodesEnd(); ++node_it) - { - PointTypePointer pnode = *(node_it.base()); - - //putting the nodes of the destination_model part in an auxiliary list - list_of_nodes.push_back(pnode); - } - - std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; - - //create a spatial database with the list of new nodes - unsigned int bucket_size = 20; - tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); - - //work arrays - Node < 3 > work_point(0, 0.0, 0.0, 0.0); - unsigned int MaximumNumberOfResults = 10000; - PointVector Results(MaximumNumberOfResults); - DistanceVector SquaredResultsDistances(MaximumNumberOfResults); - - - if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) - KRATOS_ERROR<<"Add ----NODAL_H---- variable!!!!!! ERROR"; - - double sigma = 0.0; - - if (TDim == 2) - sigma = 10.0 / (7.0 * 3.1415926); - else - sigma = 1.0 / 3.1415926; - - for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) - { - if((node_it)->Y()< -0.15102 ) - { - work_point.X() = node_it->X(); - work_point.Y() = node_it->Y(); - work_point.Z() = node_it->Z(); - - double radius = 2.0 * node_it->FastGetSolutionStepValue(NODAL_H); - - //find all of the new nodes within the radius - int number_of_points_in_radius; - - //look between the new nodes which of them is inside the radius of the circumscribed cyrcle - number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); - - if (number_of_points_in_radius > 0) +#pragma omp parallel for firstprivate(results, N) + for (int i = 0; i < nparticles; i++) + { + ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; + + Node<3>::Pointer pparticle = *(iparticle.base()); + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + + Element::Pointer pelement; + + bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); + + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + + BoundedMatrix msDN_DX; + + array_1d N; + + double Area = 0.0; + GeometryUtils::CalculateGeometryData(geom, msDN_DX, N, Area); + + array_1d velocity = ZeroVector(3); + + array_1d temmp = ZeroVector(3); + //double temmp=0.0; + for (unsigned int jj = 0; jj < 3; jj++) + { + temmp = geom[jj].FastGetSolutionStepValue(VELOCITY); + velocity = N(jj) * temmp; + } + //KRATOS_WATCH(qrad); + //double faceheatflux=0.0; + (iparticle)->FastGetSolutionStepValue(ANGULAR_VELOCITY) = velocity; + } + } + KRATOS_CATCH("") + } + + double Calculate_Vol(ModelPart &rLagrangianModelPart) + { + KRATOS_TRY + + //defintions for spatial search + //typedef Node < 3 > PointType; + //typedef Node < 3 > ::Pointer PointTypePointer; + + //particles + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); node_it != rLagrangianModelPart.NodesEnd(); node_it++) + { + if (node_it->GetValue(NEIGHBOUR_ELEMENTS).size() != 0) + (node_it)->FastGetSolutionStepValue(K0) = 0.0; + //if( node_it->FastGetSolutionStepValue(NODAL_MASS) == 0.0) KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + } + + for (ModelPart::ElementsContainerType::iterator el_it = rLagrangianModelPart.ElementsBegin(); el_it != rLagrangianModelPart.ElementsEnd(); el_it++) + { + + Geometry> &geom = el_it->GetGeometry(); + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double z0 = geom[0].Z(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double z1 = geom[1].Z(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + double z2 = geom[2].Z(); + double x3 = geom[3].X(); + double y3 = geom[3].Y(); + double z3 = geom[3].Z(); + double area = 0.0; + + area = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); + + geom[0].FastGetSolutionStepValue(K0) += area * 0.25; + geom[1].FastGetSolutionStepValue(K0) += area * 0.25; + geom[2].FastGetSolutionStepValue(K0) += area * 0.25; + geom[3].FastGetSolutionStepValue(K0) += area * 0.25; + } + + double sum = 0.0; + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); node_it != rLagrangianModelPart.NodesEnd(); node_it++) + { + + sum += (node_it)->FastGetSolutionStepValue(K0); + } + + return sum; + + KRATOS_CATCH("") + } + + void DetectAllOilClusters(ModelPart &mp_local_model_part) + { + int mnumber_of_oil_clusters = 0; + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + inode->FastGetSolutionStepValue(DIAMETER) = -1; //OIL_CLUSTER + } + + for (ModelPart::ElementsContainerType::iterator ielem = mp_local_model_part.ElementsBegin(); ielem != mp_local_model_part.ElementsEnd(); ielem++) + { + Geometry> &geom = ielem->GetGeometry(); + if (geom.size() > 1) + { + ielem->GetValue(DIAMETER) = -1; + } + } + + //fist we paint all the nodes connected to the outlet: + int color = 0; + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + if (inode->IsFixed(POROSITY) && inode->FastGetSolutionStepValue(DIAMETER) != 0) //nodes connected to the outlet are flagged as cluster zero. // if(inode->IsFixed(CONNECTED_TO_OUTLET) && inode->FastGetSolutionStepValue(OIL_CLUSTER)!=0) + { + ColorOilClusters(inode, 0); + } + } + + //having painted those nodes, we proceed with the rest of the colours + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + if (inode->FastGetSolutionStepValue(DIAMETER) < 0) + { + color++; + ColorOilClusters(inode, color); + } + } + + for (ModelPart::ElementsContainerType::iterator ielem = mp_local_model_part.ElementsBegin(); ielem != mp_local_model_part.ElementsEnd(); ielem++) + { + Geometry> &geom = ielem->GetGeometry(); + if (geom.size() > 1 && ielem->GetValue(DIAMETER) < 0) + { + color++; + ielem->GetValue(DIAMETER) = color; + } + } + + //finally we flag the nodes with cluster=0 as connected to outlet + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + if (inode->FastGetSolutionStepValue(DIAMETER) == 0) + inode->FastGetSolutionStepValue(POROSITY) = 1.0; + } + + mnumber_of_oil_clusters = color; + + double area = 0.0; + array_1d velocity_a = ZeroVector(3); + array_1d velocity_p = ZeroVector(3); + array_1d temmp = ZeroVector(3); + array_1d drag_coefficient = ZeroVector(3); + + //KRATOS_WATCH(mnumber_of_oil_clusters); + int zz = mnumber_of_oil_clusters + 1; + for (int jj = 0; jj < zz; jj++) + { + if (jj != 0) + { + if (jj == 0) + KRATOS_ERROR << "element with zero vol found"; + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + area = 0.0; + velocity_a = ZeroVector(3); + velocity_p = ZeroVector(3); + drag_coefficient = ZeroVector(3); + int nn = 0; + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + int colour_p = (inode)->FastGetSolutionStepValue(DIAMETER); + if (colour_p == jj) + { + area += (inode)->FastGetSolutionStepValue(K0); + velocity_a += (inode)->FastGetSolutionStepValue(ANGULAR_VELOCITY); + velocity_p += (inode)->FastGetSolutionStepValue(VELOCITY); + nn++; + } + } + velocity_a *= (1.0 / nn); + velocity_p *= (1.0 / nn); + //KRATOS_WATCH("AREA_ANTES"); + //KRATOS_WATCH("area"); + ComputedDragCoefficient(area, velocity_a, velocity_p, drag_coefficient); + + for (ModelPart::NodesContainerType::iterator inode = mp_local_model_part.NodesBegin(); inode != mp_local_model_part.NodesEnd(); inode++) + { + int colour_p = (inode)->FastGetSolutionStepValue(DIAMETER); + if (colour_p == jj) + { + inode->FastGetSolutionStepValue(DRAG_FORCE_X) = drag_coefficient(0); + inode->FastGetSolutionStepValue(DRAG_FORCE_Y) = drag_coefficient(1); + inode->FastGetSolutionStepValue(DRAG_FORCE_Z) = drag_coefficient(2); + } + } + } + } + } + + void ComputedDragCoefficient(double nodal_mass, array_1d velocity_air, array_1d velocity_polymer, array_1d &drag_coefficient) + { + KRATOS_TRY + + double drag_coeff = 0.0; + //array_1d drag_coefficient=ZeroVector(3); + //nodal_mass=0.0; + array_1d vrelative; + + //nodal_mass=(node_it)->FastGetSolutionStepValue(NODAL_MASS); + double aux = nodal_mass * 3.0 / (3.0 * 3.1416); + double Radius = pow(aux, 0.3333333); + double area = 4.0 * 3.1416 * Radius * Radius; + noalias(vrelative) = velocity_air - velocity_polymer; + double norm_u = norm_2(vrelative); + double reynolds = 2 * Radius * norm_u / 0.00001; // 2 * mRadius * mNormOfSlipVel / mKinematicViscosity + if (reynolds < 0.01) + { + reynolds = 0.01; + } + CalculateNewtonianDragCoefficient(reynolds, drag_coeff); + noalias(drag_coefficient) = 0.5 * 1.0 * area * drag_coeff * norm_u * vrelative * (1.0 / nodal_mass); //drag_coeff = 0.5 * mFluidDensity * area * drag_coeff * mNormOfSlipVel; + KRATOS_CATCH("") + } + + void CalculateNewtonianDragCoefficient(const double reynolds, double &drag_coeff) { - //double& temperature = (node_it)->FastGetSolutionStepValue(TEMPERATURE); - double temperature_aux = 0.0; - double tot_weight = 0.0; - double C = 1.19e15; - double E_over_R = 24067.0; - - for (int k = 0; k < number_of_points_in_radius; k++) - { - double distance = sqrt(*(SquaredResultsDistances.begin() + k)); - double weight = SPHCubicKernel(sigma, distance, radius); - PointIterator it_found = Results.begin() + k; - - if( (*it_found)->FastGetSolutionStepValue(DIAMETER) >0 && (*it_found)->FastGetSolutionStepValue(YN2) ==0.0) //MATERIAL_VARIABLE + KRATOS_TRY + + if (reynolds < 1) + { + drag_coeff = 24.0; // Reynolds; + } + else { - double tempp=0.0; - tempp=(*it_found)->FastGetSolutionStepValue(YCH4); - //if(tempp<298.0) tempp=298.0; - //else tempp=(*it_found)->FastGetSolutionStepValue(YCH4); + if (reynolds > 1000) + { + drag_coeff = 0.44; + } + else + { + drag_coeff = 24.0 / reynolds * (1.0 + 0.15 * pow(reynolds, 0.687)); + } + } + + KRATOS_CATCH("") + } - temperature_aux += weight * 27400.0 * 1.0 * C * exp(-E_over_R / tempp ) * 905.0 ;//temperature - tot_weight += weight; + void ColorOilClusters(ModelPart::NodesContainerType::iterator iNode, const int color) + { + if (iNode->GetSolutionStepValue(DIAMETER) < 0) // if(iNode->GetSolutionStepValue(OIL_CLUSTER) < 0 && ( water_fraction<0.99999999999999 || theta>1.57079632679) ) + iNode->GetSolutionStepValue(DIAMETER) = color; + ModelPart::NodesContainerType front_nodes; + GlobalPointersVector &r_neighbour_elements = iNode->GetValue(NEIGHBOUR_ELEMENTS); + for (GlobalPointersVector::iterator i_neighbour_element = r_neighbour_elements.begin(); i_neighbour_element != r_neighbour_elements.end(); i_neighbour_element++) + { + if (i_neighbour_element->GetValue(DIAMETER) < 0) + { + i_neighbour_element->SetValue(DIAMETER, color); + + Element::GeometryType &p_geometry = i_neighbour_element->GetGeometry(); + + for (unsigned int i = 0; i < p_geometry.size(); i++) + { + if (p_geometry[i].GetSolutionStepValue(DIAMETER) < 0) + { + p_geometry[i].GetSolutionStepValue(DIAMETER) = color; + front_nodes.push_back(p_geometry(i)); + } + } + } + } + while (!front_nodes.empty()) + { + ModelPart::NodesContainerType new_front_nodes; + for (ModelPart::NodesContainerType::iterator i_node = front_nodes.begin(); i_node != front_nodes.end(); i_node++) + { + GlobalPointersVector &r_neighbour_elements = i_node->GetValue(NEIGHBOUR_ELEMENTS); + for (GlobalPointersVector::iterator i_neighbour_element = r_neighbour_elements.begin(); i_neighbour_element != r_neighbour_elements.end(); i_neighbour_element++) + { + if (i_neighbour_element->GetValue(DIAMETER) < 0) + { + i_neighbour_element->SetValue(DIAMETER, color); + + Element::GeometryType &p_geometry = i_neighbour_element->GetGeometry(); + + for (unsigned int i = 0; i < p_geometry.size(); i++) + { + if (p_geometry[i].GetSolutionStepValue(DIAMETER) < 0) + { + p_geometry[i].GetSolutionStepValue(DIAMETER) = color; + new_front_nodes.push_back(p_geometry(i)); + } + } + } + } + } + front_nodes.clear(); // (o resize ( 0 ), si clear no existe) + for (ModelPart::NodesContainerType::iterator i_node = new_front_nodes.begin(); i_node != new_front_nodes.end(); i_node++) + front_nodes.push_back(*(i_node.base())); + } + } + void movethermocouples(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart, BinBasedFastPointLocator &node_locator) + { + KRATOS_TRY + array_1d veulerian; + double temperature; + Vector N; + //double G; + const int max_results = 1000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + double dt = 0.01; + const int nparticles = rLagrangianModelPart.Nodes().size(); + +#pragma omp parallel for firstprivate(results, N, veulerian, temperature) + for (int i = 0; i < nparticles; i++) + { + ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; + + int subdivisions = 5.0; + const double small_dt = dt / subdivisions; + for (unsigned int substep = 0; substep < subdivisions; substep++) + { + Node<3>::Pointer pparticle = *(iparticle.base()); + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + Element::Pointer pelement; + bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + + //move according to the streamline + noalias(veulerian) = N[0] * geom[0].FastGetSolutionStepValue(VELOCITY, 1); + temperature = N[0] * geom[0].FastGetSolutionStepValue(YCH4); + for (unsigned int k = 1; k < geom.size(); k++) + { + noalias(veulerian) += N[k] * geom[k].FastGetSolutionStepValue(VELOCITY, 1); + temperature += N[k] * geom[k].FastGetSolutionStepValue(YCH4); + //KRATOS_WATCH(geom[k].FastGetSolutionStepValue(YCH4)); + } + double &temp = (iparticle)->FastGetSolutionStepValue(YCH4); + temp = temperature; + veulerian(0) *= 0.0; + veulerian(2) *= 0.0; + array_1d &disp = (iparticle)->FastGetSolutionStepValue(DISPLACEMENT); + noalias(disp) += small_dt * veulerian; + noalias(iparticle->Coordinates()) = iparticle->GetInitialPosition(); + noalias(iparticle->Coordinates()) += iparticle->FastGetSolutionStepValue(DISPLACEMENT); + } + } } - } - if(tot_weight>0.0) - { - //(node_it)->FastGetSolutionStepValue(FUEL)=1500.0; - //double nodal_mass = node_it->FastGetSolutionStepValue(NODAL_MASS); - //KRATOS_WATCH(node_it->FastGetSolutionStepValue(NODAL_MASS)) - //double& heat = node_it->FastGetSolutionStepValue(HEAT_FLUX); - temperature_aux /= (tot_weight ); - //temperature= 1500.0;//temperature_aux; - if(temperature_aux>1e9) (node_it)->FastGetSolutionStepValue(HEAT_FLUX) += 1e9; - else (node_it)->FastGetSolutionStepValue(HEAT_FLUX) += temperature_aux; - } + + KRATOS_CATCH("") } - } - } - KRATOS_CATCH("") - } - - void TransferToEulerianMeshShapeBased(ModelPart& rEulerianModelPart, ModelPart & rLagrangianModelPart, BinBasedFastPointLocator& node_locator) - { - KRATOS_TRY - - for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) - { - (node_it)->GetValue(POISSON_RATIO) = 0.0; - (node_it)->GetValue(YOUNG_MODULUS) = 0.0; - (node_it)->GetValue(NODAL_MASS) = 0.0; - (node_it)->GetValue(HEAT_FLUX) = 0.0; - } - - for (ModelPart::ElementsContainerType::iterator el_it = rEulerianModelPart.ElementsBegin();el_it != rEulerianModelPart.ElementsEnd(); el_it++) - { - el_it->SetValue(YOUNG_MODULUS,0.0); - } - Vector N; - const int max_results = 1000; - typename BinBasedFastPointLocator::ResultContainerType results(max_results); - const int nparticles = rLagrangianModelPart.Nodes().size(); - - double C = 1.19e15; - double E_over_R = 24067.0; - double A=0.0; - -#pragma omp parallel for firstprivate(results,N) - for (int i = 0; i < nparticles; i++) - { - ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; - //KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); - Node < 3 > ::Pointer pparticle = *(iparticle.base()); - typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); - - Element::Pointer pelement; - - bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); - - if (is_found == true) - { - Geometry >& geom = pelement->GetGeometry(); - const array_1d & vel_particle = (iparticle)->FastGetSolutionStepValue(VELOCITY); - double density_particle = (iparticle)->FastGetSolutionStepValue(DENSITY); - double Tp=(iparticle)->FastGetSolutionStepValue(YCH4); //HEAT_FLUX - if(Tp>1000.0) Tp=1000.0; - double temperature = 0.3e+8;//1000000.0;//(iparticle)->FastGetSolutionStepValue(TEMPERATURE); - - temperature = 2e+7; - - if( (iparticle)->FastGetSolutionStepValue(DIAMETER)>0)// ((iparticle)->GetValue(NEIGHBOUR_ELEMENTS)).size() == 0) - { - (iparticle)->FastGetSolutionStepValue(YN2)=1.0; - // KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); - KRATOS_WATCH("aloneeeeeeeeeeeeeeeeeeeee"); - KRATOS_WATCH((iparticle)->FastGetSolutionStepValue(DIAMETER)); - for (unsigned int k = 0; k < geom.size(); k++) - { - - //KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); - geom[k].SetLock(); - geom[k].GetValue(YOUNG_MODULUS) += N[k] * 27400.0 * 1.0 * C * exp(-E_over_R/(Tp)) *905.0 * (iparticle)->FastGetSolutionStepValue(K0);//0.0001; - - KRATOS_WATCH("K0"); - KRATOS_WATCH((iparticle)->FastGetSolutionStepValue(K0)); - - geom[k].GetValue(POISSON_RATIO) += N[k]; - - geom[k].UnSetLock(); - } - } - } - } - - for (ModelPart::ElementsContainerType::iterator el_it = rEulerianModelPart.ElementsBegin();el_it != rEulerianModelPart.ElementsEnd(); el_it++) - { - - Geometry >& geom = el_it->GetGeometry(); - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double z0 = geom[0].Z(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double z1 = geom[1].Z(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); - double z2 = geom[2].Z(); - double x3 = geom[3].X(); - double y3 = geom[3].Y(); - double z3 = geom[3].Z(); - double area=0.0; - //if(TDim==2) area=CalculateVol(x0, y0, x1, y1, x2, y2); - //else - area=CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); - - geom[0].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; - geom[1].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; - geom[2].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; - geom[3].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; - - } - - - for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) - { - const double NN = (node_it)->GetValue(POISSON_RATIO); - const double tt = (node_it)->GetValue(YOUNG_MODULUS); - if (NN != 0.0) - { - //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); - //KRATOS_WATCH(tt); - //KRATOS_WATCH(NN); - double nodal_mass = node_it->FastGetSolutionStepValue(NODAL_MASS); - double& heat = node_it->FastGetSolutionStepValue(HEAT_FLUX); - double heat_value=tt/NN * (1.0/nodal_mass); - if (heat_value>1e9 /*0.5e+7*/) heat_value = 1e9 /*0.5e+7*/; //0.5e+7; - heat= heat_value; - KRATOS_WATCH(heat); - } - //} - } - - - // Timer::Stop("Interpolacion"); - //KRATOS_WATCH(time) - - KRATOS_CATCH("") - } - - private: - - inline double SPHCubicKernel(const double sigma, const double r, const double hmax) - { - double h_half = 0.5 * hmax; - const double s = r / h_half; - const double coeff = sigma / pow(h_half, static_cast(TDim)); - - if (s <= 1.0) - return coeff * (1.0 - 1.5 * s * s + 0.75 * s * s * s); - else if (s <= 2.0) - return 0.25 * coeff * pow(2.0 - s, 3); - else - return 0.0; - } - - inline void CalculateCenterAndSearchRadius(Geometry >&geom, double& xc, double& yc, double& zc, double& R, array_1d & N ) - { - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); - - xc = 0.3333333333333333333 * (x0 + x1 + x2); - yc = 0.3333333333333333333 * (y0 + y1 + y2); - zc = 0.0; - - double R1 = (xc - x0)*(xc - x0) + (yc - y0)*(yc - y0); - double R2 = (xc - x1)*(xc - x1) + (yc - y1)*(yc - y1); - double R3 = (xc - x2)*(xc - x2) + (yc - y2)*(yc - y2); - - R = R1; - if (R2 > R) R = R2; - if (R3 > R) R = R3; - - R = 1.01 * sqrt(R); - } - - inline void CalculateCenterAndSearchRadius(Geometry >&geom, double& xc, double& yc, double& zc, double& R, array_1d & N ) - { - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double z0 = geom[0].Z(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double z1 = geom[1].Z(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); - double z2 = geom[2].Z(); - double x3 = geom[3].X(); - double y3 = geom[3].Y(); - double z3 = geom[3].Z(); - - - xc = 0.25 * (x0 + x1 + x2 + x3); - yc = 0.25 * (y0 + y1 + y2 + y3); - zc = 0.25 * (z0 + z1 + z2 + z3); - - double R1 = (xc - x0)*(xc - x0) + (yc - y0)*(yc - y0) + (zc - z0)*(zc - z0); - double R2 = (xc - x1)*(xc - x1) + (yc - y1)*(yc - y1) + (zc - z1)*(zc - z1); - double R3 = (xc - x2)*(xc - x2) + (yc - y2)*(yc - y2) + (zc - z2)*(zc - z2); - double R4 = (xc - x3)*(xc - x3) + (yc - y3)*(yc - y3) + (zc - z3)*(zc - z3); - - R = R1; - if (R2 > R) R = R2; - if (R3 > R) R = R3; - if (R4 > R) R = R4; - - R = sqrt(R); - } - - - inline bool CalculatePosition(Geometry >&geom,const double xc, const double yc, const double zc, array_1d & N ) - { - - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double z0 = geom[0].Z(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double z1 = geom[1].Z(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); - double z2 = geom[2].Z(); - double x3 = geom[3].X(); - double y3 = geom[3].Y(); - double z3 = geom[3].Z(); - - double vol = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); - - double inv_vol = 0.0; - if (vol < 0.0000000000001) - { - KRATOS_ERROR<<"element with zero vol found"; - } - else - { - inv_vol = 1.0 / vol; - } - - N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; - N[1] = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, xc, yc, zc) * inv_vol; - N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; - N[3] = CalculateVol(x3, y3, z3, x0, y0, z0, x2, y2, z2, xc, yc, zc) * inv_vol; - - - if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[3] >= 0.0 && - N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0 && N[3] <= 1.0) - //if the xc yc zc is inside the tetrahedron return true - return true; - - return false; - } - - inline double CalculateVol(const double x0, const double y0, - const double x1, const double y1, - const double x2, const double y2 - ) - { - return 0.5 * ((x1 - x0)*(y2 - y0)- (y1 - y0)*(x2 - x0)); - } - - - inline double CalculateVol(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, const double x2, const double y2, const double z2,const double x3, const double y3, const double z3 ) - { - double x10 = x1 - x0; - double y10 = y1 - y0; - double z10 = z1 - z0; - - double x20 = x2 - x0; - double y20 = y2 - y0; - double z20 = z2 - z0; - - double x30 = x3 - x0; - double y30 = y3 - y0; - double z30 = z3 - z0; - - double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; - return detJ * 0.1666666666666666666667; - } - - void ComputeGaussPointPositions(Geometry< Node < 3 > >& geom, BoundedMatrix & pos, BoundedMatrix & N) - { - double one_third = 1.0 / 3.0; - double one_sixt = 1.0 / 6.0; - double two_third = 2.0 * one_third; - - N(0, 0) = one_sixt; - N(0, 1) = one_sixt; - N(0, 2) = two_third; - N(1, 0) = two_third; - N(1, 1) = one_sixt; - N(1, 2) = one_sixt; - N(2, 0) = one_sixt; - N(2, 1) = two_third; - N(2, 2) = one_sixt; - N(3, 0) = one_third; - N(3, 1) = one_third; - N(3, 2) = one_third; - - - //first - pos(0, 0) = one_sixt * geom[0].X() + one_sixt * geom[1].X() + two_third * geom[2].X(); - pos(0, 1) = one_sixt * geom[0].Y() + one_sixt * geom[1].Y() + two_third * geom[2].Y(); - pos(0, 2) = one_sixt * geom[0].Z() + one_sixt * geom[1].Z() + two_third * geom[2].Z(); - - //second - pos(1, 0) = two_third * geom[0].X() + one_sixt * geom[1].X() + one_sixt * geom[2].X(); - pos(1, 1) = two_third * geom[0].Y() + one_sixt * geom[1].Y() + one_sixt * geom[2].Y(); - pos(1, 2) = two_third * geom[0].Z() + one_sixt * geom[1].Z() + one_sixt * geom[2].Z(); - - //third - pos(2, 0) = one_sixt * geom[0].X() + two_third * geom[1].X() + one_sixt * geom[2].X(); - pos(2, 1) = one_sixt * geom[0].Y() + two_third * geom[1].Y() + one_sixt * geom[2].Y(); - pos(2, 2) = one_sixt * geom[0].Z() + two_third * geom[1].Z() + one_sixt * geom[2].Z(); - - //fourth - pos(3, 0) = one_third * geom[0].X() + one_third * geom[1].X() + one_third * geom[2].X(); - pos(3, 1) = one_third * geom[0].Y() + one_third * geom[1].Y() + one_third * geom[2].Y(); - pos(3, 2) = one_third * geom[0].Z() + one_third * geom[1].Z() + one_third * geom[2].Z(); - - } - - void ComputeGaussPointPositions(Geometry< Node < 3 > >& geom, BoundedMatrix & pos, BoundedMatrix & N) - { - //lower diagonal terms - double ypos = 1.0 / 12.0; - int pos_counter = 0; - for (unsigned int i = 0; i < 4; i++) - { - double xpos = 1.0 / 12.0; - for (unsigned int j = 0; j < 4 - i; j++) - { - double N1 = xpos; - double N2 = ypos; - double N3 = 1.0 - xpos - ypos; - pos(pos_counter, 0) = N1 * geom[0].X() + N2 * geom[1].X() + N3 * geom[2].X(); - pos(pos_counter, 1) = N1 * geom[0].Y() + N2 * geom[1].Y() + N3 * geom[2].Y(); - pos(pos_counter, 2) = N1 * geom[0].Z() + N2 * geom[1].Z() + N3 * geom[2].Z(); + void TransferToEulerianMesh_2(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart) + { + KRATOS_TRY - N(pos_counter, 0) = N1; - N(pos_counter, 1) = N2; - N(pos_counter, 2) = N3; + //defintions for spatial search + typedef Node<3> PointType; + typedef Node<3>::Pointer PointTypePointer; + typedef std::vector PointVector; + typedef std::vector::iterator PointIterator; + typedef std::vector DistanceVector; + typedef std::vector::iterator DistanceIterator; - xpos += 1.0 / 4.0; - pos_counter += 1; + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; - } - ypos += 1.0 / 4.0; - } + //************* + // Bucket types + typedef Bucket BucketType; - //lower diagonal terms - ypos = 2.0 / 12.0; - // pos_counter = 8; - for (unsigned int i = 0; i < 3; i++) - { - double xpos = 2.0 / 12.0; - for (unsigned int j = 0; j < 4 - i; j++) - { - double N1 = xpos; - double N2 = ypos; - double N3 = 1.0 - xpos - ypos; + typedef Tree> tree; //Kdtree; - pos(pos_counter, 0) = N1 * geom[0].X() + N2 * geom[1].X() + N3 * geom[2].X(); - pos(pos_counter, 1) = N1 * geom[0].Y() + N2 * geom[1].Y() + N3 * geom[2].Y(); - pos(pos_counter, 2) = N1 * geom[0].Z() + N2 * geom[1].Z() + N3 * geom[2].Z(); + //starting calculating time of construction of the kdtree + boost::timer kdtree_construction; - N(pos_counter, 0) = N1; - N(pos_counter, 1) = N2; - N(pos_counter, 2) = N3; + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + PointTypePointer pnode = *(node_it.base()); - xpos += 1.0 / 4.0; - pos_counter += 1; + //putting the nodes of the destination_model part in an auxiliary list + list_of_nodes.push_back(pnode); + } - } - ypos += 1.0 / 4.0; - } - } + std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; - void ConsistentMassMatrix(const double A, BoundedMatrix & M) - { - double c1 = A / 12.0; - double c2 = 2.0 * c1; - M(0, 0) = c2; - M(0, 1) = c1; - M(0, 2) = c1; - M(1, 0) = c1; - M(1, 1) = c2; - M(1, 2) = c1; - M(2, 0) = c1; - M(2, 1) = c1; - M(2, 2) = c2; - } + //create a spatial database with the list of new nodes + unsigned int bucket_size = 20; + tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); - void CalculateInterfaceNormal(BoundedMatrix& rPoints, array_1d& rDistances, array_1d& normal, double & interface_area, array_1d& Ninterface, BoundedMatrix& rInterfacePoints) - { - double sign_correction=1.0; + //work arrays + Node<3> work_point(0, 0.0, 0.0, 0.0); + unsigned int MaximumNumberOfResults = 10000; + PointVector Results(MaximumNumberOfResults); + DistanceVector SquaredResultsDistances(MaximumNumberOfResults); + if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) + KRATOS_ERROR << "Add ----NODAL_H---- variable!!!!!! ERROR"; + double sigma = 0.0; - BoundedMatrix InterfacePoints; + if (TDim == 2) + sigma = 10.0 / (7.0 * 3.1415926); + else + sigma = 1.0 / 3.1415926; - array_1d cut_edges; + for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) + { + if ((node_it)->Y() < -0.15102) + { + work_point.X() = node_it->X(); + work_point.Y() = node_it->Y(); + work_point.Z() = node_it->Z(); + + double radius = 2.0 * node_it->FastGetSolutionStepValue(NODAL_H); + + //find all of the new nodes within the radius + int number_of_points_in_radius; + + //look between the new nodes which of them is inside the radius of the circumscribed cyrcle + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); + + if (number_of_points_in_radius > 0) + { + //double& temperature = (node_it)->FastGetSolutionStepValue(TEMPERATURE); + double temperature_aux = 0.0; + double tot_weight = 0.0; + double C = 1.19e15; + double E_over_R = 24067.0; + + for (int k = 0; k < number_of_points_in_radius; k++) + { + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + PointIterator it_found = Results.begin() + k; + + if ((*it_found)->FastGetSolutionStepValue(DIAMETER) > 0 && (*it_found)->FastGetSolutionStepValue(YN2) == 0.0) //MATERIAL_VARIABLE + { + double tempp = 0.0; + tempp = (*it_found)->FastGetSolutionStepValue(YCH4); + //if(tempp<298.0) tempp=298.0; + //else tempp=(*it_found)->FastGetSolutionStepValue(YCH4); + + temperature_aux += weight * 27400.0 * 1.0 * C * exp(-E_over_R / tempp) * 905.0; //temperature + tot_weight += weight; + } + } + if (tot_weight > 0.0) + { + //(node_it)->FastGetSolutionStepValue(FUEL)=1500.0; + //double nodal_mass = node_it->FastGetSolutionStepValue(NODAL_MASS); + //KRATOS_WATCH(node_it->FastGetSolutionStepValue(NODAL_MASS)) + //double& heat = node_it->FastGetSolutionStepValue(HEAT_FLUX); + temperature_aux /= (tot_weight); + //temperature= 1500.0;//temperature_aux; + if (temperature_aux > 1e9) + (node_it)->FastGetSolutionStepValue(HEAT_FLUX) += 1e9; + else + (node_it)->FastGetSolutionStepValue(HEAT_FLUX) += temperature_aux; + } + } + } + } + KRATOS_CATCH("") + } - array_1d interface_segment=ZeroVector(2); + void TransferToEulerianMeshShapeBased(ModelPart &rEulerianModelPart, ModelPart &rLagrangianModelPart, BinBasedFastPointLocator &node_locator) + { + KRATOS_TRY - if ((rDistances(0)*rDistances(1))<0.0) cut_edges[0]=true;//edge 12 is cut + for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) + { + (node_it)->GetValue(POISSON_RATIO) = 0.0; + (node_it)->GetValue(YOUNG_MODULUS) = 0.0; + (node_it)->GetValue(NODAL_MASS) = 0.0; + (node_it)->GetValue(HEAT_FLUX) = 0.0; + } - else cut_edges[0]=false; + for (ModelPart::ElementsContainerType::iterator el_it = rEulerianModelPart.ElementsBegin(); el_it != rEulerianModelPart.ElementsEnd(); el_it++) + { + el_it->SetValue(YOUNG_MODULUS, 0.0); + } + Vector N; + const int max_results = 1000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + const int nparticles = rLagrangianModelPart.Nodes().size(); + double C = 1.19e15; + double E_over_R = 24067.0; + double A = 0.0; +#pragma omp parallel for firstprivate(results, N) + for (int i = 0; i < nparticles; i++) + { + ModelPart::NodesContainerType::iterator iparticle = rLagrangianModelPart.NodesBegin() + i; + //KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); + Node<3>::Pointer pparticle = *(iparticle.base()); + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + + Element::Pointer pelement; + + bool is_found = node_locator.FindPointOnMesh(pparticle->Coordinates(), N, pelement, result_begin, max_results); + + if (is_found == true) + { + Geometry> &geom = pelement->GetGeometry(); + const array_1d &vel_particle = (iparticle)->FastGetSolutionStepValue(VELOCITY); + double density_particle = (iparticle)->FastGetSolutionStepValue(DENSITY); + double Tp = (iparticle)->FastGetSolutionStepValue(YCH4); //HEAT_FLUX + if (Tp > 1000.0) + Tp = 1000.0; + double temperature = 0.3e+8; //1000000.0;//(iparticle)->FastGetSolutionStepValue(TEMPERATURE); + + temperature = 2e+7; + + if ((iparticle)->FastGetSolutionStepValue(DIAMETER) > 0) // ((iparticle)->GetValue(NEIGHBOUR_ELEMENTS)).size() == 0) + { + (iparticle)->FastGetSolutionStepValue(YN2) = 1.0; + // KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); + KRATOS_WATCH("aloneeeeeeeeeeeeeeeeeeeee"); + KRATOS_WATCH((iparticle)->FastGetSolutionStepValue(DIAMETER)); + for (unsigned int k = 0; k < geom.size(); k++) + { + + //KRATOS_ERROR(std::logic_error, "Add ----FORCE---- variable!!!!!! ERROR", ""); + geom[k].SetLock(); + geom[k].GetValue(YOUNG_MODULUS) += N[k] * 27400.0 * 1.0 * C * exp(-E_over_R / (Tp)) * 905.0 * (iparticle)->FastGetSolutionStepValue(K0); //0.0001; + + KRATOS_WATCH("K0"); + KRATOS_WATCH((iparticle)->FastGetSolutionStepValue(K0)); + + geom[k].GetValue(POISSON_RATIO) += N[k]; + + geom[k].UnSetLock(); + } + } + } + } - if ((rDistances(1)*rDistances(2))<0.0) cut_edges[1]=true;//edge 23 is cut. + for (ModelPart::ElementsContainerType::iterator el_it = rEulerianModelPart.ElementsBegin(); el_it != rEulerianModelPart.ElementsEnd(); el_it++) + { - else cut_edges[1]=false; + Geometry> &geom = el_it->GetGeometry(); + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double z0 = geom[0].Z(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double z1 = geom[1].Z(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + double z2 = geom[2].Z(); + double x3 = geom[3].X(); + double y3 = geom[3].Y(); + double z3 = geom[3].Z(); + double area = 0.0; + //if(TDim==2) area=CalculateVol(x0, y0, x1, y1, x2, y2); + //else + area = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); + + geom[0].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; + geom[1].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; + geom[2].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; + geom[3].FastGetSolutionStepValue(NODAL_MASS) += area * 0.25; + } + for (ModelPart::NodesContainerType::iterator node_it = rEulerianModelPart.NodesBegin(); node_it != rEulerianModelPart.NodesEnd(); node_it++) + { + const double NN = (node_it)->GetValue(POISSON_RATIO); + const double tt = (node_it)->GetValue(YOUNG_MODULUS); + if (NN != 0.0) + { + //KRATOS_ERROR(std::logic_error, "element with zero vol found", ""); + //KRATOS_WATCH(tt); + //KRATOS_WATCH(NN); + double nodal_mass = node_it->FastGetSolutionStepValue(NODAL_MASS); + double &heat = node_it->FastGetSolutionStepValue(HEAT_FLUX); + double heat_value = tt / NN * (1.0 / nodal_mass); + if (heat_value > 1e9 /*0.5e+7*/) + heat_value = 1e9 /*0.5e+7*/; //0.5e+7; + heat = heat_value; + KRATOS_WATCH(heat); + } + //} + } + // Timer::Stop("Interpolacion"); + //KRATOS_WATCH(time) - if ((rDistances(2)*rDistances(0))<0.0) cut_edges[2]=true;//edge 13 is cut. + KRATOS_CATCH("") + } - else cut_edges[2]=false; + private: + inline double SPHCubicKernel(const double sigma, const double r, const double hmax) + { + double h_half = 0.5 * hmax; + const double s = r / h_half; + const double coeff = sigma / pow(h_half, static_cast(TDim)); + + if (s <= 1.0) + return coeff * (1.0 - 1.5 * s * s + 0.75 * s * s * s); + else if (s <= 2.0) + return 0.25 * coeff * pow(2.0 - s, 3); + else + return 0.0; + } + inline void CalculateCenterAndSearchRadius(Geometry> &geom, double &xc, double &yc, double &zc, double &R, array_1d &N) + { + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + + xc = 0.3333333333333333333 * (x0 + x1 + x2); + yc = 0.3333333333333333333 * (y0 + y1 + y2); + zc = 0.0; + + double R1 = (xc - x0) * (xc - x0) + (yc - y0) * (yc - y0); + double R2 = (xc - x1) * (xc - x1) + (yc - y1) * (yc - y1); + double R3 = (xc - x2) * (xc - x2) + (yc - y2) * (yc - y2); + + R = R1; + if (R2 > R) + R = R2; + if (R3 > R) + R = R3; + + R = 1.01 * sqrt(R); + } + inline void CalculateCenterAndSearchRadius(Geometry> &geom, double &xc, double &yc, double &zc, double &R, array_1d &N) + { + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double z0 = geom[0].Z(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double z1 = geom[1].Z(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + double z2 = geom[2].Z(); + double x3 = geom[3].X(); + double y3 = geom[3].Y(); + double z3 = geom[3].Z(); + + xc = 0.25 * (x0 + x1 + x2 + x3); + yc = 0.25 * (y0 + y1 + y2 + y3); + zc = 0.25 * (z0 + z1 + z2 + z3); + + double R1 = (xc - x0) * (xc - x0) + (yc - y0) * (yc - y0) + (zc - z0) * (zc - z0); + double R2 = (xc - x1) * (xc - x1) + (yc - y1) * (yc - y1) + (zc - z1) * (zc - z1); + double R3 = (xc - x2) * (xc - x2) + (yc - y2) * (yc - y2) + (zc - z2) * (zc - z2); + double R4 = (xc - x3) * (xc - x3) + (yc - y3) * (yc - y3) + (zc - z3) * (zc - z3); + + R = R1; + if (R2 > R) + R = R2; + if (R3 > R) + R = R3; + if (R4 > R) + R = R4; + + R = sqrt(R); + } + inline bool CalculatePosition(Geometry> &geom, const double xc, const double yc, const double zc, array_1d &N) + { + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double z0 = geom[0].Z(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double z1 = geom[1].Z(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + double z2 = geom[2].Z(); + double x3 = geom[3].X(); + double y3 = geom[3].Y(); + double z3 = geom[3].Z(); + + double vol = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); + + double inv_vol = 0.0; + if (vol < 0.0000000000001) + { + KRATOS_ERROR << "element with zero vol found"; + } + else + { + inv_vol = 1.0 / vol; + } - if (cut_edges[0]) + N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; + N[1] = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, xc, yc, zc) * inv_vol; + N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; + N[3] = CalculateVol(x3, y3, z3, x0, y0, z0, x2, y2, z2, xc, yc, zc) * inv_vol; - { + if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[3] >= 0.0 && + N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0 && N[3] <= 1.0) + //if the xc yc zc is inside the tetrahedron return true + return true; - if (rDistances(0)>0.0) sign_correction=1.0; + return false; + } - else sign_correction=-1.0; + inline double CalculateVol(const double x0, const double y0, + const double x1, const double y1, + const double x2, const double y2) + { + return 0.5 * ((x1 - x0) * (y2 - y0) - (y1 - y0) * (x2 - x0)); + } + inline double CalculateVol(const double x0, const double y0, const double z0, const double x1, const double y1, const double z1, const double x2, const double y2, const double z2, const double x3, const double y3, const double z3) + { + double x10 = x1 - x0; + double y10 = y1 - y0; + double z10 = z1 - z0; + double x20 = x2 - x0; + double y20 = y2 - y0; + double z20 = z2 - z0; - const double relative_position = abs(rDistances(1)/(rDistances(1)-rDistances(0) ) ); + double x30 = x3 - x0; + double y30 = y3 - y0; + double z30 = z3 - z0; - InterfacePoints(0,0) = relative_position*rPoints(0,0) + (1.0-relative_position)*rPoints(1,0); + double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + return detJ * 0.1666666666666666666667; + } - InterfacePoints(0,1) = relative_position*rPoints(0,1) + (1.0-relative_position)*rPoints(1,1); + void ComputeGaussPointPositions(Geometry> &geom, BoundedMatrix &pos, BoundedMatrix &N) + { + double one_third = 1.0 / 3.0; + double one_sixt = 1.0 / 6.0; + double two_third = 2.0 * one_third; + + N(0, 0) = one_sixt; + N(0, 1) = one_sixt; + N(0, 2) = two_third; + N(1, 0) = two_third; + N(1, 1) = one_sixt; + N(1, 2) = one_sixt; + N(2, 0) = one_sixt; + N(2, 1) = two_third; + N(2, 2) = one_sixt; + N(3, 0) = one_third; + N(3, 1) = one_third; + N(3, 2) = one_third; + + //first + pos(0, 0) = one_sixt * geom[0].X() + one_sixt * geom[1].X() + two_third * geom[2].X(); + pos(0, 1) = one_sixt * geom[0].Y() + one_sixt * geom[1].Y() + two_third * geom[2].Y(); + pos(0, 2) = one_sixt * geom[0].Z() + one_sixt * geom[1].Z() + two_third * geom[2].Z(); + + //second + pos(1, 0) = two_third * geom[0].X() + one_sixt * geom[1].X() + one_sixt * geom[2].X(); + pos(1, 1) = two_third * geom[0].Y() + one_sixt * geom[1].Y() + one_sixt * geom[2].Y(); + pos(1, 2) = two_third * geom[0].Z() + one_sixt * geom[1].Z() + one_sixt * geom[2].Z(); + + //third + pos(2, 0) = one_sixt * geom[0].X() + two_third * geom[1].X() + one_sixt * geom[2].X(); + pos(2, 1) = one_sixt * geom[0].Y() + two_third * geom[1].Y() + one_sixt * geom[2].Y(); + pos(2, 2) = one_sixt * geom[0].Z() + two_third * geom[1].Z() + one_sixt * geom[2].Z(); + + //fourth + pos(3, 0) = one_third * geom[0].X() + one_third * geom[1].X() + one_third * geom[2].X(); + pos(3, 1) = one_third * geom[0].Y() + one_third * geom[1].Y() + one_third * geom[2].Y(); + pos(3, 2) = one_third * geom[0].Z() + one_third * geom[1].Z() + one_third * geom[2].Z(); + } + void ComputeGaussPointPositions(Geometry> &geom, BoundedMatrix &pos, BoundedMatrix &N) + { + //lower diagonal terms + double ypos = 1.0 / 12.0; + int pos_counter = 0; + for (unsigned int i = 0; i < 4; i++) + { + double xpos = 1.0 / 12.0; + for (unsigned int j = 0; j < 4 - i; j++) + { + double N1 = xpos; + double N2 = ypos; + double N3 = 1.0 - xpos - ypos; + + pos(pos_counter, 0) = N1 * geom[0].X() + N2 * geom[1].X() + N3 * geom[2].X(); + pos(pos_counter, 1) = N1 * geom[0].Y() + N2 * geom[1].Y() + N3 * geom[2].Y(); + pos(pos_counter, 2) = N1 * geom[0].Z() + N2 * geom[1].Z() + N3 * geom[2].Z(); + + N(pos_counter, 0) = N1; + N(pos_counter, 1) = N2; + N(pos_counter, 2) = N3; + + xpos += 1.0 / 4.0; + pos_counter += 1; + } + ypos += 1.0 / 4.0; + } + //lower diagonal terms + ypos = 2.0 / 12.0; + // pos_counter = 8; + for (unsigned int i = 0; i < 3; i++) + { + double xpos = 2.0 / 12.0; + for (unsigned int j = 0; j < 4 - i; j++) + { + double N1 = xpos; + double N2 = ypos; + double N3 = 1.0 - xpos - ypos; + + pos(pos_counter, 0) = N1 * geom[0].X() + N2 * geom[1].X() + N3 * geom[2].X(); + pos(pos_counter, 1) = N1 * geom[0].Y() + N2 * geom[1].Y() + N3 * geom[2].Y(); + pos(pos_counter, 2) = N1 * geom[0].Z() + N2 * geom[1].Z() + N3 * geom[2].Z(); + + N(pos_counter, 0) = N1; + N(pos_counter, 1) = N2; + N(pos_counter, 2) = N3; + + xpos += 1.0 / 4.0; + pos_counter += 1; + } + ypos += 1.0 / 4.0; + } + } - if (cut_edges[1]) + void ConsistentMassMatrix(const double A, BoundedMatrix &M) + { + double c1 = A / 12.0; + double c2 = 2.0 * c1; + M(0, 0) = c2; + M(0, 1) = c1; + M(0, 2) = c1; + M(1, 0) = c1; + M(1, 1) = c2; + M(1, 2) = c1; + M(2, 0) = c1; + M(2, 1) = c1; + M(2, 2) = c2; + } - { + void CalculateInterfaceNormal(BoundedMatrix &rPoints, array_1d &rDistances, array_1d &normal, double &interface_area, array_1d &Ninterface, BoundedMatrix &rInterfacePoints) + { + double sign_correction = 1.0; - const double relative_position2 = abs(rDistances(2)/(rDistances(1)-rDistances(2) ) ); + BoundedMatrix InterfacePoints; - InterfacePoints(1,0) = relative_position2*rPoints(1,0) + (1.0-relative_position2)*rPoints(2,0); + array_1d cut_edges; - InterfacePoints(1,1) = relative_position2*rPoints(1,1) + (1.0-relative_position2)*rPoints(2,1); + array_1d interface_segment = ZeroVector(2); - } + if ((rDistances(0) * rDistances(1)) < 0.0) + cut_edges[0] = true; //edge 12 is cut - else + else + cut_edges[0] = false; - { + if ((rDistances(1) * rDistances(2)) < 0.0) + cut_edges[1] = true; //edge 23 is cut. - const double relative_position2 = abs(rDistances(0)/(rDistances(2)-rDistances(0) ) ); + else + cut_edges[1] = false; - InterfacePoints(1,0) = relative_position2*rPoints(2,0) + (1.0-relative_position2)*rPoints(0,0); + if ((rDistances(2) * rDistances(0)) < 0.0) + cut_edges[2] = true; //edge 13 is cut. - InterfacePoints(1,1) = relative_position2*rPoints(2,1) + (1.0-relative_position2)*rPoints(0,1); + else + cut_edges[2] = false; - } + if (cut_edges[0]) - } + { - else + if (rDistances(0) > 0.0) + sign_correction = 1.0; - { + else + sign_correction = -1.0; - if (rDistances(1)>0.0) sign_correction=1.0; + const double relative_position = abs(rDistances(1) / (rDistances(1) - rDistances(0))); - else sign_correction=-1.0; + InterfacePoints(0, 0) = relative_position * rPoints(0, 0) + (1.0 - relative_position) * rPoints(1, 0); + InterfacePoints(0, 1) = relative_position * rPoints(0, 1) + (1.0 - relative_position) * rPoints(1, 1); + if (cut_edges[1]) - const double relative_position = abs(rDistances(2)/(rDistances(2)-rDistances(1) ) ); + { - InterfacePoints(0,0) = relative_position*rPoints(1,0) + (1.0-relative_position)*rPoints(2,0); + const double relative_position2 = abs(rDistances(2) / (rDistances(1) - rDistances(2))); - InterfacePoints(0,1) = relative_position*rPoints(1,1) + (1.0-relative_position)*rPoints(2,1); + InterfacePoints(1, 0) = relative_position2 * rPoints(1, 0) + (1.0 - relative_position2) * rPoints(2, 0); + InterfacePoints(1, 1) = relative_position2 * rPoints(1, 1) + (1.0 - relative_position2) * rPoints(2, 1); + } + else - const double relative_position2 = abs(rDistances(0)/(rDistances(2)-rDistances(0) ) ); + { - InterfacePoints(1,0) = relative_position2*rPoints(2,0) + (1.0-relative_position2)*rPoints(0,0); + const double relative_position2 = abs(rDistances(0) / (rDistances(2) - rDistances(0))); - InterfacePoints(1,1) = relative_position2*rPoints(2,1) + (1.0-relative_position2)*rPoints(0,1); + InterfacePoints(1, 0) = relative_position2 * rPoints(2, 0) + (1.0 - relative_position2) * rPoints(0, 0); - } + InterfacePoints(1, 1) = relative_position2 * rPoints(2, 1) + (1.0 - relative_position2) * rPoints(0, 1); + } + } - interface_segment[0] = (InterfacePoints(1,0)-InterfacePoints(0,0)); + else - interface_segment[1] = (InterfacePoints(1,1)-InterfacePoints(0,1)); + { + if (rDistances(1) > 0.0) + sign_correction = 1.0; - const double norm = sqrt( pow((interface_segment[0]),2) + pow((interface_segment[1]),2)); + else + sign_correction = -1.0; + const double relative_position = abs(rDistances(2) / (rDistances(2) - rDistances(1))); + InterfacePoints(0, 0) = relative_position * rPoints(1, 0) + (1.0 - relative_position) * rPoints(2, 0); - normal(0)= -interface_segment[1]*sign_correction/norm; + InterfacePoints(0, 1) = relative_position * rPoints(1, 1) + (1.0 - relative_position) * rPoints(2, 1); - normal(1)= interface_segment[0]*sign_correction/norm; + const double relative_position2 = abs(rDistances(0) / (rDistances(2) - rDistances(0))); - //KRATOS_WATCH(interface_segment) + InterfacePoints(1, 0) = relative_position2 * rPoints(2, 0) + (1.0 - relative_position2) * rPoints(0, 0); - //KRATOS_WATCH(InterfacePoints) + InterfacePoints(1, 1) = relative_position2 * rPoints(2, 1) + (1.0 - relative_position2) * rPoints(0, 1); + } - interface_area=norm; + interface_segment[0] = (InterfacePoints(1, 0) - InterfacePoints(0, 0)); - rInterfacePoints(0,0)=InterfacePoints(0,0); - rInterfacePoints(0,1)=InterfacePoints(0,1); - rInterfacePoints(1,0)=InterfacePoints(1,0); - rInterfacePoints(1,1)=InterfacePoints(1,1); + interface_segment[1] = (InterfacePoints(1, 1) - InterfacePoints(0, 1)); - const double x_interface = 0.5*(InterfacePoints(0,0)+InterfacePoints(1,0)); + const double norm = sqrt(pow((interface_segment[0]), 2) + pow((interface_segment[1]), 2)); - const double y_interface = 0.5*(InterfacePoints(0,1)+InterfacePoints(1,1)); + normal(0) = -interface_segment[1] * sign_correction / norm; - // CalculatePosition(rPoints, x_interface, y_interface, 0.0, Ninterface ); + normal(1) = interface_segment[0] * sign_correction / norm; - ///meto aqui el CalculatePosition(rPoints, x_interface, y_interface, 0.0, Ninterface ); - double x0 = rPoints(0,0); - double y0 = rPoints(0,1); - double x1 = rPoints(1,0); - double y1 = rPoints(1,1); - double x2 = rPoints(2,0); - double y2 = rPoints(2,1); - double area = CalculateVol(x0, y0, x1, y1, x2, y2); - double inv_area = 0.0; - if (area == 0.0) - { - KRATOS_ERROR<<"element with zero area found"; - } - else - { - inv_area = 1.0 / area; - } + //KRATOS_WATCH(interface_segment) - Ninterface[0]= CalculateVol(x1, y1, x2, y2, x_interface, y_interface) * inv_area; - Ninterface[1] = CalculateVol(x2, y2, x0, y0, x_interface, y_interface) * inv_area; - Ninterface[2] = CalculateVol(x0, y0, x1, y1, x_interface, y_interface) * inv_area; + //KRATOS_WATCH(InterfacePoints) - } + interface_area = norm; - bool CalculatePosition(Geometry >&geom,const double xc, const double yc, const double zc,array_1d & N ) - { - double x0 = geom[0].X(); - double y0 = geom[0].Y(); - double x1 = geom[1].X(); - double y1 = geom[1].Y(); - double x2 = geom[2].X(); - double y2 = geom[2].Y(); + rInterfacePoints(0, 0) = InterfacePoints(0, 0); + rInterfacePoints(0, 1) = InterfacePoints(0, 1); + rInterfacePoints(1, 0) = InterfacePoints(1, 0); + rInterfacePoints(1, 1) = InterfacePoints(1, 1); - double area = CalculateVol(x0, y0, x1, y1, x2, y2); - double inv_area = 0.0; - if (area == 0.0) - { - KRATOS_ERROR<<"element with zero area found"; - } - else - { - inv_area = 1.0 / area; - } + const double x_interface = 0.5 * (InterfacePoints(0, 0) + InterfacePoints(1, 0)); + const double y_interface = 0.5 * (InterfacePoints(0, 1) + InterfacePoints(1, 1)); - N[0] = CalculateVol(x1, y1, x2, y2, xc, yc) * inv_area; - N[1] = CalculateVol(x2, y2, x0, y0, xc, yc) * inv_area; - N[2] = CalculateVol(x0, y0, x1, y1, xc, yc) * inv_area; + // CalculatePosition(rPoints, x_interface, y_interface, 0.0, Ninterface ); + ///meto aqui el CalculatePosition(rPoints, x_interface, y_interface, 0.0, Ninterface ); + double x0 = rPoints(0, 0); + double y0 = rPoints(0, 1); + double x1 = rPoints(1, 0); + double y1 = rPoints(1, 1); + double x2 = rPoints(2, 0); + double y2 = rPoints(2, 1); + double area = CalculateVol(x0, y0, x1, y1, x2, y2); + double inv_area = 0.0; + if (area == 0.0) + { + KRATOS_ERROR << "element with zero area found"; + } + else + { + inv_area = 1.0 / area; + } - if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0) //if the xc yc is inside the triangle return true - return true; + Ninterface[0] = CalculateVol(x1, y1, x2, y2, x_interface, y_interface) * inv_area; + Ninterface[1] = CalculateVol(x2, y2, x0, y0, x_interface, y_interface) * inv_area; + Ninterface[2] = CalculateVol(x0, y0, x1, y1, x_interface, y_interface) * inv_area; + } - return false; - } + bool CalculatePosition(Geometry> &geom, const double xc, const double yc, const double zc, array_1d &N) + { + double x0 = geom[0].X(); + double y0 = geom[0].Y(); + double x1 = geom[1].X(); + double y1 = geom[1].Y(); + double x2 = geom[2].X(); + double y2 = geom[2].Y(); + + double area = CalculateVol(x0, y0, x1, y1, x2, y2); + double inv_area = 0.0; + if (area == 0.0) + { + KRATOS_ERROR << "element with zero area found"; + } + else + { + inv_area = 1.0 / area; + } - template - bool InvertMatrix(const T& input, T& inverse) + N[0] = CalculateVol(x1, y1, x2, y2, xc, yc) * inv_area; + N[1] = CalculateVol(x2, y2, x0, y0, xc, yc) * inv_area; + N[2] = CalculateVol(x0, y0, x1, y1, xc, yc) * inv_area; - { - typedef permutation_matrix pmatrix; + if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0) //if the xc yc is inside the triangle return true + return true; - // create a working copy of the input + return false; + } - T A(input); + template + bool InvertMatrix(const T &input, T &inverse) - // create a permutation matrix for the LU-factorization + { + typedef permutation_matrix pmatrix; - pmatrix pm(A.size1()); + // create a working copy of the input - // perform LU-factorization + T A(input); - int res = lu_factorize(A, pm); + // create a permutation matrix for the LU-factorization - if (res != 0) + pmatrix pm(A.size1()); - return false; + // perform LU-factorization - // create identity matrix of "inverse" + int res = lu_factorize(A, pm); - inverse.assign(identity_matrix (A.size1())); + if (res != 0) - // backsubstitute to get the inverse + return false; - lu_substitute(A, pm, inverse); + // create identity matrix of "inverse" - return true; + inverse.assign(identity_matrix(A.size1())); + // backsubstitute to get the inverse - } + lu_substitute(A, pm, inverse); - }; + return true; + } + }; } // namespace Kratos. diff --git a/applications/PfemMeltingApplication/CMakeLists.txt b/applications/PfemMeltingApplication/CMakeLists.txt new file mode 100644 index 000000000000..d44b79ca97bc --- /dev/null +++ b/applications/PfemMeltingApplication/CMakeLists.txt @@ -0,0 +1,87 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +message("**** configuring KratosPfemMeltingApplication ****") + +kratos_add_dependency(${KRATOS_SOURCE_DIR}/applications/FluidDynamicsApplication) +kratos_add_dependency(${KRATOS_SOURCE_DIR}/applications/ConvectionDiffusionApplication) +kratos_add_dependency(${KRATOS_SOURCE_DIR}/applications/MeshingApplication) + +include_directories( ${KRATOS_SOURCE_DIR}/kratos ) +include_directories( ${CMAKE_SOURCE_DIR}/applications/FluidDynamicsApplication ) + +## generate variables with the sources +set( KRATOS_PFEM_MELTING_APPLICATION_CORE_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/pfem_melting_application.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/pfem_melting_application_variables.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/custom_elements/hypo.cpp + #${CMAKE_SOURCE_DIR}/applications/FluidDynamicsApplication/custom_elements/hypo.cpp + #${CMAKE_SOURCE_DIR}/applications/FluidDynamicsApplication/fluid_dynamics_application_variables.cpp #TODO: this should REALLY + #${CMAKE_SOURCE_DIR}/applications/FluidDynamicsApplication/custom_elements/vms.cpp #TODO: this should REALLY +) + + + +## define python interface sources +set( KRATOS_PFEM_MELTING_PYTHON_INTERFACE_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/custom_python/kratos_pfem_melting_python_application.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/custom_python/add_custom_utilities_to_python.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/custom_python/add_custom_processes_to_python.cpp +) + +# ${CMAKE_CURRENT_SOURCE_DIR}/custom_python/add_custom_strategies_to_python.cpp +# ${CMAKE_CURRENT_SOURCE_DIR}/custom_python/add_custom_response_functions_to_python.cpp + +## define test sources +#if(${KRATOS_BUILD_TESTING} MATCHES ON) +# file(GLOB_RECURSE KRATOS_PFEM_MELTING_TESTING_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/tests/cpp_tests/*.cpp) +#endif(${KRATOS_BUILD_TESTING} MATCHES ON) + +############################################################### +## ConvectionDiffusionApplication core library (C++ parts) +add_library( KratosPfemMeltingCore SHARED ${KRATOS_PFEM_MELTING_APPLICATION_CORE_SOURCES} ${KRATOS_PFEM_MELTING_TESTING_SOURCES} ) +target_link_libraries( KratosPfemMeltingCore PUBLIC KratosFluidDynamicsCore KratosCore ) +set_target_properties( KratosPfemMeltingCore PROPERTIES COMPILE_DEFINITIONS "PFEM_MELTING_APPLICATION=EXPORT,API") + +## FluidDynamicsApplication python module +pybind11_add_module( KratosPfemMeltingApplication MODULE THIN_LTO ${KRATOS_PFEM_MELTING_PYTHON_INTERFACE_SOURCES} ) +target_link_libraries( KratosPfemMeltingApplication PRIVATE KratosPfemMeltingCore) +set_target_properties( KratosPfemMeltingApplication PROPERTIES PREFIX "") + +# changing the .dll suffix to .pyd +if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set_target_properties(KratosPfemMeltingApplication PROPERTIES SUFFIX .pyd) +endif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + +# changing the .dylib suffix to .so +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set_target_properties(KratosPfemMeltingApplication PROPERTIES SUFFIX .so) +endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + +# Cotire +if(USE_COTIRE MATCHES ON) + cotire(KratosPfemMeltingCore) + cotire(KratosPfemMeltingApplication) +endif(USE_COTIRE MATCHES ON) + +# Add to the KratosMultiphisics Python module +kratos_python_install(${INSTALL_PYTHON_USING_LINKS} ${CMAKE_CURRENT_SOURCE_DIR}/PfemMeltingApplication.py KratosMultiphysics/PfemMeltingApplication/__init__.py ) + +# Install python files +get_filename_component (CURRENT_DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) +kratos_python_install_directory(${INSTALL_PYTHON_USING_LINKS} ${CMAKE_CURRENT_SOURCE_DIR}/python_scripts KratosMultiphysics/${CURRENT_DIR_NAME} ) + +# Kratos Testing. Install everything except sources to ensure that reference and configuration files are copied. +#if(${INSTALL_TESTING_FILES} MATCHES ON ) +# get_filename_component (CURRENT_DIR_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) +# install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests DESTINATION applications/${CURRENT_DIR_NAME} +# PATTERN "*.git" EXCLUDE +# PATTERN "*.c" EXCLUDE +# PATTERN "*.h" EXCLUDE +# PATTERN "*.cpp" EXCLUDE +# PATTERN "*.hpp" EXCLUDE +# ) +#endif(${INSTALL_TESTING_FILES} MATCHES ON) + +# Install Targets +install(TARGETS KratosPfemMeltingCore DESTINATION libs ) +install(TARGETS KratosPfemMeltingApplication DESTINATION libs ) diff --git a/applications/PfemMeltingApplication/PfemMeltingApplication.py b/applications/PfemMeltingApplication/PfemMeltingApplication.py new file mode 100644 index 000000000000..11a7de3abdce --- /dev/null +++ b/applications/PfemMeltingApplication/PfemMeltingApplication.py @@ -0,0 +1,10 @@ +# makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +from __future__ import print_function, absolute_import, division + +# Application dependent names and paths +from KratosMultiphysics import _ImportApplication +from KratosPfemMeltingApplication import * +application = KratosPfemMeltingApplication() +application_name = "KratosPfemMeltingApplication" + +_ImportApplication(application, application_name) diff --git a/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.cpp b/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.cpp new file mode 100644 index 000000000000..6356163b7e61 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.cpp @@ -0,0 +1,295 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ \. +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// +#include "HypoElasticSolid.h" + +namespace Kratos +{ +///@name Specialized implementation of VMS for functions that depend on TDim +///@{ + +/** + * @see VMS::EquationIdVector + */ +template <> +void HYPOELASTICSOLID<2>::EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int NumNodes(3),LocalSize(9); + unsigned int LocalIndex = 0; + +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + unsigned int vpos = this->GetGeometry()[0].GetDofPosition(VELOCITY_X); + unsigned int ppos = this->GetGeometry()[0].GetDofPosition(PRESSURE); + + if (rResult.size() != LocalSize) + rResult.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_X,vpos).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Y,vpos+1).EquationId(); + // rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(PRESSURE,ppos).EquationId(); + } +} + + +template <> +void HYPOELASTICSOLID<3>::EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int NumNodes(4),LocalSize(12); + unsigned int LocalIndex = 0; + unsigned int vpos = this->GetGeometry()[0].GetDofPosition(VELOCITY_X); + // unsigned int ppos = this->GetGeometry()[0].GetDofPosition(PRESSURE); +//KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +//KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +//KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + if (rResult.size() != LocalSize) + rResult.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_X,vpos).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Y,vpos+1).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Z,vpos+2).EquationId(); + //rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(PRESSURE,ppos).EquationId(); + } + + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + +} + +/* + * @see HYPOELASTICSOLID::GetDofList + */ +/*template <> +void HYPOELASTICSOLID<2>::GetDofList(DofsVectorType& rElementalDofList, + const ProcessInfo& rCurrentProcessInfo) +{ + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + unsigned int number_of_nodes = GetGeometry().PointsNumber(); + unsigned int dim = 2; + + + if(rElementalDofList.size() != number_of_nodes*dim) + rElementalDofList.resize(number_of_nodes*dim); + + for (unsigned int i=0; i +void HYPOELASTICSOLID<3>::GetDofList(DofsVectorType& rElementalDofList, + const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int NumNodes(4),LocalSize(12);//LocalSize(16) + if (rElementalDofList.size() != LocalSize) + rElementalDofList.resize(LocalSize); + + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + unsigned int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_X); + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_Y); + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_Z); + //rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(PRESSURE); + } +}*/ +*/ +/** + * @see HYPOELASTICSOLID::GetFirstDerivativesVector + */ +/*template <> +void HYPOELASTICSOLID<2>::GetFirstDerivativesVector(Vector& Values, int Step) +{ + + const unsigned int number_of_nodes = GetGeometry().size(); + const unsigned int dim = GetGeometry().WorkingSpaceDimension(); + unsigned int MatSize = number_of_nodes*dim; + if(Values.size() != MatSize) Values.resize(MatSize,false); + for (unsigned int i=0; i& vel = GetGeometry()[i].FastGetSolutionStepValue(VELOCITY,Step); + Values[index] = vel[0]; + Values[index + 1] = vel[1]; + } +}*/ + +/** + * @see HYPOELASTICSOLID::GetFirstDerivativesVector + */ +/*template <> +void HYPOELASTICSOLID<3>::GetFirstDerivativesVector(Vector& Values, int Step) +{ + + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + + const unsigned int NumNodes(4),LocalSize(12); + unsigned int LocalIndex = 0; + + if (Values.size() != LocalSize) + Values.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + const array_1d& rVelocity = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY, Step); + Values[LocalIndex++] = rVelocity[0]; + Values[LocalIndex++] = rVelocity[1]; + Values[LocalIndex++] = rVelocity[2]; + //Values[LocalIndex++] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE, Step); + } + KRATOS_WATCH("fluiddddddddddddddddddo") + KRATOS_WATCH("fluiddddddddddddddddddo") + KRATOS_WATCH("fluiddddddddddddddddddo") + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + +} +*/ +/** + * @see HYPOELASTICSOLID::GetSecondDerivativesVector + */ +/*template <> +void HYPOELASTICSOLID<2>::GetSecondDerivativesVector(Vector& Values, int Step) +{ +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + const unsigned int number_of_nodes = GetGeometry().size(); + const unsigned int dim = GetGeometry().WorkingSpaceDimension(); + unsigned int MatSize = number_of_nodes*dim; + if(Values.size() != MatSize) Values.resize(MatSize,false); + for (unsigned int i=0; i& acc = GetGeometry()[i].FastGetSolutionStepValue(ACCELERATION,Step); + Values[index] = acc[0]; + Values[index + 1] = acc[1]; + } +} +*/ + +/** + * @see HYPOELASTICSOLID::GetSecondDerivativesVector + */ +/*template <> +void HYPOELASTICSOLID<3>::GetSecondDerivativesVector(Vector& Values, int Step) +{ + const unsigned int number_of_nodes = GetGeometry().size(); + const unsigned int dim = GetGeometry().WorkingSpaceDimension(); + unsigned int MatSize = number_of_nodes*dim; + if(Values.size() != MatSize) Values.resize(MatSize,false); + + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") +KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + + unsigned int index = i*dim; + const array_1d& acc = GetGeometry()[i].FastGetSolutionStepValue(ACCELERATION,Step); + Values[index] = acc[0]; + Values[index + 1] = acc[1]; + Values[index + 2] = acc[2]; + } +} +*/ +/** + * The size of the 2D element is estimated as the diameter of a circle of the same area. + * Area = Pi * (h/2)^2 + * @see HYPOELASTICSOLID::ElementSize + */ + +/** + * The size of the 3D element is estimated as the diameter of the sphere + * circumscribed to a regular tetrahedron with the same volume. + * @see HYPOELASTICSOLID::ElementSize + */ + + +/** + * @see HYPOELASTICSOLID::CalculateOnIntegrationPoints + */ +/*template <> +void HYPOELASTICSOLID<2>::CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int Dim(2),NumNodes(3); + +}*/ + +/** + * @see HYPOELASTICSOLID::CalculateOnIntegrationPoints + */ +/*template <> +void HYPOELASTICSOLID<3>::CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int Dim(3),NumNodes(4); + +} +*/ + + + +/** + * See HYPOELASTICSOLID::CalculateB + */ + + +/** + * See HYPOELASTICSOLID::CalculateB + */ + + +/** + * See HYPOELASTICSOLID::CalculateC + */ + +/** + * See HYPOELASTICSOLID::CalculateC + */ + + +/** + * @see HYPOELASTICSOLID::AddViscousTerm + */ + + +/** + * @see HYPOELASTICSOLID::AddViscousTerm + */ + +///@} // Specialized implementations +} diff --git a/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.h b/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.h new file mode 100644 index 000000000000..894628f40f65 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_elements/HypoElasticSolid.h @@ -0,0 +1,1622 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ \. +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_HYPOELASTICSOLID_H_INCLUDED ) +#define KRATOS_HYPOELASTICSOLID_H_INCLUDED + +// System includes +#include +#include + + +// External includes + + +// Project includes +#include "containers/array_1d.h" +#include "includes/checks.h" +#include "includes/define.h" +#include "includes/element.h" +#include "includes/serializer.h" +#include "includes/cfd_variables.h" +#include "utilities/geometry_utilities.h" + +// Application includes +#include "pfem_melting_application_variables.h" + +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application.h" +#include "../applications/FluidDynamicsApplication/custom_elements/vms.h" +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application_variables.h" + + +namespace Kratos +{ + +///@addtogroup FluidDynamicsApplication +///@{ + +///@name Kratos Globals +///@{ + +///@} +///@name Type Definitions +///@{ + +///@} +///@name Enum's +///@{ + +///@} +///@name Functions +///@{ + +///@} +///@name Kratos Classes +///@{ + +/// A stabilized element for the incompressible Navier-Stokes equations. +/** + * This class implements a stabilized formulation based on the + * Variational Multiscale framework. The the subscales can be modeled + * using either Algebraic Subgird Scales (ASGS) or Orthogonal Subscales (OSS). + * In the case of OSS, the projection terms are treated explicitly (computed + * using the results of the previous iteration) and the subscales are not + * tracked in time. The choice of subscale model is made based on the ProcessInfo + * variable OSS_SWITCH (OSS if 1, ASGS otherwise). + * This class implements both the 2D and 3D versions of the element. + * + * The ASGS implementation follows Ramon Codina, A stabilized finite element + * method for generalized stationary incompressible flows, Computer Methods in + * Applied Mechanics and Engineering. Vol. 190 (2001), 2681-2706. + * + * The OSS implementation corresponds to the case identified as explicit, quasi- + * static orthogonal subscales in Ramon Codina, Stabilized finite element approximation + * of transient incompressible flows using orthogonal subscales, Computer Methods + * in Applied Mechanics and Engineering. Vol. 191 (2002), 4295-4321. + * + * In addition to the stabilization, this element implements the Smagorinsky + * model of turbulence. This turbulent term is only activated if the elemental + * value C_SMAGORINSKY is set to something other than zero. + * + * This class requires at least the following variables:\n + * On each Node, as solution step variables VELOCITY, PRESSURE, ACCELERATION, MESH_VELOCITY, DENSITY, VISCOSITY.\n + * On ProcessInfo OSS_SWITCH, DYNAMIC_TAU, DELTA_TIME.\n + * If OSS is used, the nodes also require NODAL_AREA, ADVPROJ and DIVPROJ as solution step variables.\n + * If Smagorinsky is used, C_SMAGORINSKY has to be defined on the elements.\n + * Error estimation stores ERROR_RATIO on the elements.\n + * Some additional variables can be used to print results on the element: SUBSCALE_VELOCITY, SUBSCALE_PRESSURE, TAUONE, TAUTWO, MU, VORTICITY. + * + * @see ResidualBasedEliminationBuilderAndSolver compatible monolithic solution strategy. + * @see PressureSplittingBuilderAndSolver compatible segregated solution strategy. + * @see TrilinosPressureSplittingBuilderAndSolver compatible mpi strategy. + * @see DynamicSmagorinskyUtils to set the Smagorinsky parameter dynamically. + * @see ResidualBasedPredictorCorrectorVelocityBossakScheme time scheme that can use + * OSS stabilization. + */ +template< unsigned int TDim, + unsigned int TNumNodes = TDim + 1 > +class KRATOS_API(PFEM_MELTING_APPLICATION) HYPOELASTICSOLID : public Element + +{ +public: + ///@name Type Definitions + ///@{ + /// Pointer definition of TwoFluidVMS + KRATOS_CLASS_INTRUSIVE_POINTER_DEFINITION(HYPOELASTICSOLID); + ///base type: an IndexedObject that automatically has a unique number + typedef IndexedObject BaseType; + ///Element from which it is derived + typedef HYPOELASTICSOLID ElementBaseType; + ///definition of node type (default is: Node<3>) + typedef Node < 3 > NodeType; + /** + * Properties are used to store any parameters + * related to the constitutive law + */ + typedef Properties PropertiesType; + ///definition of the geometry type with given NodeType + typedef Geometry GeometryType; + ///definition of nodes container type, redefined from GeometryType + typedef Geometry::PointsArrayType NodesArrayType; + typedef Vector VectorType; + typedef typename ElementBaseType::MatrixType MatrixType; + typedef std::size_t IndexType; + typedef std::size_t SizeType; + typedef std::vector EquationIdVectorType; + typedef std::vector< Dof::Pointer > DofsVectorType; + typedef PointerVectorSet, IndexedObject> DofsArrayType; + ///@} + ///@name Life Cycle + ///@{ + //Constructors. + /// Default constuctor. + /** + * @param NewId Index number of the new element (optional) + */ + HYPOELASTICSOLID(IndexType NewId = 0) : + ElementBaseType(NewId) + { + } + ///Constructor using an array of nodes. + /** + * @param NewId Index of the new element + * @param ThisNodes An array containing the nodes of the new element + */ + HYPOELASTICSOLID(IndexType NewId, const NodesArrayType& ThisNodes) : + ElementBaseType(NewId, ThisNodes) + { + } + /// Constructor using a geometry object. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + */ + HYPOELASTICSOLID(IndexType NewId, GeometryType::Pointer pGeometry) : + ElementBaseType(NewId, pGeometry) + { + } + /// Constuctor using geometry and properties. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + * @param pProperties Pointer to the element's properties + */ + HYPOELASTICSOLID(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : + ElementBaseType(NewId, pGeometry, pProperties) + { + } + /// Destructor. + ~HYPOELASTICSOLID() override + { + } + ///@} + ///@name Operators + ///@{ + ///@} + ///@name Operations + ///@{ + /// Create a new element of this type + /** + * Returns a pointer to a new TwoFluidVMS element, created using given input + * @param NewId the ID of the new element + * @param ThisNodes the nodes of the new element + * @param pProperties the properties assigned to the new element + * @return a Pointer to the new element + */ + Element::Pointer Create(IndexType NewId, NodesArrayType const& ThisNodes, + PropertiesType::Pointer pProperties) const override + { + + // int pepe=0; + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! FIRST TIME < FIRST !!!!!!!!", pepe); + return Kratos::make_intrusive< HYPOELASTICSOLID >(NewId, (this->GetGeometry()).Create(ThisNodes), pProperties); + } + Element::Pointer Create(IndexType NewId, + GeometryType::Pointer pGeom, + PropertiesType::Pointer pProperties) const override + { + //int pepe=0; + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! FIRST TIME < FIRST !!!!!!!!", pepe); + return Kratos::make_intrusive< HYPOELASTICSOLID >(NewId, pGeom, pProperties); + } + + + /// Provides local contributions from body forces and OSS projection terms + /** + * This is called during the assembly process and provides the terms of the + * system that are either constant or computed explicitly (from the 'old' + * iteration variables). In this case this means the body force terms and the + * OSS projections, that are treated explicitly. + * @param rLeftHandSideMatrix the elemental left hand side matrix. Not used here, required for compatibility purposes only. + * @param rRightHandSideVector the elemental right hand side + * @param rCurrentProcessInfo the current process info + */ + void CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, + VectorType& rRightHandSideVector, + const ProcessInfo& rCurrentProcessInfo) override + { + + //if (rLeftHandSideMatrix.size1() != 6) + //rLeftHandSideMatrix.resize(6, 6, false); + + const unsigned int LocalSize = TDim * TNumNodes; + + // Check sizes and initialize matrix + if (rLeftHandSideMatrix.size1() != LocalSize) + rLeftHandSideMatrix.resize(LocalSize, LocalSize, false); + // + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize); + + + //if(rRightHandSideVector.size() != 6) + // rRightHandSideVector.resize(6,false); + + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize);//ZeroMatrix(6, 6); + // Calculate RHS + this->CalculateRightHandSide(rRightHandSideVector, rCurrentProcessInfo); + KRATOS_WATCH(rRightHandSideVector) + } + + /// Returns a zero matrix of appropiate size (provided for compatibility with scheme) + /** + * @param rLeftHandSideMatrix Local matrix, will be filled with zeros + * @param rCurrentProcessInfo Process info instance + */ + void CalculateLeftHandSide(MatrixType& rLeftHandSideMatrix, + const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = TDim * TNumNodes; + + if (rLeftHandSideMatrix.size1() != LocalSize) + rLeftHandSideMatrix.resize(LocalSize, LocalSize, false); + + //if (rLeftHandSideMatrix.size1() != 6) + // rLeftHandSideMatrix.resize(6, 6, false); + + //noalias(rLeftHandSideMatrix) = ZeroMatrix(6, 6); + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize); + } + + /// Provides local contributions from body forces and projections to the RHS + /** + * This is called during the assembly process and provides the RHS terms of the + * system that are either constant or computed explicitly (from the 'old' + * iteration variables). In this case this means the body force terms and the + * OSS projections, that are treated explicitly. + * @param rRightHandSideVector Will be filled with the elemental right hand side + * @param rCurrentProcessInfo ProcessInfo instance from the ModelPart. It is + * expected to contain values for OSS_SWITCH, DYNAMIC_TAU and DELTA_TIME + */ + void CalculateRightHandSide(VectorType& rRightHandSideVector, const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = TDim * TNumNodes; + //KRATOS_WATCH("ALLLLLLLLLLA") + // Check sizes and initialize + if (rRightHandSideVector.size() != LocalSize) + rRightHandSideVector.resize(LocalSize, false); + + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + + + /*if(rRightHandSideVector.size() != 6) + rRightHandSideVector.resize(6,false);*/ + + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + //noalias(rRightHandSideVector) = ZeroVector(6); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); +/* KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO")*/ + + // Calculate this element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + //KRATOS_WATCH("DENSITY") + //KRATOS_WATCH(Density) + + // Calculate Momentum RHS contribution + //this->AddMomentumRHS(rRightHandSideVector, Density, N, Area); + + + //writing the body force + const array_1d& body_force = 0.333333333*(this->GetGeometry()[0].FastGetSolutionStepValue(BODY_FORCE)+ this->GetGeometry()[1].FastGetSolutionStepValue(BODY_FORCE) + this->GetGeometry()[2].FastGetSolutionStepValue(BODY_FORCE)); + //const array_1d& body_force = GetProperties()[BODY_FORCE]; + for(unsigned int i = 0; i & CauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + + //KRATOS_WATCH(CauchyStress) + //dN1/dx*SigmaX + 0 + dN1/dy*TauXY + rRightHandSideVector[0] -= DN_DX(0,0)*CauchyStress(0,0) + DN_DX(0,1)*CauchyStress(0,1) ; + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + rRightHandSideVector[1] -= DN_DX(0,1)*CauchyStress(1,1) + DN_DX(0,0)*CauchyStress(0,1) ; + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + rRightHandSideVector[2] -= DN_DX(1,0)*CauchyStress(0,0) + DN_DX(1,1)*CauchyStress(0,1) ; + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + rRightHandSideVector[3] -= DN_DX(1,1)*CauchyStress(1,1) + DN_DX(1,0)*CauchyStress(0,1) ; + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[4] -= DN_DX(2,0)*CauchyStress(0,0) + DN_DX(2,1)*CauchyStress(0,1) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[5] -= DN_DX(2,1)*CauchyStress(1,1) + DN_DX(2,0)*CauchyStress(0,1) ; + + rRightHandSideVector*=Area; + } + else{ + const BoundedMatrix & CauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + //KRATOS_WATCH(CauchyStress) + //dN1/dx*SigmaX + 0 + dN1/dy*TauXY + rRightHandSideVector[0] -= DN_DX(0,0)*CauchyStress(0,0) + DN_DX(0,1)*CauchyStress(0,1) + DN_DX(0,2)*CauchyStress(0,2); + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + rRightHandSideVector[1] -= DN_DX(0,0)*CauchyStress(1,0) + DN_DX(0,1)*CauchyStress(1,1) + DN_DX(0,2)*CauchyStress(1,2); + + rRightHandSideVector[2] -= DN_DX(0,0)*CauchyStress(2,0) + DN_DX(0,1)*CauchyStress(2,1) + DN_DX(0,2)*CauchyStress(2,2); + + + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + rRightHandSideVector[3] -= DN_DX(1,0)*CauchyStress(0,0) + DN_DX(1,1)*CauchyStress(0,1) + DN_DX(1,2)*CauchyStress(0,2); + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + rRightHandSideVector[4] -= DN_DX(1,0)*CauchyStress(1,0) + DN_DX(1,1)*CauchyStress(1,1) + DN_DX(1,2)*CauchyStress(1,2) ; + + rRightHandSideVector[5] -= DN_DX(1,0)*CauchyStress(2,0) + DN_DX(1,1)*CauchyStress(2,1) + DN_DX(1,2)*CauchyStress(2,2) ; + + + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[6] -= DN_DX(2,0)*CauchyStress(0,0) + DN_DX(2,1)*CauchyStress(0,1) + DN_DX(2,2)*CauchyStress(0,2) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[7] -= DN_DX(2,0)*CauchyStress(1,0) + DN_DX(2,1)*CauchyStress(1,1) + DN_DX(2,2)*CauchyStress(1,2) ; + + rRightHandSideVector[8] -= DN_DX(2,0)*CauchyStress(2,0) + DN_DX(2,1)*CauchyStress(2,1) + DN_DX(2,2)*CauchyStress(2,2) ; + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[9] -= DN_DX(3,0)*CauchyStress(0,0) + DN_DX(3,1)*CauchyStress(0,1) + DN_DX(3,2)*CauchyStress(0,2) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[10] -= DN_DX(3,0)*CauchyStress(1,0) + DN_DX(3,1)*CauchyStress(1,1) + DN_DX(3,2)*CauchyStress(1,2) ; + + rRightHandSideVector[11] -= DN_DX(3,0)*CauchyStress(2,0) + DN_DX(3,1)*CauchyStress(2,1) + DN_DX(3,2)*CauchyStress(2,2) ; + + + + rRightHandSideVector*=Area; + + + } + + } + + /// Computes local contributions to the mass matrix + /** + * Provides the local contributions to the mass matrix, which is defined here + * as the matrix associated to velocity derivatives. Note that the mass + * matrix implemented here is lumped. + * @param rMassMatrix Will be filled with the elemental mass matrix + * @param rCurrentProcessInfo the current process info instance + */ + void CalculateMassMatrix(MatrixType& rMassMatrix, const ProcessInfo& rCurrentProcessInfo) override +{ + KRATOS_TRY + const unsigned int LocalSize = TDim * TNumNodes; + + // Resize and set to zero + if (rMassMatrix.size1() != LocalSize) + rMassMatrix.resize(LocalSize, LocalSize, false); + + rMassMatrix = ZeroMatrix(LocalSize, LocalSize); + + // Get the element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + // Add 'classical' mass matrix (lumped) + double Coeff = Density * Area / TNumNodes; //Optimize! + this->CalculateLumpedMassMatrix(rMassMatrix, Coeff); + +/* const double& density = 0.333333333*(this->GetGeometry()[0].FastGetSolutionStepValue(DENSITY)+ + this->GetGeometry()[1].FastGetSolutionStepValue(DENSITY) + + this->GetGeometry()[2].FastGetSolutionStepValue(DENSITY)); + //lumped + unsigned int dimension = this->GetGeometry().WorkingSpaceDimension(); + unsigned int NumberOfNodes = this->GetGeometry().size(); + + double mA0 = GeometryUtils::CalculateVolume2D(this->GetGeometry()); + + if(rMassMatrix.size1() != 6) + rMassMatrix.resize(6,6,false); + + noalias(rMassMatrix) = ZeroMatrix(6,6); + + double nodal_mass = mA0 * density * 0.333333333333333333; + + for(unsigned int i=0; i msB; + BoundedMatrix ms_constitutive_matrix; + BoundedMatrix ms_temp; + + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + + unsigned int NumberOfNodes = this->GetGeometry().size(); + unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + + //getting data for the given geometry + double Area; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + + double NU = this->GetProperties()[POISSON_RATIO];// GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + //SHEAR CONTRIBUTION TO THE "DAMPING" MATRIX + for (unsigned int i=0; i Vel; + Vel[0] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_X); + Vel[1] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_Y); + Vel[2] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_X); + Vel[3] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_Y); + Vel[4] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_X); + Vel[5] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_Y); + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, Vel); + } + else{ + + //fill in the damping matrix + BoundedMatrix msB = ZeroMatrix(6,12); + BoundedMatrix ms_constitutive_matrix; + BoundedMatrix ms_temp; + + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + + unsigned int NumberOfNodes = this->GetGeometry().size(); + unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + + //getting data for the given geometry + double Area; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + + double NU = this->GetProperties()[POISSON_RATIO];// GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + //SHEAR CONTRIBUTION TO THE "DAMPING" MATRIX + for (unsigned int i=0; i Vel; + Vel[0] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_X); + Vel[1] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_Y); + Vel[2] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_X); + Vel[3] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_Y); + Vel[4] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_X); + Vel[5] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_Y); + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, Vel);*/ + + } + + VectorType U = ZeroVector(LocalSize); + int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + array_1d< double, 3 > & rVel = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY); + for (unsigned int d = 0; d < TDim; ++d) // Velocity Dofs + { + U[LocalIndex] = rVel[d]; + ++LocalIndex; + } + /*U[LocalIndex] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE); // Pressure Dof + ++LocalIndex;*/ + } + + //noalias(rRightHandSideVector) -= prod(rDampingMatrix, U); + + + KRATOS_WATCH(rDampingMatrix) + KRATOS_WATCH(rRightHandSideVector) + KRATOS_CATCH("") +} + + + void FinalizeNonLinearIteration(const ProcessInfo& rCurrentProcessInfo) override + { + } + + /// Implementation of Calculate to compute an error estimate. + /** + * If rVariable == ERROR_RATIO, this function will provide an a posteriori + * estimate of the norm of the subscale velocity, calculated as TauOne*||MomentumResidual||. + * Note that the residual of the momentum equation is evaluated at the element center + * and that the result has units of velocity (L/T). + * The error estimate both saved as the elemental ERROR_RATIO variable and returned as rOutput. + * If rVARIABLE == NODAL_AREA, the element's contribution to nodal area is added to its nodes. + * @param rVariable Use ERROR_RATIO or NODAL_AREA + * @param rOutput Returns the error estimate for ERROR_RATIO, unused for NODAL_AREA + * @param rCurrentProcessInfo Process info instance (will be checked for OSS_SWITCH) + * @see MarkForRefinement for a use of the error ratio + */ + void Calculate(const Variable& rVariable, + double& rOutput, + const ProcessInfo& rCurrentProcessInfo) override + { + + double pepe=0.0; + /*if (rVariable == ERROR_RATIO) + { + rOutput = this->SubscaleErrorEstimate(rCurrentProcessInfo); + this->SetValue(ERROR_RATIO,rOutput); + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + } + else if (rVariable == NODAL_AREA) + { + + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + // Get the element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Carefully write results to nodal variables, to avoid parallelism problems + for (unsigned int i = 0; i < TNumNodes; ++i) + { + this->GetGeometry()[i].SetLock(); // So it is safe to write in the node in OpenMP + this->GetGeometry()[i].FastGetSolutionStepValue(NODAL_AREA) += Area * N[i]; + this->GetGeometry()[i].UnSetLock(); // Free the node for other threads + } + }*/ + } + + /// Implementation of Calculate to compute the local OSS projections. + /** + * If rVariable == ADVPROJ, This function computes the OSS projection + * terms using pressure and velocity values from the previous iteration. The + * projections are then added to the nodal variables ADVPROJ (Momentum residual) + * and DIVPROJ (Mass continuity residual). It is assumed that the scheme will + * divide the result by the assembled NODAL_AREA, which is equivalent to a + * nodal interpolation using a lumped mass matrix. + * @param rVariable Use ADVPROJ + * @param Output Will be overwritten with the elemental momentum error + * @param rCurrentProcessInfo Process info instance (unused) + */ + void Calculate(const Variable >& rVariable, + array_1d & rOutput, + const ProcessInfo& rCurrentProcessInfo) override + { + + KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + double pepe=0.0; + + } + + + void Calculate(const Variable& rVariable, Matrix& Output, const ProcessInfo& rCurrentProcessInfo) +{ + if(rVariable == CAUCHY_STRESS_TENSOR) + { + + if(TDim==2) + { + BoundedMatrix CauchyStress=ZeroMatrix(2,2); + BoundedMatrix HistoricalCauchyStress=ZeroMatrix(2,2); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + //noalias(rCauchyStress) = ZeroMatrix(2, 2); + + const array_1d& v0 = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); + const array_1d& v1 = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY); + const array_1d& v2 = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY); + + double Area; + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + double NU = this->GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + + CauchyStress(0,0)=2.0* (msDN_Dx(0,0)*v0[0]+msDN_Dx(1,0)*v1[0]+msDN_Dx(2,0)*v2[0]); + CauchyStress(0,1)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]; + + CauchyStress(1,0)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]; + CauchyStress(1,1)=2.0*(msDN_Dx(0,1)*v0[1]+msDN_Dx(1,1)*v1[1]+msDN_Dx(2,1)*v2[1]); + + CauchyStress*=MU; + + //KRATOS_WATCH(CauchyStress) + //adding the volumetric part + double div_v = msDN_Dx(0,0)*v0[0] + msDN_Dx(0,1)*v0[1]; + div_v+= msDN_Dx(1,0)*v1[0] + msDN_Dx(1,1)*v1[1]; + div_v+= msDN_Dx(2,0)*v2[0] + msDN_Dx(2,1)*v2[1]; + + CauchyStress(0,0)+=KAPPA*div_v; + CauchyStress(1,1)+=KAPPA*div_v; + //KRATOS_WATCH(CauchyStress) + HistoricalCauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + //KRATOS_WATCH(HistoricalCauchyStress) + CauchyStress+=HistoricalCauchyStress; + //KRATOS_WATCH(CauchyStress) + + this->SetValue(CAUCHY_STRESS_TENSOR, CauchyStress); + Output=CauchyStress; + } + else{ + + double Area; + array_1d N; + BoundedMatrix msDN_Dx; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, N, Area); + + BoundedMatrix CauchyStress=ZeroMatrix(3,3); + BoundedMatrix HistoricalCauchyStress=ZeroMatrix(3,3); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + //noalias(rCauchyStress) = ZeroMatrix(2, 2); + + const array_1d& v0 = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); + const array_1d& v1 = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY); + const array_1d& v2 = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY); + const array_1d& v3 = this->GetGeometry()[3].FastGetSolutionStepValue(VELOCITY); + + double NU = this->GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + CauchyStress(0,0)=2.0* (msDN_Dx(0,0)*v0[0]+msDN_Dx(1,0)*v1[0]+msDN_Dx(2,0)*v2[0]+msDN_Dx(3,0)*v3[0]); + CauchyStress(0,1)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0]+msDN_Dx(3,1)*v3[0]+msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]+msDN_Dx(3,0)*v3[1]; + CauchyStress(0,3)=msDN_Dx(0,2)*v0[0]+msDN_Dx(1,2)*v1[0]+msDN_Dx(2,2)*v2[0]+msDN_Dx(3,2)*v3[0]+msDN_Dx(0,0)*v0[2]+msDN_Dx(1,0)*v1[2]+msDN_Dx(2,0)*v2[2]+msDN_Dx(3,0)*v3[2]; + + + CauchyStress(1,0)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0]+msDN_Dx(3,1)*v3[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]+msDN_Dx(3,0)*v3[1]; + CauchyStress(1,1)=2.0*(msDN_Dx(0,1)*v0[1]+msDN_Dx(1,1)*v1[1]+msDN_Dx(2,1)*v2[1]+msDN_Dx(3,1)*v3[1]); + CauchyStress(1,2)=msDN_Dx(0,2)*v0[1]+msDN_Dx(1,2)*v1[1]+msDN_Dx(2,2)*v2[1] +msDN_Dx(3,2)*v3[1] + msDN_Dx(0,1)*v0[2]+msDN_Dx(1,1)*v1[2]+msDN_Dx(2,1)*v2[2]+msDN_Dx(2,1)*v3[2]; + + + CauchyStress(1,0)=msDN_Dx(0,2)*v0[0]+msDN_Dx(1,2)*v1[0]+msDN_Dx(2,2)*v2[0]+msDN_Dx(3,2)*v3[0] + msDN_Dx(0,0)*v0[2]+msDN_Dx(1,0)*v1[2]+msDN_Dx(2,0)*v2[2]+msDN_Dx(3,0)*v3[2]; + CauchyStress(1,2)=msDN_Dx(0,2)*v0[1]+msDN_Dx(1,2)*v1[1]+msDN_Dx(2,2)*v2[1] +msDN_Dx(3,2)*v3[1] + msDN_Dx(0,1)*v0[2]+msDN_Dx(1,1)*v1[2]+msDN_Dx(2,1)*v2[2]+msDN_Dx(2,1)*v3[2]; + CauchyStress(2,2)=2.0*(msDN_Dx(0,2)*v0[2]+msDN_Dx(1,2)*v1[2]+msDN_Dx(2,2)*v2[2]+msDN_Dx(3,2)*v3[2]); + + CauchyStress*=MU; + + KRATOS_WATCH(CauchyStress) + + } + + + + + + } + else + KRATOS_ERROR << "Wrong variable. Calculate function of hypoelastic element is meant to compute Cauchy stress only." << std::endl; + + +} + + + + // The following methods have different implementations depending on TDim + /// Provides the global indices for each one of this element's local rows + /** + * this determines the elemental equation ID vector for all elemental + * DOFs + * @param rResult A vector containing the global Id of each row + * @param rCurrentProcessInfo the current process info object (unused) + */ + //void EquationIdVector(EquationIdVectorType& rResult, + // const ProcessInfo& rCurrentProcessInfo) const override; + + void EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo& rCurrentProcessInfo) const override//; + + //void HYPOELASTICSOLID<2>::EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo& rCurrentProcessInfo) +{ + double pepe=0.0; + + + + unsigned int number_of_nodes = this->GetGeometry().PointsNumber(); + + //unsigned int dim = 2; + + if(rResult.size() != number_of_nodes*TDim) + rResult.resize(number_of_nodes*TDim,false); + + for (unsigned int i=0; iGetGeometry()[i].GetDof(VELOCITY_X).EquationId(); + rResult[i*TDim+1] = this->GetGeometry()[i].GetDof(VELOCITY_Y).EquationId(); + if(TDim==3) + rResult[i*TDim+2] = this->GetGeometry()[i].GetDof(VELOCITY_Z).EquationId(); + } + + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); +} + + + /// Returns a list of the element's Dofs + /** + * @param ElementalDofList the list of DOFs + * @param rCurrentProcessInfo the current process info instance + */ + void GetDofList(DofsVectorType& rElementalDofList, const ProcessInfo& rCurrentProcessInfo)const override + + { + + unsigned int number_of_nodes = this->GetGeometry().PointsNumber(); + //unsigned int dim = 2; + + if(rElementalDofList.size() != number_of_nodes*TDim) + rElementalDofList.resize(number_of_nodes*TDim); + + for (unsigned int i=0; iGetGeometry()[i].pGetDof(VELOCITY_X); + rElementalDofList[i*TDim+1] = this->GetGeometry()[i].pGetDof(VELOCITY_Y); + if(TDim==3) rElementalDofList[i*TDim+2] = this->GetGeometry()[i].pGetDof(VELOCITY_Z); + + } + +} + + + /// Returns VELOCITY_X, VELOCITY_Y, (VELOCITY_Z,) PRESSURE for each node + /** + * @param Values Vector of nodal unknowns + * @param Step Get result from 'Step' steps back, 0 is current step. (Must be smaller than buffer size) + */ + void GetFirstDerivativesVector(Vector& Values, int Step = 0)const override + { + const unsigned int number_of_nodes = this->GetGeometry().size(); + const unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + unsigned int MatSize = number_of_nodes*dim; + if(Values.size() != MatSize) Values.resize(MatSize,false); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + for (unsigned int i=0; i& vel = this->GetGeometry()[i].FastGetSolutionStepValue(VELOCITY,Step); + Values[index] = vel[0]; + Values[index + 1] = vel[1]; + if(TDim==3) Values[index + 2] = vel[2]; + } +} + + + // void GetFirstDerivativesVector(Vector& Values, int Step = 0) const override; + + /// Returns ACCELERATION_X, ACCELERATION_Y, (ACCELERATION_Z,) 0 for each node + /** + * @param Values Vector of nodal second derivatives + * @param Step Get result from 'Step' steps back, 0 is current step. (Must be smaller than buffer size) + */ + void GetSecondDerivativesVector(Vector& Values, int Step = 0)const override + { + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + const unsigned int number_of_nodes = this->GetGeometry().size(); + const unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + unsigned int MatSize = number_of_nodes*dim; + if(Values.size() != MatSize) Values.resize(MatSize,false); + for (unsigned int i=0; i& acc = this->GetGeometry()[i].FastGetSolutionStepValue(ACCELERATION,Step); + Values[index] = acc[0]; + Values[index + 1] = acc[1]; + if(TDim==3) Values[index + 2] = acc[2]; + } + } + + + virtual void EvaluateInPoint(double& rResult, + const Variable< double >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) + { + // Compute the weighted value of the nodal variable in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rResult = rShapeFunc[0] * rGeom[0].FastGetSolutionStepValue(rVariable); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rResult += rShapeFunc[iNode] * rGeom[iNode].FastGetSolutionStepValue(rVariable); + } + + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + */ + virtual void EvaluateInPoint(array_1d< double, 3 > & rResult, + const Variable< array_1d< double, 3 > >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) + { + // Compute the weighted value of the nodal variable in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rResult = rShapeFunc[0] * rGeom[0].FastGetSolutionStepValue(rVariable); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rResult += rShapeFunc[iNode] * rGeom[iNode].FastGetSolutionStepValue(rVariable); + } + + + /// Obtain an array_1d elemental variable, evaluated on gauss points. + /** + * If the variable is VORTICITY, computes the vorticity (rotational of the velocity) + * based on the current velocity values. Otherwise, it assumes that the input + * variable is an elemental value and retrieves it. Implemented for a + * single gauss point only. + * @param rVariable Kratos vector variable to get + * @param Output Will be filled with the values of the variable on integrartion points + * @param rCurrentProcessInfo Process info instance + */ +/* void CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) override; +*/ + /// Obtain a double elemental variable, evaluated on gauss points. + /** + * If the variable is TAUONE or TAUTWO, calculates the corresponding stabilization + * parameter for the element, based on rCurrentProcessInfo's DELTA_TIME and + * DYNAMIC_TAU. If the variable is MU, calculates the effective viscosity at the + * element center due to Smagorinsky (in 'dynamic' units). Otherwise, it assumes + * that the input variable is an elemental value and retrieves it. + * Implemented for a single gauss point only. + * @param rVariable Kratos vector variable to compute + * @param Output Will be filled with the values of the variable on integrartion points + * @param rCurrentProcessInfo Process info instance + */ +/* void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + { + double pepe=0.0; + } +*/ + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning +/* void CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} +*/ + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning +/* void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} +*/ + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning +/* void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} +*/ + ///@} + ///@name Access + ///@{ + + ///@} + ///@name Elemental Data + ///@{ + + /// Checks the input and that all required Kratos variables have been registered. + /** + * This function provides the place to perform checks on the completeness of the input. + * It is designed to be called only once (or anyway, not often) typically at the beginning + * of the calculations, so to verify that nothing is missing from the input + * or that no common error is found. + * @param rCurrentProcessInfo The ProcessInfo of the ModelPart that contains this element. + * @return 0 if no errors were found. + */ + int Check(const ProcessInfo& rCurrentProcessInfo) const override + { + KRATOS_TRY + + // Perform basic element checks + int ErrorCode = Kratos::Element::Check(rCurrentProcessInfo); + if(ErrorCode != 0) return ErrorCode; + + // Checks on nodes + + // Check that the element's nodes contain all required SolutionStepData and Degrees of freedom + for(unsigned int i=0; iGetGeometry().size(); ++i) + { + const auto &rNode = this->GetGeometry()[i]; + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(VELOCITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(PRESSURE,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(MESH_VELOCITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(ACCELERATION,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(DENSITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(VISCOSITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(BODY_FORCE,rNode); + // Not checking OSS related variables NODAL_AREA, ADVPROJ, DIVPROJ, which are only required as SolutionStepData if OSS_SWITCH == 1 + + KRATOS_CHECK_DOF_IN_NODE(VELOCITY_X,rNode); + KRATOS_CHECK_DOF_IN_NODE(VELOCITY_Y,rNode); + if (TDim == 3) KRATOS_CHECK_DOF_IN_NODE(VELOCITY_Z,rNode); + KRATOS_CHECK_DOF_IN_NODE(PRESSURE,rNode); + } + // Not checking OSS related variables NODAL_AREA, ADVPROJ, DIVPROJ, which are only required as SolutionStepData if OSS_SWITCH == 1 + + // If this is a 2D problem, check that nodes are in XY plane + if (this->GetGeometry().WorkingSpaceDimension() == 2) + { + for (unsigned int i=0; iGetGeometry().size(); ++i) + { + if (this->GetGeometry()[i].Z() != 0.0) + KRATOS_ERROR << "Node " << this->GetGeometry()[i].Id() << "has non-zero Z coordinate." << std::endl; + } + } + + return 0; + + KRATOS_CATCH(""); + } + + ///@} + ///@name Inquiry + ///@{ + + + ///@} + ///@name Input and output + ///@{ + + /// Turn back information as a string. + std::string Info() const override + { + std::stringstream buffer; + buffer << "HYPOELASTICSOLID #" << this->Id(); + return buffer.str(); + } + + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "HYPOELASTICSOLID" << TDim << "D"; + } + +// /// Print object's data. +// virtual void PrintData(std::ostream& rOStream) const; + + ///@} + ///@name Friends + ///@{ + + + ///@} + +protected: + ///@name Protected static Member Variables + ///@{ + + + ///@} + ///@name Protected member Variables + ///@{ + + + ///@} + ///@name Protected Operators + ///@{ + + + ///@} + ///@name Protected Operations + ///@{ + + /// Calculate Stabilization parameters. + /** + * Calculates both tau parameters based on a given advective velocity. + * Takes time step and dynamic coefficient from given ProcessInfo instance. + * ProcessInfo variables DELTA_TIME and DYNAMIC_TAU will be used. + * @param TauOne First stabilization parameter (momentum equation) + * @param TauTwo Second stabilization parameter (mass equation) + * @param rAdvVel advection velocity + * @param ElemSize Characteristic element length + * @param Density Density on integrartion point + * @param Viscosity Dynamic viscosity (mu) on integrartion point + * @param rCurrentProcessInfo Process info instance + */ +/* virtual void CalculateTau(double& TauOne, + double& TauTwo, + const array_1d< double, 3 > & rAdvVel, + const double ElemSize, + const double Density, + const double Viscosity, + const ProcessInfo& rCurrentProcessInfo) + { + // Compute mean advective velocity norm + double AdvVelNorm = 0.0; + for (unsigned int d = 0; d < TDim; ++d) + AdvVelNorm += rAdvVel[d] * rAdvVel[d]; + + AdvVelNorm = sqrt(AdvVelNorm); + + double InvTau = Density * ( rCurrentProcessInfo[DYNAMIC_TAU] / rCurrentProcessInfo[DELTA_TIME] + 2.0*AdvVelNorm / ElemSize ) + 4.0*Viscosity/ (ElemSize * ElemSize); + TauOne = 1.0 / InvTau; + TauTwo = Viscosity + 0.5 * Density * ElemSize * AdvVelNorm; + } +*/ + /// Add the momentum equation contribution to the RHS (body forces) + virtual void AddMomentumRHS(VectorType& F, + const double Density, + const array_1d& rShapeFunc, + const double Weight) + { + double Coef = Density * Weight; + + array_1d BodyForce = ZeroVector(3); + this->EvaluateInPoint(BodyForce, BODY_FORCE, rShapeFunc); + + // Add the results to the velocity components (Local Dofs are vx, vy, [vz,] p for each node) + int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + for (unsigned int d = 0; d < TDim; ++d) + { + F[LocalIndex++] += Coef * rShapeFunc[iNode] * BodyForce[d]; + } + ++LocalIndex; // Skip pressure Dof + } + + } + + void CalculateLumpedMassMatrix(MatrixType& rLHSMatrix, + const double Mass) + { + unsigned int DofIndex = 0; + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + for (unsigned int d = 0; d < TDim; ++d) + { + rLHSMatrix(DofIndex, DofIndex) += Mass; + ++DofIndex; + } + ++DofIndex; // Skip pressure Dof + } + } + /// Calculate momentum stabilization parameter (without time term). + /** + * Calculates the momentum tau parameter based on a given advective velocity. + * The dynamic term is not taken into account. This function + * is intended for error estimation only. In other cases use CalculateTau + * @param TauOne First stabilization parameter (momentum equation) + * @param rAdvVel advection velocity + * @param ElemSize Characteristic element length + * @param Density Density on integrartion point + * @param Viscosity Dynamic viscosity (mu) on integrartion point + */ + + + /// Add the momentum equation contribution to the RHS (body forces) + + /// Add OSS projection terms to the RHS + + + /// Add lumped mass matrix + /** + * Adds the lumped mass matrix to an elemental LHS matrix. Note that the time factor + * (typically 1/(k*Dt) ) is added by the scheme outside the element. + * @param rLHSMatrix The local matrix where the result will be added + * @param Mass The weight assigned to each node (typically Density * Area / NumNodes or Density*Volume / NumNodes) + */ + + + /// Add mass-like stabilization terms to LHS. + /** + * This function is only used in ASGS. For OSS, we avoid computing these + * terms, as they shoud cancel out with the dynamic part of the projection + * (which is not computed either) + * @param rLHSMatrix Left hand side of the velocity-pressure system + * @param Density Density on integration point + * @param rAdvVel Advective velocity on integration point + * @param TauOne Stabilization parameter for momentum equation + * @param rShapeFunc Shape funcitions evaluated on integration point + * @param rShapeDeriv Shape function derivatives evaluated on integration point + * @param Weight Area (or volume) times integration point weight + */ + + + /// Add a the contribution from a single integration point to the velocity contribution + + + + /// Assemble the contribution from an integration point to the element's residual. + /** Note that the dynamic term is not included in the momentum equation. + * If OSS_SWITCH = 1, we don't take into account the 'dynamic' stabilization + * terms, as it they belong to the finite element space. + */ + + + /// Assemble the contribution from an integration point to the element's residual. + /** + * ASGS version. Note that rElementalMomRes should be initialized before calling this. + * @param rAdvVel Convection velocity (not including subscale) + * @param Density Fluid density evaluated at integration point + * @param rElementalMomRes Result + * @param rShapeFunc Shape functions evaluated at integration point + * @param rShapeDeriv Shape function derivatives evaluated at integration point + * @param Weight Integration point weight (as a fraction of area or volume) + */ + + + /// Assemble the contribution from an integration point to the element's residual. + /** + * OSS version. Note that rElementalMomRes should be initialized before calling this. + * @param rAdvVel Convection velocity (not including subscale) + * @param Density Fluid density evaluated at integration point + * @param rElementalMomRes Result + * @param rShapeFunc Shape functions evaluated at integration point + * @param rShapeDeriv Shape function derivatives evaluated at integration point + * @param Weight Integration point weight (as a fraction of area or volume) + */ + + + + /** + * @brief EffectiveViscosity Calculate the viscosity at given integration point, using Smagorinsky if enabled. + * + * The Smagorinsky model is used only if the C_SMAGORINSKY is defined on the elemental data container. + * + * @note: This function is redefined when using Non-Newtonian constitutive models. It is important to keep its + * signature, otherwise non-Newtonian models will stop working. + * + * @param Density The fluid's density at the integration point. + * @param rN Nodal shape functions evaluated at the integration points (area coordinates for the point). + * @param rDN_DX Shape function derivatives at the integration point. + * @param ElemSize Representative length of the element (used only for Smagorinsky). + * @param rProcessInfo ProcessInfo instance passed from the ModelPart. + * @return Effective viscosity, in dynamic units (Pa*s or equivalent). + */ + + + /** + * @brief EquivalentStrainRate Calculate the second invariant of the strain rate tensor GammaDot = (2SijSij)^0.5. + * + * @note Our implementation of non-Newtonian consitutive models such as Bingham relies on this funcition being + * defined on all fluid elements. + * + * @param rDN_DX Shape function derivatives at the integration point. + * @return GammaDot = (2SijSij)^0.5. + */ + + /// Write the advective velocity evaluated at this point to an array + /** + * Writes the value of the advective velocity evaluated at a point inside + * the element to an array_1d + * @param rAdvVel Output array + * @param rShapeFunc Shape functions evaluated at the point of interest + */ + + + /// Write the advective velocity evaluated at this point to an array + /** + * Writes the value of the advective velocity evaluated at a point inside + * the element to an array_1d + * @param rAdvVel Output array + * @param rShapeFunc Shape functions evaluated at the point of interest + * @param Step The time Step + */ + + /// Write the convective operator evaluated at this point (for each nodal funciton) to an array + /** + * Evaluate the convective operator for each node's shape function at an arbitrary point + * @param rResult Output vector + * @param rVelocity Velocity evaluated at the integration point + * @param rShapeDeriv Derivatives of shape functions evaluated at the integration point + * @see GetAdvectiveVel provides rVelocity + */ + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + * @param Step The time Step (Defaults to 0 = Current) + */ + + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + */ + + + /// Return an estimate for the element size h, used to calculate the stabilization parameters + /** + * Estimate the element size from its area or volume, required to calculate stabilization parameters. + * Note that its implementation is different for 2D or 3D elements. + * @see VMS2D, VMS3D for actual implementation + * @param Volume (in 3D) or Area (in 2D) of the element + * @return Element size h + */ + + /// Adds the contribution of the viscous term to the momentum equation. + /** + * The viscous term is written in stress-divergence (Cauchy) form. + * @param rDampingMatrix Elemental Damping matrix + * @param rShapeDeriv Elemental shape function derivatives + * @param Weight Effective viscosity, in dynamic units, weighted by the integration point area + */ + + + /// Adds the contribution of the viscous term to the momentum equation (alternate). + /** + * This function is an alternate implementation of VMS::AddViscousTerm. + * This version works with ublas matrices, using the relationship between stress and + * rate of strain given by VMS::CalculateC. It is currently unused (as VMS::AddViscousTerm + * is a more efficient implementation of the Cauchy equation) but it is left here so derived + * classes can use it to implement other constitutive equations. + * @param rDampingMatrix Elemental Damping matrix + * @param rShapeDeriv Elemental shape function derivatives + * @param Weight Effective viscosity, in dynamic units, weighted by the integration point area + */ + + + /// Calculate the strain rate matrix + /** + * Unused, left to support derived classes. @see VMS::AddBTransCB + * @param rB Strain rate matrix + * @param rShapeDeriv Nodal shape funcion derivatives + */ + + + /// Calculate a matrix that provides the stress given the strain rate + /** + * Unused, left to support derived classes. @see VMS::AddBTransCB. + * Note that only non-zero terms are written, so the output matrix should be + * initialized before calling this. + * @param rC Matrix representation of the stress tensor (output) + * @param Viscosity Effective viscosity, in dynamic units, weighted by the integration point area + */ + + + + + + + + ///@} + ///@name Protected Access + ///@{ + + + ///@} + ///@name Protected Inquiry + ///@{ + + + ///@} + ///@name Protected LifeCycle + ///@{ + + + ///@} + +private: + ///@name Static Member Variables + ///@{ + + + ///@} + ///@name Member Variables + ///@{ + + ///@} + ///@name Serialization + ///@{ + + friend class Serializer; + + void save(Serializer& rSerializer) const override + { + KRATOS_SERIALIZE_SAVE_BASE_CLASS(rSerializer, Element ); + } + + void load(Serializer& rSerializer) override + { + KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Element); + } + + ///@} + ///@name Private Operators + ///@{ + + + ///@} + ///@name Private Operations + ///@{ + + + ///@} + ///@name Private Access + ///@{ + + + ///@} + ///@name Private Inquiry + ///@{ + + + ///@} + ///@name Un accessible methods + ///@{ + + /// Assignment operator. + HYPOELASTICSOLID & operator=(HYPOELASTICSOLID const& rOther); + + /// Copy constructor. + HYPOELASTICSOLID(HYPOELASTICSOLID const& rOther); + + ///@} + +}; // Class HYPOELASTICSOLID + +///@} + +///@name Type Definitions +///@{ + + +///@} +///@name Input and output +///@{ + + +/// input stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::istream& operator >>(std::istream& rIStream, + HYPOELASTICSOLID& rThis) +{ + return rIStream; +} + +/// output stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::ostream& operator <<(std::ostream& rOStream, + const HYPOELASTICSOLID& rThis) +{ + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + + return rOStream; +} +///@} + +///@} // Fluid Dynamics Application group + +} // namespace Kratos. + +#endif // KRATOS_VMS_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_elements/hypo.cpp b/applications/PfemMeltingApplication/custom_elements/hypo.cpp new file mode 100644 index 000000000000..df0939f6736f --- /dev/null +++ b/applications/PfemMeltingApplication/custom_elements/hypo.cpp @@ -0,0 +1,260 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ \. +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Jordi Cotela +// +#include "hypo.h" + +namespace Kratos +{ +///@name Specialized implementation of VMS for functions that depend on TDim +///@{ + +/** + * @see VMS::EquationIdVector + */ +template <> +void HYPO<2>::EquationIdVector(EquationIdVectorType& rResult, + const ProcessInfo& rCurrentProcessInfo) const +{ + const unsigned int NumNodes(3),LocalSize(6); + unsigned int LocalIndex = 0; + + unsigned int vpos = this->GetGeometry()[0].GetDofPosition(VELOCITY_X); + //unsigned int ppos = this->GetGeometry()[0].GetDofPosition(PRESSURE); + + if (rResult.size() != LocalSize) + rResult.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_X,vpos).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Y,vpos+1).EquationId(); + //rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(PRESSURE,ppos).EquationId(); + } +} + +/** + * @see HYPO::EquationIdVector + */ +template <> +void HYPO<3>::EquationIdVector(EquationIdVectorType& rResult, + const ProcessInfo& rCurrentProcessInfo) const +{ + const unsigned int NumNodes(4),LocalSize(12); + unsigned int LocalIndex = 0; + unsigned int vpos = this->GetGeometry()[0].GetDofPosition(VELOCITY_X); + //unsigned int ppos = this->GetGeometry()[0].GetDofPosition(PRESSURE); + + if (rResult.size() != LocalSize) + rResult.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_X,vpos).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Y,vpos+1).EquationId(); + rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(VELOCITY_Z,vpos+2).EquationId(); + //rResult[LocalIndex++] = this->GetGeometry()[iNode].GetDof(PRESSURE,ppos).EquationId(); + } +} + +/** + * @see HYPO::GetDofList + */ +template <> +void HYPO<2>::GetDofList(DofsVectorType& rElementalDofList, + const ProcessInfo& rCurrentProcessInfo) const +{ + const unsigned int NumNodes(3),LocalSize(6); + if (rElementalDofList.size() != LocalSize) + rElementalDofList.resize(LocalSize); + + unsigned int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_X); + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_Y); + //rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(PRESSURE); + } +} + +/** + * @see HYPO::GetDofList + */ +template <> +void HYPO<3>::GetDofList(DofsVectorType& rElementalDofList, + const ProcessInfo& rCurrentProcessInfo) const +{ + const unsigned int NumNodes(4),LocalSize(12); + if (rElementalDofList.size() != LocalSize) + rElementalDofList.resize(LocalSize); + + unsigned int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_X); + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_Y); + rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(VELOCITY_Z); + //rElementalDofList[LocalIndex++] = this->GetGeometry()[iNode].pGetDof(PRESSURE); + } +} + +/** + * @see HYPO::GetFirstDerivativesVector + */ +template <> +void HYPO<2>::GetFirstDerivativesVector(Vector& Values, int Step) const +{ + const unsigned int NumNodes(3),LocalSize(6); + unsigned int LocalIndex = 0; + + if (Values.size() != LocalSize) + Values.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + const array_1d& rVelocity = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY, Step); + Values[LocalIndex++] = rVelocity[0]; + Values[LocalIndex++] = rVelocity[1]; + //Values[LocalIndex++] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE, Step); + } +} + +/** + * @see HYPO::GetFirstDerivativesVector + */ +template <> +void HYPO<3>::GetFirstDerivativesVector(Vector& Values, int Step) const +{ + const unsigned int NumNodes(4),LocalSize(12); + unsigned int LocalIndex = 0; + + if (Values.size() != LocalSize) + Values.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + const array_1d& rVelocity = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY, Step); + Values[LocalIndex++] = rVelocity[0]; + Values[LocalIndex++] = rVelocity[1]; + Values[LocalIndex++] = rVelocity[2]; + //Values[LocalIndex++] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE, Step); + } +} + +/** + * @see HYPO::GetSecondDerivativesVector + */ +template <> +void HYPO<2>::GetSecondDerivativesVector(Vector& Values, int Step) const +{ + const unsigned int NumNodes(3),LocalSize(6); + unsigned int LocalIndex = 0; + + if (Values.size() != LocalSize) + Values.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + const array_1d& rAcceleration = this->GetGeometry()[iNode].FastGetSolutionStepValue(ACCELERATION, Step); + Values[LocalIndex++] = rAcceleration[0]; + Values[LocalIndex++] = rAcceleration[1]; + //Values[LocalIndex++] = 0.0; // Pressure Dof + } +} + +/** + * @see HYPO::GetSecondDerivativesVector + */ +template <> +void HYPO<3>::GetSecondDerivativesVector(Vector& Values, int Step) const +{ + const unsigned int NumNodes(4),LocalSize(12); + unsigned int LocalIndex = 0; + + if (Values.size() != LocalSize) + Values.resize(LocalSize, false); + + for (unsigned int iNode = 0; iNode < NumNodes; ++iNode) + { + const array_1d& rAcceleration = this->GetGeometry()[iNode].FastGetSolutionStepValue(ACCELERATION, Step); + Values[LocalIndex++] = rAcceleration[0]; + Values[LocalIndex++] = rAcceleration[1]; + Values[LocalIndex++] = rAcceleration[2]; + //Values[LocalIndex++] = 0.0; // Pressure Dof + } +} + +/** + * The size of the 2D element is estimated as the diameter of a circle of the same area. + * Area = Pi * (h/2)^2 + * @see HYPO::ElementSize + */ +template <> +double HYPO<2,3>::ElementSize(const double Area) +{ + return 1.128379167 * sqrt(Area); //Diameter of circumference of given Area +} + +/** + * The size of the 3D element is estimated as the diameter of the sphere + * circumscribed to a regular tetrahedron with the same volume. + * @see HYPO::ElementSize + */ +template <> +double HYPO<3,4>::ElementSize(const double Volume) +{ + return 0.60046878 * pow(Volume,0.333333333333333333333); +} + + +/** + * @see HYPO::CalculateOnIntegrationPoints + */ +template <> +void HYPO<2>::CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int Dim(2),NumNodes(3); + } + +/** + * @see VMS::CalculateOnIntegrationPoints + */ +template <> +void HYPO<3>::CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) +{ + const unsigned int Dim(3),NumNodes(4); + +} + + +template<> +double HYPO<2,3>::ConsistentMassCoef(const double Area) +{ + const double Coef = 1.0/12.0; + return Area * Coef; +} + +template<> +double HYPO<3,4>::ConsistentMassCoef(const double Volume) +{ + const double Coef = 1.0/20.0; + return Volume * Coef; +} + +///@} // Specialized implementations +} diff --git a/applications/PfemMeltingApplication/custom_elements/hypo.h b/applications/PfemMeltingApplication/custom_elements/hypo.h new file mode 100644 index 000000000000..483a8e952490 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_elements/hypo.h @@ -0,0 +1,1792 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ \. +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Jordi Cotela +// + + +#if !defined(KRATOS_HYPOELASTICSOLID_H_INCLUDED ) +#define KRATOS_HYPOELASTICSOLID_H_INCLUDED + +// System includes +#include +#include + + +// External includes + + +// Project includes +#include "containers/array_1d.h" +#include "includes/checks.h" +#include "includes/define.h" +#include "includes/element.h" +#include "includes/serializer.h" +#include "includes/cfd_variables.h" +#include "utilities/geometry_utilities.h" + +// Application includes +#include "pfem_melting_application_variables.h" + +namespace Kratos +{ + +///@addtogroup FluidDynamicsApplication +///@{ + +///@name Kratos Globals +///@{ + +///@} +///@name Type Definitions +///@{ + +///@} +///@name Enum's +///@{ + +///@} +///@name Functions +///@{ + +///@} +///@name Kratos Classes +///@{ + +/// A stabilized element for the incompressible Navier-Stokes equations. +/** + * This class implements a stabilized formulation based on the + * Variational Multiscale framework. The the subscales can be modeled + * using either Algebraic Subgird Scales (ASGS) or Orthogonal Subscales (OSS). + * In the case of OSS, the projection terms are treated explicitly (computed + * using the results of the previous iteration) and the subscales are not + * tracked in time. The choice of subscale model is made based on the ProcessInfo + * variable OSS_SWITCH (OSS if 1, ASGS otherwise). + * This class implements both the 2D and 3D versions of the element. + * + * The ASGS implementation follows Ramon Codina, A stabilized finite element + * method for generalized stationary incompressible flows, Computer Methods in + * Applied Mechanics and Engineering. Vol. 190 (2001), 2681-2706. + * + * The OSS implementation corresponds to the case identified as explicit, quasi- + * static orthogonal subscales in Ramon Codina, Stabilized finite element approximation + * of transient incompressible flows using orthogonal subscales, Computer Methods + * in Applied Mechanics and Engineering. Vol. 191 (2002), 4295-4321. + * + * In addition to the stabilization, this element implements the Smagorinsky + * model of turbulence. This turbulent term is only activated if the elemental + * value C_SMAGORINSKY is set to something other than zero. + * + * This class requires at least the following variables:\n + * On each Node, as solution step variables VELOCITY, PRESSURE, ACCELERATION, MESH_VELOCITY, DENSITY, VISCOSITY.\n + * On ProcessInfo OSS_SWITCH, DYNAMIC_TAU, DELTA_TIME.\n + * If OSS is used, the nodes also require NODAL_AREA, ADVPROJ and DIVPROJ as solution step variables.\n + * If Smagorinsky is used, C_SMAGORINSKY has to be defined on the elements.\n + * Error estimation stores ERROR_RATIO on the elements.\n + * Some additional variables can be used to print results on the element: SUBSCALE_VELOCITY, SUBSCALE_PRESSURE, TAUONE, TAUTWO, MU, VORTICITY. + * + * @see ResidualBasedEliminationBuilderAndSolver compatible monolithic solution strategy. + * @see PressureSplittingBuilderAndSolver compatible segregated solution strategy. + * @see TrilinosPressureSplittingBuilderAndSolver compatible mpi strategy. + * @see DynamicSmagorinskyUtils to set the Smagorinsky parameter dynamically. + * @see ResidualBasedPredictorCorrectorVelocityBossakScheme time scheme that can use + * OSS stabilization. + */ +template< unsigned int TDim, + unsigned int TNumNodes = TDim + 1 > +class KRATOS_API(PFEM_MELTING_APPLICATION) HYPO : public Element +{ +public: + ///@name Type Definitions + ///@{ + + /// Pointer definition of HYPO + KRATOS_CLASS_INTRUSIVE_POINTER_DEFINITION(HYPO); + + ///base type: an IndexedObject that automatically has a unique number + typedef IndexedObject BaseType; + + ///definition of node type (default is: Node<3>) + typedef Node < 3 > NodeType; + + /** + * Properties are used to store any parameters + * related to the constitutive law + */ + typedef Properties PropertiesType; + + ///definition of the geometry type with given NodeType + typedef Geometry GeometryType; + + ///definition of nodes container type, redefined from GeometryType + typedef Geometry::PointsArrayType NodesArrayType; + + typedef Vector VectorType; + + typedef Matrix MatrixType; + + typedef std::size_t IndexType; + + typedef std::size_t SizeType; + + typedef std::vector EquationIdVectorType; + + typedef std::vector< Dof::Pointer > DofsVectorType; + + typedef PointerVectorSet, IndexedObject> DofsArrayType; + + typedef array_1d ShapeFunctionsType; + typedef BoundedMatrix ShapeFunctionDerivativesType; + + ///@} + ///@name Life Cycle + ///@{ + + //Constructors. + + /// Default constuctor. + /** + * @param NewId Index number of the new element (optional) + */ + HYPO(IndexType NewId = 0) : + Element(NewId) + {} + + ///Constructor using an array of nodes. + /** + * @param NewId Index of the new element + * @param ThisNodes An array containing the nodes of the new element + */ + HYPO(IndexType NewId, const NodesArrayType& ThisNodes) : + Element(NewId, ThisNodes) + {} + + /// Constructor using a geometry object. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + */ + HYPO(IndexType NewId, GeometryType::Pointer pGeometry) : + Element(NewId, pGeometry) + {} + + /// Constuctor using geometry and properties. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + * @param pProperties Pointer to the element's properties + */ + HYPO(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : + Element(NewId, pGeometry, pProperties) + {} + + /// Destructor. + ~HYPO() override + {} + + + ///@} + ///@name Operators + ///@{ + + + ///@} + ///@name Operations + ///@{ + + /// Create a new element of this type + /** + * Returns a pointer to a new HYPO element, created using given input + * @param NewId the ID of the new element + * @param ThisNodes the nodes of the new element + * @param pProperties the properties assigned to the new element + * @return a Pointer to the new element + */ + Element::Pointer Create(IndexType NewId, NodesArrayType const& ThisNodes, + PropertiesType::Pointer pProperties) const override + { + return Kratos::make_intrusive< HYPO >(NewId, GetGeometry().Create(ThisNodes), pProperties); + } + + Element::Pointer Create(IndexType NewId, + GeometryType::Pointer pGeom, + PropertiesType::Pointer pProperties) const override + { + return Kratos::make_intrusive< HYPO >(NewId, pGeom, pProperties); + } + + /// Provides local contributions from body forces and OSS projection terms + /** + * This is called during the assembly process and provides the terms of the + * system that are either constant or computed explicitly (from the 'old' + * iteration variables). In this case this means the body force terms and the + * OSS projections, that are treated explicitly. + * @param rLeftHandSideMatrix the elemental left hand side matrix. Not used here, required for compatibility purposes only. + * @param rRightHandSideVector the elemental right hand side + * @param rCurrentProcessInfo the current process info + */ + void CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, + VectorType& rRightHandSideVector, + const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = TDim * TNumNodes; + + // Check sizes and initialize matrix + if (rLeftHandSideMatrix.size1() != LocalSize) + rLeftHandSideMatrix.resize(LocalSize, LocalSize, false); + + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize); + + // Calculate RHS + this->CalculateRightHandSide(rRightHandSideVector, rCurrentProcessInfo); + } + + /// Returns a zero matrix of appropiate size (provided for compatibility with scheme) + /** + * @param rLeftHandSideMatrix Local matrix, will be filled with zeros + * @param rCurrentProcessInfo Process info instance + */ + void CalculateLeftHandSide(MatrixType& rLeftHandSideMatrix, + const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = TDim * TNumNodes; + + if (rLeftHandSideMatrix.size1() != LocalSize) + rLeftHandSideMatrix.resize(LocalSize, LocalSize, false); + + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize); + } + + /// Provides local contributions from body forces and projections to the RHS + /** + * This is called during the assembly process and provides the RHS terms of the + * system that are either constant or computed explicitly (from the 'old' + * iteration variables). In this case this means the body force terms and the + * OSS projections, that are treated explicitly. + * @param rRightHandSideVector Will be filled with the elemental right hand side + * @param rCurrentProcessInfo ProcessInfo instance from the ModelPart. It is + * expected to contain values for OSS_SWITCH, DYNAMIC_TAU and DELTA_TIME + */ + void CalculateRightHandSide(VectorType& rRightHandSideVector, + const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = TDim * TNumNodes; + //KRATOS_WATCH("ALLLLLLLLLLA") + // Check sizes and initialize + if (rRightHandSideVector.size() != LocalSize) + rRightHandSideVector.resize(LocalSize, false); + + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + + /*if(rRightHandSideVector.size() != 6) + rRightHandSideVector.resize(6,false);*/ + + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + //noalias(rRightHandSideVector) = ZeroVector(6); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); +/* KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO") + KRATOS_WATCH("SOLIDOOOOOOOOOOOOOOOOOOOOOOOOOO")*/ + + // Calculate this element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + //KRATOS_WATCH("DENSITY") + //KRATOS_WATCH(Density) + + // Calculate Momentum RHS contribution + //this->AddMomentumRHS(rRightHandSideVector, Density, N, Area); + + + //writing the body force + const array_1d& body_force = 0.333333333*(this->GetGeometry()[0].FastGetSolutionStepValue(BODY_FORCE)+ this->GetGeometry()[1].FastGetSolutionStepValue(BODY_FORCE) + this->GetGeometry()[2].FastGetSolutionStepValue(BODY_FORCE)); + //const array_1d& body_force = GetProperties()[BODY_FORCE]; + + if(TDim==2){ + for(unsigned int i = 0; i & rBodyForce = this->GetGeometry()[i].FastGetSolutionStepValue(BODY_FORCE); + for (unsigned int d = 0; d < TDim; ++d) + { + rRightHandSideVector[d] += 0.25 * Density * rBodyForce[d]; + } + } + + } + + if(TDim==2) + { + //get the value of Cauchy stress at the Gauss point. It is given by: + const BoundedMatrix & CauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + + //KRATOS_WATCH(CauchyStress) + /* + //dN1/dx*SigmaX + 0 + dN1/dy*TauXY + rRightHandSideVector[0] -= DN_DX(0,0)*CauchyStress(0,0) + DN_DX(0,1)*CauchyStress(0,1) ; + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + rRightHandSideVector[1] -= DN_DX(0,1)*CauchyStress(1,1) + DN_DX(0,0)*CauchyStress(0,1) ; + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + rRightHandSideVector[2] -= DN_DX(1,0)*CauchyStress(0,0) + DN_DX(1,1)*CauchyStress(0,1) ; + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + rRightHandSideVector[3] -= DN_DX(1,1)*CauchyStress(1,1) + DN_DX(1,0)*CauchyStress(0,1) ; + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[4] -= DN_DX(2,0)*CauchyStress(0,0) + DN_DX(2,1)*CauchyStress(0,1) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[5] -= DN_DX(2,1)*CauchyStress(1,1) + DN_DX(2,0)*CauchyStress(0,1) ; + + rRightHandSideVector*=Area; + + */ + + double SXX= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX); + double SXY= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY); + //double SXZ= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ); + + double SYX= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX); + double SYY= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY); + //double SYZ= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ); + + //double SZX= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX); + //double SZY= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY); + //double SZZ= 0.333333333 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) + 0.333333333 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ)+0.333333333 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ); + + + rRightHandSideVector[0] -= DN_DX(0,0)*SXX + DN_DX(0,1)*SXY; + + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + rRightHandSideVector[1] -= DN_DX(0,0)*SYX + DN_DX(0,1)*SYY; + + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + rRightHandSideVector[2] -= DN_DX(1,0)*SXX + DN_DX(1,1)*SXY; + + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + rRightHandSideVector[3] -= DN_DX(1,0)*SYX + DN_DX(1,1)*SYY; + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[4] -= DN_DX(2,0)*SXX + DN_DX(2,1)*SXY; + + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[5] -= DN_DX(2,0)*SYX + DN_DX(2,1)*SYY; + + rRightHandSideVector*=Area; + + + + + } + else{ + const BoundedMatrix & CauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + //KRATOS_WATCH(CauchyStress) + /* + //dN1/dx*SigmaX + 0 + dN1/dy*TauXY + rRightHandSideVector[0] -= DN_DX(0,0)*CauchyStress(0,0) + DN_DX(0,1)*CauchyStress(0,1) + DN_DX(0,2)*CauchyStress(0,2); + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + rRightHandSideVector[1] -= DN_DX(0,0)*CauchyStress(1,0) + DN_DX(0,1)*CauchyStress(1,1) + DN_DX(0,2)*CauchyStress(1,2); + + rRightHandSideVector[2] -= DN_DX(0,0)*CauchyStress(2,0) + DN_DX(0,1)*CauchyStress(2,1) + DN_DX(0,2)*CauchyStress(2,2); + + + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + rRightHandSideVector[3] -= DN_DX(1,0)*CauchyStress(0,0) + DN_DX(1,1)*CauchyStress(0,1) + DN_DX(1,2)*CauchyStress(0,2); + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + rRightHandSideVector[4] -= DN_DX(1,0)*CauchyStress(1,0) + DN_DX(1,1)*CauchyStress(1,1) + DN_DX(1,2)*CauchyStress(1,2) ; + + rRightHandSideVector[5] -= DN_DX(1,0)*CauchyStress(2,0) + DN_DX(1,1)*CauchyStress(2,1) + DN_DX(1,2)*CauchyStress(2,2) ; + + + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[6] -= DN_DX(2,0)*CauchyStress(0,0) + DN_DX(2,1)*CauchyStress(0,1) + DN_DX(2,2)*CauchyStress(0,2) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[7] -= DN_DX(2,0)*CauchyStress(1,0) + DN_DX(2,1)*CauchyStress(1,1) + DN_DX(2,2)*CauchyStress(1,2) ; + + rRightHandSideVector[8] -= DN_DX(2,0)*CauchyStress(2,0) + DN_DX(2,1)*CauchyStress(2,1) + DN_DX(2,2)*CauchyStress(2,2) ; + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + rRightHandSideVector[9] -= DN_DX(3,0)*CauchyStress(0,0) + DN_DX(3,1)*CauchyStress(0,1) + DN_DX(3,2)*CauchyStress(0,2) ; + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + rRightHandSideVector[10] -= DN_DX(3,0)*CauchyStress(1,0) + DN_DX(3,1)*CauchyStress(1,1) + DN_DX(3,2)*CauchyStress(1,2) ; + + rRightHandSideVector[11] -= DN_DX(3,0)*CauchyStress(2,0) + DN_DX(3,1)*CauchyStress(2,1) + DN_DX(3,2)*CauchyStress(2,2) ; + + */ + + + //dN1/dx*SigmaX + 0 + dN1/dy*TauXY + + double SXX= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX); + double SXY= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY); + double SXZ= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ); + + double SYX= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX); + double SYY= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY); + double SYZ= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ); + + double SZX= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX); + double SZY= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY); + double SZZ= 0.25 * this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) + 0.25 * this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ)+0.25 * this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ)+0.25 * this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ); + + + //rRightHandSideVector[0] -= DN_DX(0,0)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + DN_DX(0,1)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + DN_DX(0,2)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ); + rRightHandSideVector[0] -= DN_DX(0,0)*SXX + DN_DX(0,1)*SXY + DN_DX(0,2)*SXZ; + + //0 + dN1/dy*SigmaY + 0 + dN1/dx*TauXY + //rRightHandSideVector[1] -= DN_DX(0,0)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + DN_DX(0,1)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + DN_DX(0,2)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ); + rRightHandSideVector[1] -= DN_DX(0,0)*SYX + DN_DX(0,1)*SYY + DN_DX(0,2)*SYZ; + + //rRightHandSideVector[2] -= DN_DX(0,0)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + DN_DX(0,1)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + DN_DX(0,2)*this->GetGeometry()[0].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ); + rRightHandSideVector[2] -= DN_DX(0,0)*SZX + DN_DX(0,1)*SZY + DN_DX(0,2)*SZZ; + + + //dN2/dx*SigmaX + 0 + dN2/dy*TauXY + //rRightHandSideVector[3] -= DN_DX(1,0)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + DN_DX(1,1)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + DN_DX(1,2)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ); + rRightHandSideVector[3] -= DN_DX(1,0)*SXX + DN_DX(1,1)*SXY + DN_DX(1,2)*SXZ; + + //0 + dN2/dy*SigmaY + 0 + dN2/dx*TauXY + //rRightHandSideVector[4] -= DN_DX(1,0)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + DN_DX(1,1)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + DN_DX(1,2)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) ; + rRightHandSideVector[4] -= DN_DX(1,0)*SYX + DN_DX(1,1)*SYY + DN_DX(1,2)*SYZ; + + + //rRightHandSideVector[5] -= DN_DX(1,0)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + DN_DX(1,1)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + DN_DX(1,2)*this->GetGeometry()[1].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) ; + rRightHandSideVector[5] -= DN_DX(1,0)*SZX + DN_DX(1,1)*SZY + DN_DX(1,2)*SZZ; + + + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + //rRightHandSideVector[6] -= DN_DX(2,0)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + DN_DX(2,1)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + DN_DX(2,2)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) ; + rRightHandSideVector[6] -= DN_DX(2,0)*SXX + DN_DX(2,1)*SXY + DN_DX(2,2)*SXZ ; + + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + //rRightHandSideVector[7] -= DN_DX(2,0)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + DN_DX(2,1)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + DN_DX(2,2)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) ; + rRightHandSideVector[7] -= DN_DX(2,0)*SYX + DN_DX(2,1)*SYY + DN_DX(2,2)*SYZ ; + + + //rRightHandSideVector[8] -= DN_DX(2,0)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + DN_DX(2,1)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + DN_DX(2,2)*this->GetGeometry()[2].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) ; + rRightHandSideVector[8] -= DN_DX(2,0)*SZX + DN_DX(2,1)*SZY + DN_DX(2,2)*SZZ; + + //dN3/dx*SigmaX + 0 + dN3/dy*TauXY + //rRightHandSideVector[9] -= DN_DX(3,0)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) + DN_DX(3,1)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) + DN_DX(3,2)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) ; + rRightHandSideVector[9] -= DN_DX(3,0)*SXX + DN_DX(3,1)*SXY + DN_DX(3,2)*SXZ ; + + //0 + dN3/dy*SigmaY + 0 + dN3/dx*TauXY + //rRightHandSideVector[10] -= DN_DX(3,0)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) + DN_DX(3,1)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) + DN_DX(3,2)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) ; + rRightHandSideVector[10] -= DN_DX(3,0)*SYX + DN_DX(3,1)*SYY + DN_DX(3,2)*SYZ ; + + //rRightHandSideVector[11] -= DN_DX(3,0)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) + DN_DX(3,1)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) + DN_DX(3,2)*this->GetGeometry()[3].FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) ; + rRightHandSideVector[11] -= DN_DX(3,0)*SZX + DN_DX(3,1)*SZY + DN_DX(3,2)*SZZ ; + + rRightHandSideVector*=Area; + + + } + + } + + + /// Computes local contributions to the mass matrix + /** + * Provides the local contributions to the mass matrix, which is defined here + * as the matrix associated to velocity derivatives. Note that the mass + * matrix implemented here is lumped. + * @param rMassMatrix Will be filled with the elemental mass matrix + * @param rCurrentProcessInfo the current process info instance + */ + void CalculateMassMatrix(MatrixType& rMassMatrix, const ProcessInfo& rCurrentProcessInfo) override +{ + KRATOS_TRY + const unsigned int LocalSize = TDim * TNumNodes; + + // Resize and set to zero + if (rMassMatrix.size1() != LocalSize) + rMassMatrix.resize(LocalSize, LocalSize, false); + + rMassMatrix = ZeroMatrix(LocalSize, LocalSize); + + // Get the element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + // Add 'classical' mass matrix (lumped) + double Coeff = Density * Area / TNumNodes; //Optimize! + this->CalculateLumpedMassMatrix(rMassMatrix, Coeff); + +/* const double& density = 0.333333333*(this->GetGeometry()[0].FastGetSolutionStepValue(DENSITY)+ + this->GetGeometry()[1].FastGetSolutionStepValue(DENSITY) + + this->GetGeometry()[2].FastGetSolutionStepValue(DENSITY)); + //lumped + unsigned int dimension = this->GetGeometry().WorkingSpaceDimension(); + unsigned int NumberOfNodes = this->GetGeometry().size(); + + double mA0 = GeometryUtils::CalculateVolume2D(this->GetGeometry()); + + if(rMassMatrix.size1() != 6) + rMassMatrix.resize(6,6,false); + + noalias(rMassMatrix) = ZeroMatrix(6,6); + + double nodal_mass = mA0 * density * 0.333333333333333333; + + for(unsigned int i=0; i msB; + BoundedMatrix ms_constitutive_matrix; + BoundedMatrix ms_temp; + + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + + unsigned int NumberOfNodes = this->GetGeometry().size(); + unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + + //getting data for the given geometry + double Area; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + + double NU = this->GetProperties()[POISSON_RATIO];// GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + //SHEAR CONTRIBUTION TO THE "DAMPING" MATRIX + for (unsigned int i=0; i Vel; + Vel[0] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_X); + Vel[1] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_Y); + Vel[2] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_X); + Vel[3] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_Y); + Vel[4] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_X); + Vel[5] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_Y); + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, Vel); + } + else{ + + //fill in the damping matrix + BoundedMatrix msB = ZeroMatrix(6,12); + BoundedMatrix ms_constitutive_matrix; + BoundedMatrix ms_temp; + + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + + unsigned int NumberOfNodes = this->GetGeometry().size(); + unsigned int dim = this->GetGeometry().WorkingSpaceDimension(); + + //getting data for the given geometry + double Area; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + + double NU = this->GetProperties()[POISSON_RATIO];// GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + /*KRATOS_WATCH(NU) + KRATOS_WATCH(E)*/ + + + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + //SHEAR CONTRIBUTION TO THE "DAMPING" MATRIX + for (unsigned int i=0; i Vel; + Vel[0] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_X); + Vel[1] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_Y); + Vel[2] = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY_Z); + + Vel[3] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_X); + Vel[4] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_Y); + Vel[5] = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY_Z); + + Vel[6] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_X); + Vel[7] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_Y); + Vel[8] = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY_Z); + + Vel[9] = this->GetGeometry()[3].FastGetSolutionStepValue(VELOCITY_X); + Vel[10] = this->GetGeometry()[3].FastGetSolutionStepValue(VELOCITY_Y); + Vel[11] = this->GetGeometry()[3].FastGetSolutionStepValue(VELOCITY_Z); + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, Vel);*/ + + } + + VectorType U = ZeroVector(LocalSize); + int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + array_1d< double, 3 > & rVel = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY); + for (unsigned int d = 0; d < TDim; ++d) // Velocity Dofs + { + U[LocalIndex] = rVel[d]; + ++LocalIndex; + } + /*U[LocalIndex] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE); // Pressure Dof + ++LocalIndex;*/ + } + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, U); + + + //KRATOS_WATCH(rDampingMatrix) + //KRATOS_WATCH(rRightHandSideVector) + KRATOS_CATCH("") +} + void FinalizeNonLinearIteration(const ProcessInfo& rCurrentProcessInfo) override + { + } + + /// Implementation of Calculate to compute an error estimate. + /** + * If rVariable == ERROR_RATIO, this function will provide an a posteriori + * estimate of the norm of the subscale velocity, calculated as TauOne*||MomentumResidual||. + * Note that the residual of the momentum equation is evaluated at the element center + * and that the result has units of velocity (L/T). + * The error estimate both saved as the elemental ERROR_RATIO variable and returned as rOutput. + * If rVARIABLE == NODAL_AREA, the element's contribution to nodal area is added to its nodes. + * @param rVariable Use ERROR_RATIO or NODAL_AREA + * @param rOutput Returns the error estimate for ERROR_RATIO, unused for NODAL_AREA + * @param rCurrentProcessInfo Process info instance (will be checked for OSS_SWITCH) + * @see MarkForRefinement for a use of the error ratio + */ + + void Calculate(const Variable& rVariable, + double& rOutput, + const ProcessInfo& rCurrentProcessInfo) + { + if (rVariable == NODAL_AREA) + { + // Get the element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Carefully write results to nodal variables, to avoid parallelism problems + for (unsigned int i = 0; i < TNumNodes; ++i) + { + + this->GetGeometry()[i].SetLock(); // So it is safe to write in the node in OpenMP + this->GetGeometry()[i].FastGetSolutionStepValue(NODAL_MASS) += Area * N[i]; + + this->GetGeometry()[i].UnSetLock(); // Free the node for other threads + } + } + } + + /// Implementation of Calculate to compute the local OSS projections. + /** + * If rVariable == ADVPROJ, This function computes the OSS projection + * terms using pressure and velocity values from the previous iteration. The + * projections are then added to the nodal variables ADVPROJ (Momentum residual) + * and DIVPROJ (Mass continuity residual). It is assumed that the scheme will + * divide the result by the assembled NODAL_AREA, which is equivalent to a + * nodal interpolation using a lumped mass matrix. + * @param rVariable Use ADVPROJ + * @param Output Will be overwritten with the elemental momentum error + * @param rCurrentProcessInfo Process info instance (unused) + */ +/* void Calculate(const Variable >& rVariable, + array_1d & rOutput, + const ProcessInfo& rCurrentProcessInfo) +{ + + + virtual void Calculate(const Variable& rVariable, + Vector& Output, + const ProcessInfo& rCurrentProcessInfo) + { + } + + virtual void Calculate(const Variable& rVariable, + Matrix& Output, + const ProcessInfo& rCurrentProcessInfo) + + */ + virtual void Calculate(const Variable& rVariable, Matrix& Output, const ProcessInfo& rCurrentProcessInfo) + { + + double pepe=0; + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + if(rVariable == CAUCHY_STRESS_TENSOR) + { + /*KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") */ + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + if(TDim==2) + { + BoundedMatrix CauchyStress=ZeroMatrix(2,2); + BoundedMatrix HistoricalCauchyStress=ZeroMatrix(2,2); + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + //noalias(rCauchyStress) = ZeroMatrix(2, 2); + + const array_1d& v0 = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); + const array_1d& v1 = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY); + const array_1d& v2 = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY); + + double Area; + BoundedMatrix msDN_Dx; + array_1d msN; //dimension = number of nodes + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, msN, Area); + + double NU = this->GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + + /*KRATOS_WATCH(NU) + KRATOS_WATCH(E)*/ + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + + + CauchyStress(0,0)=2.0* (msDN_Dx(0,0)*v0[0]+msDN_Dx(1,0)*v1[0]+msDN_Dx(2,0)*v2[0]); + CauchyStress(0,1)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]; + + CauchyStress(1,0)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]; + CauchyStress(1,1)=2.0*(msDN_Dx(0,1)*v0[1]+msDN_Dx(1,1)*v1[1]+msDN_Dx(2,1)*v2[1]); + + CauchyStress*=MU; + + //KRATOS_WATCH(CauchyStress) + //adding the volumetric part + double div_v = msDN_Dx(0,0)*v0[0] + msDN_Dx(0,1)*v0[1]; + div_v+= msDN_Dx(1,0)*v1[0] + msDN_Dx(1,1)*v1[1]; + div_v+= msDN_Dx(2,0)*v2[0] + msDN_Dx(2,1)*v2[1]; + + CauchyStress(0,0)+=KAPPA*div_v; + CauchyStress(1,1)+=KAPPA*div_v; + //KRATOS_WATCH(CauchyStress) + //HistoricalCauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + //KRATOS_WATCH(HistoricalCauchyStress) + //CauchyStress+=HistoricalCauchyStress; + //KRATOS_WATCH(CauchyStress) + + this->SetValue(CAUCHY_STRESS_TENSOR, CauchyStress); + //Output=CauchyStress; + } + else{ + + double Area; + array_1d N; + BoundedMatrix msDN_Dx; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), msDN_Dx, N, Area); + + BoundedMatrix CauchyStress=ZeroMatrix(3,3); + //BoundedMatrix HistoricalCauchyStress=ZeroMatrix(3,3); + /*KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") + KRATOS_WATCH("222222222222222222222222222222222") */ + //KRATOS_THROW_ERROR(std::logic_error,"not dereeeeeeeeeeeeeeeeeeeeeeecha",""); + //noalias(rCauchyStress) = ZeroMatrix(2, 2); + + const array_1d& v0 = this->GetGeometry()[0].FastGetSolutionStepValue(VELOCITY); + const array_1d& v1 = this->GetGeometry()[1].FastGetSolutionStepValue(VELOCITY); + const array_1d& v2 = this->GetGeometry()[2].FastGetSolutionStepValue(VELOCITY); + const array_1d& v3 = this->GetGeometry()[3].FastGetSolutionStepValue(VELOCITY); + + double NU = this->GetProperties()[POISSON_RATIO]; + double E = this->GetProperties()[YOUNG_MODULUS]; + //NU = 3.000000e-01; + //E = 3.00000e+05; + + double dt = rCurrentProcessInfo[DELTA_TIME]; + //Lame constants. note that for the hypoelastic solid the Lame constants must be multiplied by the timestep + //const + double MU=0.5*dt*E/(1.0+NU); + + //const + double LAMBDA=NU*E*dt/((1.0+NU)*(1.0-2.0*NU)); + //const + double KAPPA=LAMBDA+0.6666666*MU; + //KRATOS_WATCH(CauchyStress) + CauchyStress(0,0)=2.0* (msDN_Dx(0,0)*v0[0]+msDN_Dx(1,0)*v1[0]+msDN_Dx(2,0)*v2[0]+msDN_Dx(3,0)*v3[0]); + CauchyStress(0,1)=msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0]+msDN_Dx(3,1)*v3[0]+msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]+msDN_Dx(3,0)*v3[1]; + CauchyStress(0,2)=msDN_Dx(0,2)*v0[0]+msDN_Dx(1,2)*v1[0]+msDN_Dx(2,2)*v2[0]+msDN_Dx(3,2)*v3[0]+msDN_Dx(0,0)*v0[2]+msDN_Dx(1,0)*v1[2]+msDN_Dx(2,0)*v2[2]+msDN_Dx(3,0)*v3[2]; + + + CauchyStress(1,0)=CauchyStress(0,1);//msDN_Dx(0,1)*v0[0]+msDN_Dx(1,1)*v1[0]+msDN_Dx(2,1)*v2[0]+msDN_Dx(3,1)*v3[0] + msDN_Dx(0,0)*v0[1]+msDN_Dx(1,0)*v1[1]+msDN_Dx(2,0)*v2[1]+msDN_Dx(3,0)*v3[1]; + CauchyStress(1,1)=2.0*(msDN_Dx(0,1)*v0[1]+msDN_Dx(1,1)*v1[1]+msDN_Dx(2,1)*v2[1]+msDN_Dx(3,1)*v3[1]); + CauchyStress(1,2)=msDN_Dx(0,2)*v0[1]+msDN_Dx(1,2)*v1[1]+msDN_Dx(2,2)*v2[1] +msDN_Dx(3,2)*v3[1] + msDN_Dx(0,1)*v0[2]+msDN_Dx(1,1)*v1[2]+msDN_Dx(2,1)*v2[2]+msDN_Dx(3,1)*v3[2]; + + + CauchyStress(2,0)=CauchyStress(0,2);//msDN_Dx(0,2)*v0[0]+msDN_Dx(1,2)*v1[0]+msDN_Dx(2,2)*v2[0]+msDN_Dx(3,2)*v3[0] + msDN_Dx(0,0)*v0[2]+msDN_Dx(1,0)*v1[2]+msDN_Dx(2,0)*v2[2]+msDN_Dx(3,0)*v3[2]; + CauchyStress(2,1)=CauchyStress(1,2);//CauchyStress(1,2);//msDN_Dx(0,2)*v0[1]+msDN_Dx(1,2)*v1[1]+msDN_Dx(2,2)*v2[1] +msDN_Dx(3,2)*v3[1] + msDN_Dx(0,1)*v0[2]+msDN_Dx(1,1)*v1[2]+msDN_Dx(2,1)*v2[2]+msDN_Dx(2,1)*v3[2]; + CauchyStress(2,2)=2.0*(msDN_Dx(0,2)*v0[2]+msDN_Dx(1,2)*v1[2]+msDN_Dx(2,2)*v2[2]+msDN_Dx(3,2)*v3[2]); + + CauchyStress*=MU; + + //KRATOS_WATCH(CauchyStress) + + //KRATOS_WATCH(CauchyStress) + //adding the volumetric part + double div_v = msDN_Dx(0,0)*v0[0] + msDN_Dx(0,1)*v0[1] + msDN_Dx(0,2)*v0[2]; + div_v+= msDN_Dx(1,0)*v1[0] + msDN_Dx(1,1)*v1[1] + msDN_Dx(1,2)*v1[2]; + div_v+= msDN_Dx(2,0)*v2[0] + msDN_Dx(2,1)*v2[1] + msDN_Dx(2,2)*v2[2]; + div_v+= msDN_Dx(3,0)*v3[0] + msDN_Dx(3,1)*v3[1] + msDN_Dx(3,2)*v3[2]; + + CauchyStress(0,0)+=KAPPA*div_v; + CauchyStress(1,1)+=KAPPA*div_v; + CauchyStress(2,2)+=KAPPA*div_v; + //KRATOS_WATCH(CauchyStress) + //KRATOS_WATCH(HistoricalCauchyStress) + //HistoricalCauchyStress=this->GetValue(CAUCHY_STRESS_TENSOR); + //KRATOS_WATCH(HistoricalCauchyStress) + //CauchyStress+=HistoricalCauchyStress; + //KRATOS_WATCH(CauchyStress) + + this->SetValue(CAUCHY_STRESS_TENSOR, CauchyStress); + //KRATOS_WATCH(CauchyStress) + + } + + + + + + } + else + KRATOS_ERROR << "Wrong variable. Calculate function of hypoelastic element is meant to compute Cauchy stress only." << std::endl; + + +} + + // The following methods have different implementations depending on TDim + /// Provides the global indices for each one of this element's local rows + /** + * this determines the elemental equation ID vector for all elemental + * DOFs + * @param rResult A vector containing the global Id of each row + * @param rCurrentProcessInfo the current process info object (unused) + */ + void EquationIdVector(EquationIdVectorType& rResult, + const ProcessInfo& rCurrentProcessInfo) const override; + + /// Returns a list of the element's Dofs + /** + * @param ElementalDofList the list of DOFs + * @param rCurrentProcessInfo the current process info instance + */ + void GetDofList(DofsVectorType& rElementalDofList, + const ProcessInfo& rCurrentProcessInfo) const override; + + /// Returns VELOCITY_X, VELOCITY_Y, (VELOCITY_Z,) PRESSURE for each node + /** + * @param Values Vector of nodal unknowns + * @param Step Get result from 'Step' steps back, 0 is current step. (Must be smaller than buffer size) + */ + void GetFirstDerivativesVector(Vector& Values, int Step = 0) const override; + + /// Returns ACCELERATION_X, ACCELERATION_Y, (ACCELERATION_Z,) 0 for each node + /** + * @param Values Vector of nodal second derivatives + * @param Step Get result from 'Step' steps back, 0 is current step. (Must be smaller than buffer size) + */ + void GetSecondDerivativesVector(Vector& Values, int Step = 0) const override; + + /// Obtain an array_1d elemental variable, evaluated on gauss points. + /** + * If the variable is VORTICITY, computes the vorticity (rotational of the velocity) + * based on the current velocity values. Otherwise, it assumes that the input + * variable is an elemental value and retrieves it. Implemented for a + * single gauss point only. + * @param rVariable Kratos vector variable to get + * @param Output Will be filled with the values of the variable on integrartion points + * @param rCurrentProcessInfo Process info instance + */ + void CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rOutput, + const ProcessInfo& rCurrentProcessInfo) override; + + /// Obtain a double elemental variable, evaluated on gauss points. + /** + * If the variable is TAUONE or TAUTWO, calculates the corresponding stabilization + * parameter for the element, based on rCurrentProcessInfo's DELTA_TIME and + * DYNAMIC_TAU. If the variable is MU, calculates the effective viscosity at the + * element center due to Smagorinsky (in 'dynamic' units). Otherwise, it assumes + * that the input variable is an elemental value and retrieves it. + * Implemented for a single gauss point only. + * @param rVariable Kratos vector variable to compute + * @param Output Will be filled with the values of the variable on integrartion points + * @param rCurrentProcessInfo Process info instance + */ + void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + { + double pepe; + } + + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning + void CalculateOnIntegrationPoints( + const Variable >& rVariable, + std::vector >& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} + + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning + void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} + + /// Empty implementation of unused CalculateOnIntegrationPoints overloads to avoid compilation warning + void CalculateOnIntegrationPoints( + const Variable& rVariable, + std::vector& rValues, + const ProcessInfo& rCurrentProcessInfo) override + {} + + ///@} + ///@name Access + ///@{ + + ///@} + ///@name Elemental Data + ///@{ + + /// Checks the input and that all required Kratos variables have been registered. + /** + * This function provides the place to perform checks on the completeness of the input. + * It is designed to be called only once (or anyway, not often) typically at the beginning + * of the calculations, so to verify that nothing is missing from the input + * or that no common error is found. + * @param rCurrentProcessInfo The ProcessInfo of the ModelPart that contains this element. + * @return 0 if no errors were found. + */ + int Check(const ProcessInfo& rCurrentProcessInfo) const override + { + KRATOS_TRY + + // Perform basic element checks + int ErrorCode = Kratos::Element::Check(rCurrentProcessInfo); + if(ErrorCode != 0) return ErrorCode; + + // Checks on nodes + + // Check that the element's nodes contain all required SolutionStepData and Degrees of freedom + for(unsigned int i=0; iGetGeometry().size(); ++i) + { + const auto &rNode = this->GetGeometry()[i]; + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(VELOCITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(PRESSURE,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(MESH_VELOCITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(ACCELERATION,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(DENSITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(VISCOSITY,rNode); + KRATOS_CHECK_VARIABLE_IN_NODAL_DATA(BODY_FORCE,rNode); + // Not checking OSS related variables NODAL_AREA, ADVPROJ, DIVPROJ, which are only required as SolutionStepData if OSS_SWITCH == 1 + + KRATOS_CHECK_DOF_IN_NODE(VELOCITY_X,rNode); + KRATOS_CHECK_DOF_IN_NODE(VELOCITY_Y,rNode); + if (TDim == 3) KRATOS_CHECK_DOF_IN_NODE(VELOCITY_Z,rNode); + KRATOS_CHECK_DOF_IN_NODE(PRESSURE,rNode); + } + // Not checking OSS related variables NODAL_AREA, ADVPROJ, DIVPROJ, which are only required as SolutionStepData if OSS_SWITCH == 1 + + // If this is a 2D problem, check that nodes are in XY plane + if (this->GetGeometry().WorkingSpaceDimension() == 2) + { + for (unsigned int i=0; iGetGeometry().size(); ++i) + { + if (this->GetGeometry()[i].Z() != 0.0) + KRATOS_ERROR << "Node " << this->GetGeometry()[i].Id() << "has non-zero Z coordinate." << std::endl; + } + } + + return 0; + + KRATOS_CATCH(""); + } + + ///@} + ///@name Inquiry + ///@{ + + + ///@} + ///@name Input and output + ///@{ + + /// Turn back information as a string. + std::string Info() const override + { + std::stringstream buffer; + buffer << "HYPO #" << Id(); + return buffer.str(); + } + + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "HYPO" << TDim << "D"; + } + +// /// Print object's data. +// virtual void PrintData(std::ostream& rOStream) const; + + ///@} + ///@name Friends + ///@{ + + + ///@} + +protected: + ///@name Protected static Member Variables + ///@{ + + + ///@} + ///@name Protected member Variables + ///@{ + + + ///@} + ///@name Protected Operators + ///@{ + + + ///@} + ///@name Protected Operations + ///@{ + + /// Calculate Stabilization parameters. + /** + * Calculates both tau parameters based on a given advective velocity. + * Takes time step and dynamic coefficient from given ProcessInfo instance. + * ProcessInfo variables DELTA_TIME and DYNAMIC_TAU will be used. + * @param TauOne First stabilization parameter (momentum equation) + * @param TauTwo Second stabilization parameter (mass equation) + * @param rAdvVel advection velocity + * @param ElemSize Characteristic element length + * @param Density Density on integrartion point + * @param Viscosity Dynamic viscosity (mu) on integrartion point + * @param rCurrentProcessInfo Process info instance + */ + + + /// Calculate momentum stabilization parameter (without time term). + /** + * Calculates the momentum tau parameter based on a given advective velocity. + * The dynamic term is not taken into account. This function + * is intended for error estimation only. In other cases use CalculateTau + * @param TauOne First stabilization parameter (momentum equation) + * @param rAdvVel advection velocity + * @param ElemSize Characteristic element length + * @param Density Density on integrartion point + * @param Viscosity Dynamic viscosity (mu) on integrartion point + */ + + /// Add the momentum equation contribution to the RHS (body forces) + virtual void AddMomentumRHS(VectorType& F, + const double Density, + const array_1d& rShapeFunc, + const double Weight) + { + double Coef = Density * Weight; + + array_1d BodyForce = ZeroVector(3); + this->EvaluateInPoint(BodyForce, BODY_FORCE, rShapeFunc); + + // Add the results to the velocity components (Local Dofs are vx, vy, [vz,] p for each node) + int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + for (unsigned int d = 0; d < TDim; ++d) + { + F[LocalIndex++] += Coef * rShapeFunc[iNode] * BodyForce[d]; + } + ++LocalIndex; // Skip pressure Dof + } + } + + /// Add OSS projection terms to the RHS + + /// Add lumped mass matrix + /** + * Adds the lumped mass matrix to an elemental LHS matrix. Note that the time factor + * (typically 1/(k*Dt) ) is added by the scheme outside the element. + * @param rLHSMatrix The local matrix where the result will be added + * @param Mass The weight assigned to each node (typically Density * Area / NumNodes or Density*Volume / NumNodes) + */ + void CalculateLumpedMassMatrix(MatrixType& rLHSMatrix, + const double Mass) + { + unsigned int DofIndex = 0; + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + for (unsigned int d = 0; d < TDim; ++d) + { + rLHSMatrix(DofIndex, DofIndex) += Mass; + ++DofIndex; + } + // ++DofIndex; // Skip pressure Dof + } + } + + + + /// Add mass-like stabilization terms to LHS. + /** + * This function is only used in ASGS. For OSS, we avoid computing these + * terms, as they shoud cancel out with the dynamic part of the projection + * (which is not computed either) + * @param rLHSMatrix Left hand side of the velocity-pressure system + * @param Density Density on integration point + * @param rAdvVel Advective velocity on integration point + * @param TauOne Stabilization parameter for momentum equation + * @param rShapeFunc Shape funcitions evaluated on integration point + * @param rShapeDeriv Shape function derivatives evaluated on integration point + * @param Weight Area (or volume) times integration point weight + */ + + + /// Add a the contribution from a single integration point to the velocity contribution + + /// Assemble the contribution from an integration point to the element's residual. + /** Note that the dynamic term is not included in the momentum equation. + * If OSS_SWITCH = 1, we don't take into account the 'dynamic' stabilization + * terms, as it they belong to the finite element space. + */ + + + /// Assemble the contribution from an integration point to the element's residual. + /** + * ASGS version. Note that rElementalMomRes should be initialized before calling this. + * @param rAdvVel Convection velocity (not including subscale) + * @param Density Fluid density evaluated at integration point + * @param rElementalMomRes Result + * @param rShapeFunc Shape functions evaluated at integration point + * @param rShapeDeriv Shape function derivatives evaluated at integration point + * @param Weight Integration point weight (as a fraction of area or volume) + */ + + + /// Assemble the contribution from an integration point to the element's residual. + /** + * OSS version. Note that rElementalMomRes should be initialized before calling this. + * @param rAdvVel Convection velocity (not including subscale) + * @param Density Fluid density evaluated at integration point + * @param rElementalMomRes Result + * @param rShapeFunc Shape functions evaluated at integration point + * @param rShapeDeriv Shape function derivatives evaluated at integration point + * @param Weight Integration point weight (as a fraction of area or volume) + */ + + + + /** + * @brief EffectiveViscosity Calculate the viscosity at given integration point, using Smagorinsky if enabled. + * + * The Smagorinsky model is used only if the C_SMAGORINSKY is defined on the elemental data container. + * + * @note: This function is redefined when using Non-Newtonian constitutive models. It is important to keep its + * signature, otherwise non-Newtonian models will stop working. + * + * @param Density The fluid's density at the integration point. + * @param rN Nodal shape functions evaluated at the integration points (area coordinates for the point). + * @param rDN_DX Shape function derivatives at the integration point. + * @param ElemSize Representative length of the element (used only for Smagorinsky). + * @param rProcessInfo ProcessInfo instance passed from the ModelPart. + * @return Effective viscosity, in dynamic units (Pa*s or equivalent). + */ + + + + /** + * @brief EquivalentStrainRate Calculate the second invariant of the strain rate tensor GammaDot = (2SijSij)^0.5. + * + * @note Our implementation of non-Newtonian consitutive models such as Bingham relies on this funcition being + * defined on all fluid elements. + * + * @param rDN_DX Shape function derivatives at the integration point. + * @return GammaDot = (2SijSij)^0.5. + */ + double EquivalentStrainRate(const BoundedMatrix &rDN_DX) const; + + + /// Write the advective velocity evaluated at this point to an array + /** + * Writes the value of the advective velocity evaluated at a point inside + * the element to an array_1d + * @param rAdvVel Output array + * @param rShapeFunc Shape functions evaluated at the point of interest + */ + virtual void GetAdvectiveVel(array_1d< double, 3 > & rAdvVel, + const array_1d< double, TNumNodes >& rShapeFunc) + { + // Compute the weighted value of the advective velocity in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rAdvVel = rShapeFunc[0] * (rGeom[0].FastGetSolutionStepValue(VELOCITY) - rGeom[0].FastGetSolutionStepValue(MESH_VELOCITY)); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rAdvVel += rShapeFunc[iNode] * (rGeom[iNode].FastGetSolutionStepValue(VELOCITY) - rGeom[iNode].FastGetSolutionStepValue(MESH_VELOCITY)); + } + + /// Write the advective velocity evaluated at this point to an array + /** + * Writes the value of the advective velocity evaluated at a point inside + * the element to an array_1d + * @param rAdvVel Output array + * @param rShapeFunc Shape functions evaluated at the point of interest + * @param Step The time Step + */ + virtual void GetAdvectiveVel(array_1d< double, 3 > & rAdvVel, + const array_1d< double, TNumNodes >& rShapeFunc, + const std::size_t Step) + { + // Compute the weighted value of the advective velocity in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rAdvVel = rShapeFunc[0] * (rGeom[0].FastGetSolutionStepValue(VELOCITY, Step) - rGeom[0].FastGetSolutionStepValue(MESH_VELOCITY, Step)); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rAdvVel += rShapeFunc[iNode] * (rGeom[iNode].FastGetSolutionStepValue(VELOCITY, Step) - rGeom[iNode].FastGetSolutionStepValue(MESH_VELOCITY, Step)); + } + + /// Write the convective operator evaluated at this point (for each nodal funciton) to an array + /** + * Evaluate the convective operator for each node's shape function at an arbitrary point + * @param rResult Output vector + * @param rVelocity Velocity evaluated at the integration point + * @param rShapeDeriv Derivatives of shape functions evaluated at the integration point + * @see GetAdvectiveVel provides rVelocity + */ + void GetConvectionOperator(array_1d< double, TNumNodes >& rResult, + const array_1d< double, 3 > & rVelocity, + const BoundedMatrix& rShapeDeriv) + { + // Evaluate (and weight) the a * Grad(Ni) operator in the integration point, for each node i + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) // Loop over nodes + { + // Initialize result + rResult[iNode] = rVelocity[0] * rShapeDeriv(iNode, 0); + for (unsigned int d = 1; d < TDim; ++d) // loop over components + rResult[iNode] += rVelocity[d] * rShapeDeriv(iNode, d); + } + } + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + * @param Step The time Step (Defaults to 0 = Current) + */ + virtual void EvaluateInPoint(double& rResult, + const Variable< double >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) + { + // Compute the weighted value of the nodal variable in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rResult = rShapeFunc[0] * rGeom[0].FastGetSolutionStepValue(rVariable); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rResult += rShapeFunc[iNode] * rGeom[iNode].FastGetSolutionStepValue(rVariable); + } + + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + */ + virtual void EvaluateInPoint(array_1d< double, 3 > & rResult, + const Variable< array_1d< double, 3 > >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) + { + // Compute the weighted value of the nodal variable in the (Gauss) Point + GeometryType& rGeom = this->GetGeometry(); + rResult = rShapeFunc[0] * rGeom[0].FastGetSolutionStepValue(rVariable); + for (unsigned int iNode = 1; iNode < TNumNodes; ++iNode) + rResult += rShapeFunc[iNode] * rGeom[iNode].FastGetSolutionStepValue(rVariable); + } + + /// Return an estimate for the element size h, used to calculate the stabilization parameters + /** + * Estimate the element size from its area or volume, required to calculate stabilization parameters. + * Note that its implementation is different for 2D or 3D elements. + * @see VMS2D, VMS3D for actual implementation + * @param Volume (in 3D) or Area (in 2D) of the element + * @return Element size h + */ + double ElementSize(const double); + + + /// Adds the contribution of the viscous term to the momentum equation. + /** + * The viscous term is written in stress-divergence (Cauchy) form. + * @param rDampingMatrix Elemental Damping matrix + * @param rShapeDeriv Elemental shape function derivatives + * @param Weight Effective viscosity, in dynamic units, weighted by the integration point area + */ + //virtual void AddViscousTerm(MatrixType& rDampingMatrix, + // const BoundedMatrix& rShapeDeriv, + // const double Weight); + + /// Adds the contribution of the viscous term to the momentum equation (alternate). + /** + * This function is an alternate implementation of VMS::AddViscousTerm. + * This version works with ublas matrices, using the relationship between stress and + * rate of strain given by VMS::CalculateC. It is currently unused (as VMS::AddViscousTerm + * is a more efficient implementation of the Cauchy equation) but it is left here so derived + * classes can use it to implement other constitutive equations. + * @param rDampingMatrix Elemental Damping matrix + * @param rShapeDeriv Elemental shape function derivatives + * @param Weight Effective viscosity, in dynamic units, weighted by the integration point area + */ + + + /// Calculate the strain rate matrix + /** + * Unused, left to support derived classes. @see VMS::AddBTransCB + * @param rB Strain rate matrix + * @param rShapeDeriv Nodal shape funcion derivatives + */ + //void CalculateB( BoundedMatrix& rB, const BoundedMatrix& rShapeDeriv); + + /// Calculate a matrix that provides the stress given the strain rate + /** + * Unused, left to support derived classes. @see VMS::AddBTransCB. + * Note that only non-zero terms are written, so the output matrix should be + * initialized before calling this. + * @param rC Matrix representation of the stress tensor (output) + * @param Viscosity Effective viscosity, in dynamic units, weighted by the integration point area + */ + //virtual void CalculateC( BoundedMatrix& rC, const double Viscosity); + + double ConsistentMassCoef(const double Area); + + + /*double SubscaleErrorEstimate(const ProcessInfo& rProcessInfo) + { + // Get the element's geometric parameters + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + double ElemSize = this->ElementSize(Area); + double Viscosity = this->EffectiveViscosity(Density,N,DN_DX,ElemSize,rProcessInfo); + + // Get Advective velocity + array_1d AdvVel; + this->GetAdvectiveVel(AdvVel, N); + + // Output container + array_1d< double, 3 > ElementalMomRes = ZeroVector(3); + + // Calculate stabilization parameter. Note that to estimate the subscale velocity, the dynamic coefficient in TauOne is assumed zero. + double TauOne; + this->CalculateStaticTau(TauOne,AdvVel,ElemSize,Density,Viscosity); + + if ( rProcessInfo[OSS_SWITCH] != 1 ) // ASGS + { + this->ASGSMomResidual(AdvVel,Density,ElementalMomRes,N,DN_DX,1.0); + ElementalMomRes *= TauOne; + } + else // OSS + { + this->OSSMomResidual(AdvVel,Density,ElementalMomRes,N,DN_DX,1.0);; + ElementalMomRes *= TauOne; + } + + // Error estimation ( ||U'|| / ||Uh_gauss|| ), taking ||U'|| = TauOne ||MomRes|| + double ErrorRatio(0.0);//, UNorm(0.0); + //array_1d< double, 3 > UGauss = ZeroVector(3); + //this->EvaluateInPoint(UGauss,VELOCITY,N); + + for (unsigned int i = 0; i < TDim; ++i) + { + ErrorRatio += ElementalMomRes[i] * ElementalMomRes[i]; + //UNorm += UGauss[i] * UGauss[i]; + } + ErrorRatio = sqrt(ErrorRatio*Area);// / UNorm); + //ErrorRatio /= Density; + //this->SetValue(ERROR_RATIO, ErrorRatio); + return ErrorRatio; + }*/ + + ///@} + ///@name Protected Access + ///@{ + + + ///@} + ///@name Protected Inquiry + ///@{ + + + ///@} + ///@name Protected LifeCycle + ///@{ + + + ///@} + +private: + ///@name Static Member Variables + ///@{ + + + ///@} + ///@name Member Variables + ///@{ + + ///@} + ///@name Serialization + ///@{ + + friend class Serializer; + + void save(Serializer& rSerializer) const override + { + KRATOS_SERIALIZE_SAVE_BASE_CLASS(rSerializer, Element ); + } + + void load(Serializer& rSerializer) override + { + KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Element); + } + + ///@} + ///@name Private Operators + ///@{ + + + ///@} + ///@name Private Operations + ///@{ + + + ///@} + ///@name Private Access + ///@{ + + + ///@} + ///@name Private Inquiry + ///@{ + + + ///@} + ///@name Un accessible methods + ///@{ + + /// Assignment operator. + HYPO & operator=(HYPO const& rOther); + + /// Copy constructor. + HYPO(HYPO const& rOther); + + ///@} + +}; // Class HYPO + +///@} + +///@name Type Definitions +///@{ + + +///@} +///@name Input and output +///@{ + + +/// input stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::istream& operator >>(std::istream& rIStream, + HYPO& rThis) +{ + return rIStream; +} + +/// output stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::ostream& operator <<(std::ostream& rOStream, + const HYPO& rThis) +{ + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + + return rOStream; +} +///@} + +///@} // Fluid Dynamics Application group + +} // namespace Kratos. + +#endif // KRATOS_VMS_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_elements/lagrangian_vms.h b/applications/PfemMeltingApplication/custom_elements/lagrangian_vms.h new file mode 100644 index 000000000000..1f2d7f7e61ae --- /dev/null +++ b/applications/PfemMeltingApplication/custom_elements/lagrangian_vms.h @@ -0,0 +1,1262 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + +#if !defined(KRATOS_LAGRANGIAN_FLUID_VMS_H_INCLUDED ) +#define KRATOS_LAGRANGIAN_FLUID_VMS_H_INCLUDED +// System includes +#include +#include +// External includes +// Project includes +#include "containers/array_1d.h" +#include "includes/define.h" +//#include "custom_elements/vms.h" +#include "includes/serializer.h" +#include "utilities/geometry_utilities.h" +#include "utilities/math_utils.h" +#include "utilities/split_tetrahedra.h" +// #include "utilities/enrichment_utilities.h" +#include "utilities/enrichment_utilities_duplicate_dofs.h" +// Application includes +//#include "fluid_dynamics_application_variables.h" +//#include "vms.h" + +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application.h" +#include "../applications/FluidDynamicsApplication/custom_elements/vms.h" +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application_variables.h" + + + +namespace Kratos +{ + +/**The "LagrangianFluidVMS" element is an element based on the Variation Multiscale Stabilization technique (VMS) + * which is designed for the solution of a two fluid problem. + * + * A distinctive feature of the element is the use of 4 LOCAL enrichment functions, which allows to model + * a discontinuity in both the pressure field and in its gradient. + * The enrichment functions are obtained by duplicating all of the degrees of freedom of the element. + * Since the enrichment is performed elementwise, a purely local static condensation + * step is performed. + * + * Since a jump in the pressure can be considered, the element shall be able to habdle moderate changes of the viscosity + * between the two fluids to be considered + * + * WARNING: From the implementation point of view, the element hard codes a BDF2 scheme within the element + * this is different from the VMS base element which supports the use of an arbitrary time integrator. + * In the practice this implies that the element can ONLY be used in conjunction with the scheme implemented + * in "residualbased_predictorcorrector_velocity_bdf_scheme_turbulent.h" + * + * a buffer size of dimension 3 is needed since the current step and two steps in the past need to be stored. + * + * TODO: so far only ASGS stabilization is implemented. OSS stabilization is possible but has not yet been implemented + * + * + * + */ +///@addtogroup FluidDynamicsApplication +///@{ +///@name Kratos Globals +///@{ +///@} +///@name Type Definitions +///@{ +///@} +///@name Enum's +///@{ +///@} +///@name Functions +///@{ +///@} +///@name Kratos Classes +///@{ +template< unsigned int TDim, + unsigned int TNumNodes = TDim + 1 > +class LagrangianFluidVMS : public VMS +{ +public: + ///@name Type Definitions + ///@{ + /// Pointer definition of TwoFluidVMS + KRATOS_CLASS_INTRUSIVE_POINTER_DEFINITION(LagrangianFluidVMS); + ///base type: an IndexedObject that automatically has a unique number + typedef IndexedObject BaseType; + ///Element from which it is derived + typedef VMS ElementBaseType; + ///definition of node type (default is: Node<3>) + typedef Node < 3 > NodeType; + /** + * Properties are used to store any parameters + * related to the constitutive law + */ + typedef Properties PropertiesType; + ///definition of the geometry type with given NodeType + typedef Geometry GeometryType; + ///definition of nodes container type, redefined from GeometryType + typedef Geometry::PointsArrayType NodesArrayType; + typedef Vector VectorType; + typedef typename ElementBaseType::MatrixType MatrixType; + typedef std::size_t IndexType; + typedef std::size_t SizeType; + typedef std::vector EquationIdVectorType; + typedef std::vector< Dof::Pointer > DofsVectorType; + typedef PointerVectorSet, IndexedObject> DofsArrayType; + ///@} + ///@name Life Cycle + ///@{ + //Constructors. + /// Default constuctor. + /** + * @param NewId Index number of the new element (optional) + */ + LagrangianFluidVMS(IndexType NewId = 0) : + ElementBaseType(NewId) + { + } + ///Constructor using an array of nodes. + /** + * @param NewId Index of the new element + * @param ThisNodes An array containing the nodes of the new element + */ + LagrangianFluidVMS(IndexType NewId, const NodesArrayType& ThisNodes) : + ElementBaseType(NewId, ThisNodes) + { + } + /// Constructor using a geometry object. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + */ + LagrangianFluidVMS(IndexType NewId, GeometryType::Pointer pGeometry) : + ElementBaseType(NewId, pGeometry) + { + } + /// Constuctor using geometry and properties. + /** + * @param NewId Index of the new element + * @param pGeometry Pointer to a geometry object + * @param pProperties Pointer to the element's properties + */ + LagrangianFluidVMS(IndexType NewId, GeometryType::Pointer pGeometry, PropertiesType::Pointer pProperties) : + ElementBaseType(NewId, pGeometry, pProperties) + { + } + /// Destructor. + ~LagrangianFluidVMS() override + { + } + ///@} + ///@name Operators + ///@{ + ///@} + ///@name Operations + ///@{ + /// Create a new element of this type + /** + * Returns a pointer to a new TwoFluidVMS element, created using given input + * @param NewId the ID of the new element + * @param ThisNodes the nodes of the new element + * @param pProperties the properties assigned to the new element + * @return a Pointer to the new element + */ + Element::Pointer Create(IndexType NewId, NodesArrayType const& ThisNodes, + PropertiesType::Pointer pProperties) const override + { + + // int pepe=0; + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! FIRST TIME < FIRST !!!!!!!!", pepe); + return Kratos::make_intrusive< LagrangianFluidVMS >(NewId, (this->GetGeometry()).Create(ThisNodes), pProperties); + } + Element::Pointer Create(IndexType NewId, + GeometryType::Pointer pGeom, + PropertiesType::Pointer pProperties) const override + { + //int pepe=0; + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! FIRST TIME < FIRST !!!!!!!!", pepe); + return Kratos::make_intrusive< LagrangianFluidVMS >(NewId, pGeom, pProperties); + } + + + /*virtual double EffectiveViscosity(double Density, + const array_1d< double, TNumNodes > &rN, + const BoundedMatrix &rDN_DX, + double ElemSize, + const ProcessInfo &rProcessInfo) + { + const double Csmag = (static_cast< const VMS * >(this) )->GetValue(C_SMAGORINSKY); + double Viscosity = 0.0; + + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! SECOND TIME < FIRST !!!!!!!!", Viscosity); + this->EvaluateInPoint(Viscosity,VISCOSITY,rN); + + if (Csmag > 0.0) + { + double StrainRate = this->EquivalentStrainRate(rDN_DX); // (2SijSij)^0.5 + double LengthScale = Csmag*ElemSize; + LengthScale *= LengthScale; // square + Viscosity += 2.0*LengthScale*StrainRate; + } + + return Density*Viscosity; + }*/ + + +//IF WE WANT USE A DIFFERENT MODEL THAT THE NEWTONIAN ONE THIS FUNCTION MUST BE DISCONECTED +/*virtual double EffectiveViscosity(double Density,const array_1d< double, TNumNodes > &rN,const BoundedMatrix &rDN_DX,double ElemSize,const ProcessInfo &rProcessInfo) + + { + // Read the viscosity for the fluidified phase from the nodes + // In Kratos, the viscosity is assumed to be given in kinematic units (m^2/s) + double DynamicViscosity; + this->EvaluateInPoint(DynamicViscosity,VISCOSITY,rN); + DynamicViscosity *= Density; + + double GammaDot = this->EquivalentStrainRate(rDN_DX); + //KRATOS_WATCH(GammaDot) + double YieldStress = rProcessInfo[YIELD_STRESS]; + YieldStress=1.0; + double m = rProcessInfo[REGULARIZATION_COEFFICIENT]; + m=1000.0; + //KRATOS_THROW_ERROR(std::logic_error, "!!!!!!!!!!! viscosityyyyyyyyyy < FIRST !!!!!!!!", m); + + + + if (GammaDot > 1e-12) // Normal behaviour + { + double Regularization = 1.0 - std::exp(-m*GammaDot); + DynamicViscosity += Regularization * YieldStress / GammaDot; + } + else // fallback to avoid division by zero + { + // In this case dynamic viscosity goes to infinity, + // understand the following as a large number times yield stress + DynamicViscosity += m*YieldStress; + } + + return DynamicViscosity; + } + +*/ + /// Provides local contributions from body forces to the RHS + /** + * This is called during the assembly process and provides the RHS terms of the + * system that are either constant or computed explicitly (from the 'old' + * iteration variables). In this case this means the body force terms + * @param rRightHandSideVector Will be filled with the elemental right hand side + * @param rCurrentProcessInfo ProcessInfo instance from the ModelPart. It is + * expected to contain values for DYNAMIC_TAU and DELTA_TIME + */ + /*void CalculateRightHandSide(VectorType& rRightHandSideVector, + ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int local_size = (TDim+1)*(TDim+1); + Matrix tmp(local_size,local_size); + CalculateLocalSystem(tmp,rRightHandSideVector,rCurrentProcessInfo); + }*/ + + /// Computes local contributions to the mass matrix + /** + * Provides the local contributions to the mass matrix, which is defined here + * as the matrix associated to velocity derivatives. Note that the mass + * matrix implemented here is lumped. + * @param rMassMatrix Will be filled with the elemental mass matrix + * @param rCurrentProcessInfo the current process info instance + */ + /*void CalculateMassMatrix(MatrixType& rMassMatrix, ProcessInfo& rCurrentProcessInfo) override + { + KRATOS_THROW_ERROR(std::logic_error,"MassMatrix function shall not be called when using this type of element",""); + }*/ + + + /// Calculate the element's local contribution to the system for the current step. + /// this function is essentially identical to the one of the father element, to which it only + /// adds a term in the momentum equation to allow imposing weakly the tangential component of the velocity + /// on the cut elements +/* void CalculateLocalSystem(MatrixType& rLeftHandSideMatrix, + VectorType& rRightHandSideVector, + ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = (TDim + 1) * TNumNodes; + + const ProcessInfo& rConstProcessInfo = rCurrentProcessInfo; // Taking const reference for thread safety + + // **************************************************** + // Resize and set to zero the RHS + if(rRightHandSideVector.size() != LocalSize) + rRightHandSideVector.resize(LocalSize,false); + noalias(rRightHandSideVector) = ZeroVector(LocalSize); + + // Resize and set to zero the LHS + if (rLeftHandSideMatrix.size1() != LocalSize) + rLeftHandSideMatrix.resize(LocalSize, LocalSize, false); + noalias(rLeftHandSideMatrix) = ZeroMatrix(LocalSize, LocalSize); + + Matrix MassMatrix = ZeroMatrix(LocalSize, LocalSize); + + // **************************************************** + //Get Vector of BDF coefficients + const Vector& BDFVector = rConstProcessInfo[BDF_COEFFICIENTS]; + + // **************************************************** + // Get this element's geometric properties + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + + //input data for enrichment function + Vector distances(TNumNodes); + Matrix coords(TNumNodes, TDim); + + //output data for enrichment function + Matrix Nenriched; + Vector volumes; + Matrix Ngauss; + Vector signs(6); + std::vector< Matrix > gauss_gradients; + + + //fill coordinates + for (unsigned int i = 0; i < TNumNodes; i++) + { + const array_1d & xyz = this->GetGeometry()[i].Coordinates(); +// volumes[i] = 0.0; + distances[i] = this->GetGeometry()[i].FastGetSolutionStepValue(DISTANCE); + for (unsigned int j = 0; j < TDim; j++) + coords(i, j) = xyz[j]; + } + +// unsigned int ndivisions = EnrichmentUtilities::CalculateTetrahedraEnrichedShapeFuncions(coords, DN_DX, distances, volumes, Ngauss, signs, gauss_gradients, Nenriched); + unsigned int ndivisions = EnrichmentUtilitiesDuplicateDofs::CalculateTetrahedraEnrichedShapeFuncions(coords, DN_DX, distances, volumes, Ngauss, signs, gauss_gradients, Nenriched); + const unsigned int nenrichments = Nenriched.size2(); + + Matrix enrichment_terms_vertical = ZeroMatrix(LocalSize,nenrichments); + Matrix enrichment_terms_horizontal = ZeroMatrix(nenrichments,LocalSize); + + Matrix enrichment_diagonal = ScalarMatrix(nenrichments,nenrichments,0.0); + Vector enriched_rhs(nenrichments,0.0); + array_1d bf = ZeroVector(3); + + double positive_volume = 0.0; + double negative_volume = 0.0; + + if(ndivisions == 1) //compute gauss points for exact integration of a tetra element + { + const GeometryType::IntegrationPointsArrayType& IntegrationPoints = this->GetGeometry().IntegrationPoints(GeometryData::GI_GAUSS_2); + + Ngauss = this->GetGeometry().ShapeFunctionsValues(GeometryData::GI_GAUSS_2); + + volumes.resize(IntegrationPoints.size(),false); + + for (unsigned int g = 0; g < this->GetGeometry().IntegrationPointsNumber(GeometryData::GI_GAUSS_2); g++) + { + volumes[g] = 6.0*Area * IntegrationPoints[g].Weight(); + signs[g] = signs[0]; + } + + } +// else +// { +// Matrix aux = Ngauss; +// Ngauss.resize(ndivisions,Ngauss.size2(),false); +// for(unsigned int i=0; i 0) //check positive and negative volume + positive_volume += wGauss; + else + negative_volume += wGauss; + } + + + const double min_area_ratio = 1e-6; +// if(positive_volume/Area < min_area_ratio) +// { +// for (unsigned int igauss = 0; igauss < Ngauss.size1(); igauss++) +// { +// if(signs[igauss] > 0) //check positive and negative volume +// volumes[igauss] =0.0; +// } +// } +// +// if(negative_volume/Area < min_area_ratio) +// { +// for (unsigned int igauss = 0; igauss < Ngauss.size1(); igauss++) +// { +// if(signs[igauss] < 0) //check positive and negative volume +// volumes[igauss] =0.0; +// } +// } + + // Porous media losses + const Properties& r_properties = this->GetProperties(); + const double c1 = r_properties[LIN_DARCY_COEF]; + const double c2 = r_properties[NONLIN_DARCY_COEF]; + + + // **************************************************** + //compute LHS and RHS + first part of mass computation + for (unsigned int igauss = 0; igauss < Ngauss.size1(); igauss++) + { + //assigning the gauss data + for (unsigned int k = 0; k < TNumNodes; k++) + N[k] = Ngauss(igauss, k); + double wGauss = volumes[igauss]; + + +// if(signs[igauss] > 0) //check positive and negative volume +// positive_volume += wGauss; +// else +// negative_volume += wGauss; + + // **************************************************** + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + double ElemSize = this->ElementSize(Area); + double Viscosity = this->EffectiveViscosity(Density,N,DN_DX,ElemSize,rCurrentProcessInfo); + + //compute RHS contributions + this->AddMomentumRHS(rRightHandSideVector, Density, N, wGauss); + + // Get Advective velocity + array_1d AdvVel; + this->GetAdvectiveVel(AdvVel, N); + const double VelNorm = MathUtils::Norm3(AdvVel); + + const double DarcyTerm = this->CalculateDarcyTerm(Density, Viscosity, c1, c2, N); + // Calculate stabilization parameters + double TauOne, TauTwo; + + //compute stabilization parameters + this->CalculateStabilizationTau(TauOne, TauTwo, VelNorm, ElemSize, Density, Viscosity, DarcyTerm, rCurrentProcessInfo); + + this->AddIntegrationPointVelocityContribution(rLeftHandSideMatrix, rRightHandSideVector, Density, Viscosity, AdvVel, DarcyTerm, TauOne, TauTwo, N, DN_DX, wGauss); + + //compute mass matrix - terms related to real mass + this->AddConsistentMassMatrixContribution(MassMatrix, N, Density, wGauss); + + + // **************************************************** + //enrichment variables + if (ndivisions > 1) + { +// KRATOS_WATCH(Nenriched); + this->EvaluateInPoint(bf, BODY_FORCE, N); + + //note that here we compute only a part of the acceleration term + //this is done like this since the velocity*BDFVector[0] is treated implicitly + array_1d OldAcceleration = ZeroVector(3); + for(unsigned int step=1; stepGetGeometry()).size(); jjj++) + OldAcceleration += N[jjj] * BDFVector[step] * (this->GetGeometry())[jjj].FastGetSolutionStepValue(VELOCITY,step); + } + + for(unsigned int enriched_id = 0; enriched_id < nenrichments; enriched_id++) + { + const Matrix& enriched_grad = gauss_gradients[igauss]; +// KRATOS_WATCH(enriched_grad); + + + //compute enrichment terms contribution + for (unsigned int inode = 0; inode < TNumNodes; inode++) + { + int base_index = (TDim + 1) * inode; + array_1d AGradN = ZeroVector(TNumNodes); + this->GetConvectionOperator(AGradN,AdvVel,DN_DX); + //momentum term + for (unsigned int k = 0; k < TDim; k++) + { + double convection_stab = wGauss * TauOne * enriched_grad(enriched_id,k)* Density * AGradN[inode]; + double darcy_stab = wGauss * TauOne * enriched_grad(enriched_id,k) * DarcyTerm * N[inode]; + + // enrichment_terms_vertical[base_index + k] += velocity_stab + wGauss*N[inode]*enriched_grad(0, k); + enrichment_terms_vertical(base_index + k,enriched_id) += convection_stab - darcy_stab - wGauss * DN_DX(inode, k) * Nenriched(igauss, enriched_id); + enrichment_terms_horizontal(enriched_id,base_index + k) += convection_stab + darcy_stab + wGauss * DN_DX(inode, k) * Nenriched(igauss, enriched_id); + // enrichment_terms_vertical[base_index + k] +=wGauss*N[inode]*enriched_grad(0, k); //-= wGauss * DN_DX(inode, k) * Nenriched(igauss, 0); + // enrichment_terms_horizontal[base_index + k] -=Density*wGauss*N[inode]*enriched_grad(0, k); // += Density*wGauss * DN_DX(inode, k) * Nenriched(igauss, 0); + } + //pressure term + for (unsigned int k = 0; k < TDim; k++) + { + double temp = wGauss * TauOne* DN_DX(inode, k) * enriched_grad(enriched_id, k); + enrichment_terms_vertical(base_index + TDim,enriched_id) += temp; + enrichment_terms_horizontal(enriched_id,base_index + TDim) += temp; + } + //add acceleration enrichment term + for (unsigned int k = 0; k < TDim; k++) + { + double coeff = wGauss * TauOne *Density * enriched_grad(enriched_id,k)*N[inode] * BDFVector[0]; + enrichment_terms_horizontal(enriched_id,base_index + k) += coeff; + //i believe this shall not be here!! enriched_rhs += coeff * (old_vnode[k]); + // enrichment_terms_vertical[base_index + k] +=wGauss*N[inode]*gauss_gradients[igauss](0, k); //-= wGauss * DN_DX(inode, k) * Nenriched(igauss, 0); + // enrichment_terms_horizontal[base_index + k] -=Density*wGauss*N[inode]*gauss_gradients[igauss](0, k); // += Density*wGauss * DN_DX(inode, k) * Nenriched(igauss, 0); + } + } + //compute diagonal enrichment terms + + for (unsigned int k = 0; k < TDim; k++) + { + for(unsigned int lll=0; lll 1) +// { +// KRATOS_WATCH(this->Id()); +// KRATOS_WATCH(ndivisions); +// KRATOS_WATCH( (positive_volume+negative_volume )/Area); +// } +// KRATOS_WATCH("line 438"); + //lump mass matrix + this->LumpMassMatrix(MassMatrix); + + //add mass matrix stabilization contributions + for (unsigned int igauss = 0; igauss < Ngauss.size1(); igauss++) + { + //assigning the gauss data + for (unsigned int k = 0; k < TNumNodes; k++) + N[k] = Ngauss(igauss, k); + double wGauss = volumes[igauss]; + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + double ElemSize = this->ElementSize(Area); + double Viscosity = this->EffectiveViscosity(Density,N,DN_DX,ElemSize,rCurrentProcessInfo); + + // Get Advective velocity + array_1d AdvVel; + this->GetAdvectiveVel(AdvVel, N); + const double VelNorm = MathUtils::Norm3(AdvVel); + + const double DarcyTerm = this->CalculateDarcyTerm(Density, Viscosity, c1, c2, N); + + double TauOne,TauTwo; + this->CalculateStabilizationTau(TauOne, TauTwo, VelNorm, ElemSize, Density, Viscosity, DarcyTerm, rCurrentProcessInfo); + + // Add dynamic stabilization terms ( all terms involving a delta(u) ) + this->AddMassStabTerms(MassMatrix, Density, AdvVel, DarcyTerm, TauOne, N, DN_DX, wGauss); + + } + + // **************************************************** + //consider contributions of mass to LHS and RHS + //add Mass Matrix to the LHS with the correct coefficient + noalias(rLeftHandSideMatrix) += BDFVector[0]*MassMatrix; + + //do RHS -= MassMatrix*(BDFVector[1]*un + BDFVector[2]*u_(n-1)) + //note that the term related to BDFVector[0] is included in the LHS + array_1d aaa = ZeroVector(LocalSize); + for(unsigned int k = 0; k& u = this->GetGeometry()[k].FastGetSolutionStepValue(VELOCITY,step); + const double& bdf_coeff = BDFVector[step]; + aaa[base] += bdf_coeff*u[0]; + aaa[base+1] += bdf_coeff*u[1]; + aaa[base+2] += bdf_coeff*u[2]; + } + } + noalias(rRightHandSideVector) -= prod(MassMatrix,aaa); + + // **************************************************** + //finalize computation of the residual + // Now calculate an additional contribution to the residual: r -= rLeftHandSideMatrix * (u,p) + VectorType U = ZeroVector(LocalSize); + int LocalIndex = 0; + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + array_1d< double, 3 > & rVel = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY); + for (unsigned int d = 0; d < TDim; ++d) // Velocity Dofs + { + U[LocalIndex] = rVel[d]; + ++LocalIndex; + } + U[LocalIndex] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE); // Pressure Dof + ++LocalIndex; + } + noalias(rRightHandSideVector) -= prod(rLeftHandSideMatrix, U); +// KRATOS_WATCH("line 517"); + + // **************************************************** + //finalize computation of enrichment terms + //(do static condensation) of enrichment terms + //note that it each step we assume that the enrichment starts from 0 + if (ndivisions > 1) + { + //We only apply enrichment if we do not have an almost empty/full element + if (positive_volume / Area > min_area_ratio && negative_volume / Area > min_area_ratio) { + //finalize the computation of the rhs + noalias(enriched_rhs) -= prod(enrichment_terms_horizontal,U); + + double max_diag = 0.0; + for(unsigned int k=0; k max_diag) max_diag = fabs(enrichment_diagonal(k,k) ); + if(max_diag == 0) max_diag = 1.0; + + for (unsigned int i = 0; i < TDim; i++) + { + const double di = fabs(distances[i]); + + for (unsigned int j = i + 1; j < TDim + 1; j++) + { + const double dj = fabs(distances[j]); + + if (distances[i] * distances[j] < 0.0) //cut edge + { + double sum_d = di + dj; + double Ni = dj / sum_d; + double Nj = di / sum_d; + + double penalty_coeff = max_diag * 0.001; // h/BDFVector[0]; + enrichment_diagonal(i, i) += penalty_coeff * Ni*Ni; + enrichment_diagonal(i, j) -= penalty_coeff * Ni*Nj; + enrichment_diagonal(j, i) -= penalty_coeff * Nj*Ni; + enrichment_diagonal(j, j) += penalty_coeff * Nj*Nj; + + } + } + } + + Matrix inverse_diag(nenrichments, nenrichments); + double det; + MathUtils::InvertMatrix(enrichment_diagonal, inverse_diag, det); + + Matrix tmp = prod(inverse_diag, enrichment_terms_horizontal); + noalias(rLeftHandSideMatrix) -= prod(enrichment_terms_vertical, tmp); + + Vector tmp2 = prod(inverse_diag, enriched_rhs); + noalias(rRightHandSideVector) -= prod(enrichment_terms_vertical, tmp2); + } + + } + +// KRATOS_WATCH("finished elem") + }*/ + + /** does nothing for this element + * @param rVariable + * @param Output + * @param rCurrentProcessInfo + */ +/* void Calculate(const Variable >& rVariable, + array_1d & rOutput, + const ProcessInfo& rCurrentProcessInfo) override + { + + }*/ + /// Checks the input and that all required Kratos variables have been registered. + /** + * This function provides the place to perform checks on the completeness of the input. + * It is designed to be called only once (or anyway, not often) typically at the beginning + * of the calculations, so to verify that nothing is missing from the input + * or that no common error is found. + * @param rCurrentProcessInfo The ProcessInfo of the ModelPart that contains this element. + * @return 0 if no errors were found. + */ +/* int Check(const ProcessInfo& rCurrentProcessInfo) override + { + KRATOS_TRY + // Perform basic element checks + int ErrorCode = Kratos::Element::Check(rCurrentProcessInfo); + if (ErrorCode != 0) return ErrorCode; + // Check that all required variables have been registered + if (DISTANCE.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "DISTANCE Key is 0. Check if the application was correctly registered.", ""); + if (VELOCITY.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "VELOCITY Key is 0. Check if the application was correctly registered.", ""); + if (MESH_VELOCITY.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "MESH_VELOCITY Key is 0. Check if the application was correctly registered.", ""); + if (PRESSURE.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "PRESSURE Key is 0. Check if the application was correctly registered.", ""); + if (DENSITY.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "DENSITY Key is 0. Check if the application was correctly registered.", ""); + if (VISCOSITY.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "VISCOSITY Key is 0. Check if the application was correctly registered.", ""); + if (DYNAMIC_TAU.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "DYNAMIC_TAU Key is 0. Check if the application was correctly registered.", ""); + if (DELTA_TIME.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "DELTA_TIME Key is 0. Check if the application was correctly registered.", ""); +// if (ADVPROJ.Key() == 0) +// KRATOS_THROW_ERROR(std::invalid_argument, "ADVPROJ Key is 0. Check if the application was correctly registered.", ""); +// if (DIVPROJ.Key() == 0) +// KRATOS_THROW_ERROR(std::invalid_argument, "DIVPROJ Key is 0. Check if the application was correctly registered.", ""); + if (NODAL_AREA.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "NODAL_AREA Key is 0. Check if the application was correctly registered.", ""); + if (C_SMAGORINSKY.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "C_SMAGORINSKY Key is 0. Check if the application was correctly registered.", ""); + if (ERROR_RATIO.Key() == 0) + KRATOS_THROW_ERROR(std::invalid_argument, "ERROR_RATIO Key is 0. Check if the application was correctly registered.", ""); + // Additional variables, only required to print results: + // SUBSCALE_VELOCITY, SUBSCALE_PRESSURE, TAUONE, TAUTWO, MU, VORTICITY. + // Checks on nodes + // Check that the element's nodes contain all required SolutionStepData and Degrees of freedom + for (unsigned int i = 0; iGetGeometry().size(); ++i) + { + if (this->GetGeometry()[i].SolutionStepsDataHas(DISTANCE) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing DISTANCE variable on solution step data for node ", this->GetGeometry()[i].Id()); + if (this->GetGeometry()[i].SolutionStepsDataHas(VELOCITY) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing VELOCITY variable on solution step data for node ", this->GetGeometry()[i].Id()); + if (this->GetGeometry()[i].SolutionStepsDataHas(PRESSURE) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing PRESSURE variable on solution step data for node ", this->GetGeometry()[i].Id()); + if (this->GetGeometry()[i].SolutionStepsDataHas(MESH_VELOCITY) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing MESH_VELOCITY variable on solution step data for node ", this->GetGeometry()[i].Id()); + if (this->GetGeometry()[i].HasDofFor(VELOCITY_X) == false || + this->GetGeometry()[i].HasDofFor(VELOCITY_Y) == false || + this->GetGeometry()[i].HasDofFor(VELOCITY_Z) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing VELOCITY component degree of freedom on node ", this->GetGeometry()[i].Id()); + if (this->GetGeometry()[i].HasDofFor(PRESSURE) == false) + KRATOS_THROW_ERROR(std::invalid_argument, "missing PRESSURE component degree of freedom on node ", this->GetGeometry()[i].Id()); + } + + // If this is a 2D problem, check that nodes are in XY plane + if (this->GetGeometry().WorkingSpaceDimension() == 2) + { + for (unsigned int i = 0; iGetGeometry().size(); ++i) + { + if (this->GetGeometry()[i].Z() != 0.0) + KRATOS_THROW_ERROR(std::invalid_argument, "Node with non-zero Z coordinate found. Id: ", this->GetGeometry()[i].Id()); + } + } + return 0; + KRATOS_CATCH(""); + }*/ + ///@} + ///@name Access + ///@{ + ///@} + ///@name Elemental Data + ///@{ + ///@} + ///@name Inquiry + ///@{ + ///@} + ///@name Input and output + ///@{ + /// Turn back information as a string. + std::string Info() const override + { + std::stringstream buffer; + buffer << "LAGRANGIAN_FLUID_ #" << this->Id(); + return buffer.str(); + } + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "LAGRANGIAN_FLUID_" << TDim << "D"; + } + // /// Print object's data. + // virtual void PrintData(std::ostream& rOStream) const; + ///@} + ///@name Friends + ///@{ + ///@} +protected: + ///@name Protected static Member Variables + ///@{ + ///@} + ///@name Protected member Variables + ///@{ + ///@} + ///@name Protected Operators + ///@{ + ///@} + ///@name Protected Operations + ///@{ + + /// Add lumped mass matrix + /*void LumpMassMatrix(MatrixType& rMassMatrix) + { + for (unsigned int i = 0; i < rMassMatrix.size1(); ++i) + { + double diag_factor = 0.0; + for (unsigned int j = 0; j < rMassMatrix.size2(); ++j) + { + diag_factor += rMassMatrix(i, j); + rMassMatrix(i, j) = 0.0; + } + rMassMatrix(i, i) = diag_factor; + } + }*/ + /// Add the weighted value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and add the result, weighted by Weight, to + * rResult. This is an auxiliary function used to compute values in integration + * points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + * @param Step The time Step (Defaults to 0 = Current) + * @param Weight The variable will be weighted by this value before it is added to rResult + */ + /*virtual void AddPointContribution(double& rResult, + const Variable< double >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc, + const double Weight = 1.0) + { + double temp = 0.0; + this->EvaluateInPoint(temp, rVariable, rShapeFunc); + rResult += Weight*temp; + }*/ + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + * @param Step The time Step (Defaults to 0 = Current) + */ + /*void EvaluateInPoint(double& rResult, + const Variable< double >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) override + { + //compute sign of distance on gauss point + double dist = 0.0; + for (unsigned int i = 0; i < TNumNodes; i++) + dist += rShapeFunc[i] * this->GetGeometry()[i].FastGetSolutionStepValue(DISTANCE); + + double navg = 0.0; + double value = 0.0; + for (unsigned int i = 0; i < TNumNodes; i++) + { + if ( (dist * this->GetGeometry()[i].FastGetSolutionStepValue(DISTANCE)) > 0.0) + { + navg += 1.0; + value += this->GetGeometry()[i].FastGetSolutionStepValue(rVariable); + } + } + if(navg != 0) + value /= navg; + else + ElementBaseType::EvaluateInPoint(value,rVariable,rShapeFunc); + rResult = value; + }*/ + /// Add the weighted value of a variable at a point inside the element to a vector + /** + * Evaluate a vector variable in the point where the form functions take the + * values given by rShapeFunc and add the result, weighted by Weight, to + * rResult. This is an auxiliary function used to compute values in integration + * points. + * @param rResult The vector where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + * @param Weight The variable will be weighted by this value before it is added to rResult + */ + /*virtual void AddPointContribution(array_1d< double, 3 > & rResult, + const Variable< array_1d< double, 3 > >& rVariable, + const array_1d< double, TNumNodes>& rShapeFunc, + const double Weight = 1.0) + { + array_1d temp = ZeroVector(3); + this->EvaluateInPoint(temp, rVariable, rShapeFunc); + rResult += Weight*temp; + }*/ + + /// Write the value of a variable at a point inside the element to a double + /** + * Evaluate a scalar variable in the point where the form functions take the + * values given by rShapeFunc and write the result to rResult. + * This is an auxiliary function used to compute values in integration points. + * @param rResult The double where the value will be added to + * @param rVariable The nodal variable to be read + * @param rShapeFunc The values of the form functions in the point + */ + /*void EvaluateInPoint(array_1d< double, 3 > & rResult, + const Variable< array_1d< double, 3 > >& rVariable, + const array_1d< double, TNumNodes >& rShapeFunc) override + { + //compute sign of distance on gauss point + double dist = 0.0; + for (unsigned int i = 0; i < TNumNodes; i++) + dist += rShapeFunc[i] * this->GetGeometry()[i].FastGetSolutionStepValue(DISTANCE); + double navg = 0.0; + array_1d< double, 3 > value = ZeroVector(3); + for (unsigned int i = 0; i < TNumNodes; i++) + { + if (dist * this->GetGeometry()[i].FastGetSolutionStepValue(DISTANCE) > 0.0) + { + navg += 1.0; + value += this->GetGeometry()[i].FastGetSolutionStepValue(rVariable); + } + } + if(navg != 0) + value /= navg; + else + ElementBaseType::EvaluateInPoint(value,rVariable,rShapeFunc); + rResult = value; + }*/ + +void CalculateLocalVelocityContribution(MatrixType& rDampingMatrix, + VectorType& rRightHandSideVector, + const ProcessInfo& rCurrentProcessInfo) override + { + const unsigned int LocalSize = (TDim + 1) * TNumNodes; + + // Resize and set to zero the matrix + // Note that we don't clean the RHS because it will already contain body force (and stabilization) contributions + if (rDampingMatrix.size1() != LocalSize) + rDampingMatrix.resize(LocalSize, LocalSize, false); + + noalias(rDampingMatrix) = ZeroMatrix(LocalSize, LocalSize); + + // Get this element's geometric properties + double Area; + array_1d N; + BoundedMatrix DN_DX; + GeometryUtils::CalculateGeometryData(this->GetGeometry(), DN_DX, N, Area); + + // Calculate this element's fluid properties + double Density; + this->EvaluateInPoint(Density, DENSITY, N); + + double ElemSize = this->ElementSize(Area); + double Viscosity = this->EffectiveViscosity(Density,N,DN_DX,ElemSize,rCurrentProcessInfo); + + // Get Advective velocity + array_1d AdvVel; + this->GetAdvectiveVel(AdvVel, N); + + // stabilization parameters + double TauOne, TauTwo; + this->CalculateTau(TauOne,TauTwo,AdvVel,ElemSize,Density,Viscosity,rCurrentProcessInfo); + + this->AddIntegrationPointVelocityContribution(rDampingMatrix, rRightHandSideVector, Density, Viscosity, AdvVel, TauOne, TauTwo, N, DN_DX, Area); + + // Now calculate an additional contribution to the residual: r -= rDampingMatrix * (u,p) + VectorType U = ZeroVector(LocalSize); + int LocalIndex = 0; + + for (unsigned int iNode = 0; iNode < TNumNodes; ++iNode) + { + array_1d< double, 3 > & rVel = this->GetGeometry()[iNode].FastGetSolutionStepValue(VELOCITY); + for (unsigned int d = 0; d < TDim; ++d) // Velocity Dofs + { + U[LocalIndex] = rVel[d]; + ++LocalIndex; + } + U[LocalIndex] = this->GetGeometry()[iNode].FastGetSolutionStepValue(PRESSURE); // Pressure Dof + ++LocalIndex; + } + + noalias(rRightHandSideVector) -= prod(rDampingMatrix, U); + } + + /// Add a the contribution from a single integration point to the velocity contribution + virtual void AddIntegrationPointVelocityContribution(MatrixType& rDampingMatrix, + VectorType& rDampRHS, + const double Density, + const double Viscosity, + const array_1d< double, 3 > & rAdvVel, + const double TauOne, + const double TauTwo, + const array_1d< double, TNumNodes >& rShapeFunc, + const BoundedMatrix& rShapeDeriv, + const double Weight) + { + const unsigned int BlockSize = TDim + 1; + + // If we want to use more than one Gauss point to integrate the convective term, this has to be evaluated once per integration point + array_1d AGradN; + this->GetConvectionOperator(AGradN, rAdvVel, rShapeDeriv); // Get a * grad(Ni) + + // Build the local matrix and RHS + unsigned int FirstRow(0), FirstCol(0); // position of the first term of the local matrix that corresponds to each node combination + double K, G, PDivV, L, qF; // Temporary results + + array_1d BodyForce = ZeroVector(3); + this->EvaluateInPoint(BodyForce,BODY_FORCE,rShapeFunc); + BodyForce *= Density; + + double Temperature; + this->EvaluateInPoint(Temperature, TEMPERATURE, rShapeFunc); + + double Activation_energy; + + this->EvaluateInPoint(Activation_energy, ACTIVATION_ENERGY, rShapeFunc); + + double Arrhenius_coefficient; + + this->EvaluateInPoint(Arrhenius_coefficient, ARRHENIUS_COEFFICIENT, rShapeFunc); + + double R=8.31; //universal gas constant + + + if(Temperature > 800.0) Temperature=800.0; + if(Temperature < 500.0) Arrhenius_coefficient=0.0; + + //if(Temperature < 700.0) Arrhenius_coefficient=0.0; + + double E_over_R_polymer = Activation_energy / R; + + double aux_var_polymer= Arrhenius_coefficient * std::exp(- E_over_R_polymer/Temperature) ; + + for (unsigned int i = 0; i < TNumNodes; ++i) // iterate over rows + { + for (unsigned int j = 0; j < TNumNodes; ++j) // iterate over columns + { + // Calculate the part of the contributions that is constant for each node combination + + // Velocity block + K = Density * rShapeFunc[i] * AGradN[j]; // Convective term: v * ( a * Grad(u) ) + //K = 0.5 * Density * (rShapeFunc[i] * AGradN[j] - AGradN[i] * rShapeFunc[j]); // Skew-symmetric convective term 1/2( v*grad(u)*u - grad(v) uu ) + K += TauOne * Density * AGradN[i] * Density * AGradN[j]; // Stabilization: (a * Grad(v)) * TauOne * (a * Grad(u)) + K *= Weight; + + // q-p stabilization block (reset result) + L = 0; + + for (unsigned int m = 0; m < TDim; ++m) // iterate over v components (vx,vy[,vz]) + { + // Velocity block + //K += Weight * Viscosity * rShapeDeriv(i, m) * rShapeDeriv(j, m); // Diffusive term: Viscosity * Grad(v) * Grad(u) + + // v * Grad(p) block + G = TauOne * Density * AGradN[i] * rShapeDeriv(j, m); // Stabilization: (a * Grad(v)) * TauOne * Grad(p) + PDivV = rShapeDeriv(i, m) * rShapeFunc[j]; // Div(v) * p + + // Write v * Grad(p) component + rDampingMatrix(FirstRow + m, FirstCol + TDim) += Weight * (G - PDivV); + // Use symmetry to write the q * Div(u) component + rDampingMatrix(FirstCol + TDim, FirstRow + m) += Weight * (G + PDivV); + + + // q-p stabilization block + L += rShapeDeriv(i, m) * rShapeDeriv(j, m); // Stabilization: Grad(q) * TauOne * Grad(p) + + for (unsigned int n = 0; n < TDim; ++n) // iterate over u components (ux,uy[,uz]) + { + // Velocity block + rDampingMatrix(FirstRow + m, FirstCol + n) += Weight * TauTwo * rShapeDeriv(i, m) * rShapeDeriv(j, n); // Stabilization: Div(v) * TauTwo * Div(u) + } + + } + + + // Write remaining terms to velocity block + for (unsigned int d = 0; d < TDim; ++d) + rDampingMatrix(FirstRow + d, FirstCol + d) += K; + //rDampingMatrix*=0.0; + // Write q-p stabilization block + rDampingMatrix(FirstRow + TDim, FirstCol + TDim) += Weight * TauOne * L; + + + // Update reference column index for next iteration + FirstCol += BlockSize; + } + + // Operate on RHS + qF = 0.0; + for (unsigned int d = 0; d < TDim; ++d) + { + rDampRHS[FirstRow + d] += Weight * TauOne * Density * AGradN[i] * BodyForce[d]; // ( a * Grad(v) ) * TauOne * (Density * BodyForce) + qF += rShapeDeriv(i, d) * BodyForce[d]; + } + rDampRHS[FirstRow + TDim] += Weight * TauOne * qF; // Grad(q) * TauOne * (Density * BodyForce) + + //rDampRHS[FirstRow + TDim] += (-1.0) * Weight * TauOne * qF; // Grad(q) * TauOne * (Density * BodyForce) + rDampRHS[FirstRow + TDim]-= Weight * aux_var_polymer / TNumNodes; + + // Update reference indices + FirstRow += BlockSize; + FirstCol = 0; + } + +//KRATOS_WATCH(rDampRHS) +// KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + +// this->AddBTransCB(rDampingMatrix,rShapeDeriv,Viscosity*Weight); + this->AddViscousTerm(rDampingMatrix,rShapeDeriv,Viscosity*Weight); + } + + /*void AddMassStabTerms(MatrixType& rLHSMatrix, + const double Density, + const array_1d & rAdvVel, + const double ReactionTerm, + const double TauOne, + const array_1d& rShapeFunc, + const BoundedMatrix& rShapeDeriv, + const double Weight) + { + const unsigned int BlockSize = TDim + 1; + + unsigned int FirstRow(0), FirstCol(0); + double K; // Temporary results + + // If we want to use more than one Gauss point to integrate the convective term, this has to be evaluated once per integration point + array_1d AGradN; + this->GetConvectionOperator(AGradN, rAdvVel, rShapeDeriv); // Get a * grad(Ni) + + array_1d StabilizationOperator = Density*AGradN; + noalias(StabilizationOperator) -= ReactionTerm * rShapeFunc; + StabilizationOperator *= TauOne; + + // Note: Dof order is (vx,vy,[vz,]p) for each node + for (unsigned int i = 0; i < TNumNodes; ++i) + { + // Loop over columns + for (unsigned int j = 0; j < TNumNodes; ++j) + { + // Delta(u) * TauOne * [ AdvVel * Grad(v) - sigma * N ] in velocity block + K = Weight * StabilizationOperator[i] * Density * rShapeFunc[j]; + + for (unsigned int d = 0; d < TDim; ++d) // iterate over dimensions for velocity Dofs in this node combination + { + rLHSMatrix(FirstRow + d, FirstCol + d) += K; + // Delta(u) * TauOne * Grad(q) in q * Div(u) block + rLHSMatrix(FirstRow + TDim, FirstCol + d) += Weight * TauOne * rShapeDeriv(i, d) * Density * rShapeFunc[j]; + } + // Update column index + FirstCol += BlockSize; + } + // Update matrix indices + FirstRow += BlockSize; + FirstCol = 0; + } + }*/ + + /*void CalculateStabilizationTau( + double& TauOne, + double& TauTwo, + const double VelNorm, + const double ElemSize, + const double Density, + const double DynamicViscosity, + const double ReactionTerm, + const ProcessInfo& rCurrentProcessInfo) + { + const double DynamicTerm = rCurrentProcessInfo[DYNAMIC_TAU] / rCurrentProcessInfo[DELTA_TIME]; + double InvTau = Density * ( DynamicTerm + 2.0*VelNorm / ElemSize ) + 4.0*DynamicViscosity/ (ElemSize * ElemSize) + ReactionTerm; + TauOne = 1.0 / InvTau; + + TauTwo = DynamicViscosity + 0.5 * Density * ElemSize * VelNorm; + }*/ + + /*virtual double CalculateDarcyTerm( + const double Density, + const double DynamicViscosity, + const double LinearCoefficient, + const double NonlinearCoefficient, + const array_1d& rShapefunctions) { + + array_1d velocity; + this->GetAdvectiveVel(velocity, rShapefunctions); + const double velocity_norm = MathUtils::Norm3(velocity); + + return DynamicViscosity * LinearCoefficient + Density * NonlinearCoefficient*velocity_norm; + }*/ + + ///@} + ///@name Protected Access + ///@{ + ///@} + ///@name Protected Inquiry + ///@{ + ///@} + ///@name Protected LifeCycle + ///@{ + ///@} +private: + ///@name Static Member Variables + ///@{ + ///@} + ///@name Member Variables + ///@{ + ///@} + ///@name Serialization + ///@{ + friend class Serializer; + void save(Serializer& rSerializer) const override + { + KRATOS_SERIALIZE_SAVE_BASE_CLASS(rSerializer, ElementBaseType); + } + void load(Serializer& rSerializer) override + { + KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, ElementBaseType); + } + ///@} + ///@name Private Operators + ///@{ + ///@} + ///@name Private Operations + ///@{ + ///@} + ///@name Private Access + ///@{ + ///@} + ///@name Private Inquiry + ///@{ + ///@} + ///@name Un accessible methods + ///@{ + /// Assignment operator. + LagrangianFluidVMS & operator=(LagrangianFluidVMS const& rOther); + /// Copy constructor. + LagrangianFluidVMS(LagrangianFluidVMS const& rOther); + ///@} +}; // Class TwoFluidVMS +///@} +///@name Type Definitions +///@{ +///@} +///@name Input and output +///@{ +/// input stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::istream & operator >>(std::istream& rIStream, + LagrangianFluidVMS& rThis) +{ + return rIStream; +} +/// output stream function +template< unsigned int TDim, + unsigned int TNumNodes > +inline std::ostream & operator <<(std::ostream& rOStream, + const LagrangianFluidVMS& rThis) +{ + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + return rOStream; +} +///@} +///@} // Fluid Dynamics Application group +} // namespace Kratos. +#endif // KRATOS_TWO_FLUID_VMS_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_processes/apply_laser_process.hpp b/applications/PfemMeltingApplication/custom_processes/apply_laser_process.hpp new file mode 100644 index 000000000000..3d5c5f6fd294 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_processes/apply_laser_process.hpp @@ -0,0 +1,330 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ ` +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Miguel Angel Celigueta (maceli@cimne.upc.edu) +// + + +#if !defined(KRATOS_APPLY_LASER_PROCESS ) +#define KRATOS_APPLY_LASER_PROCESS + +#include "includes/table.h" +#include "includes/kratos_parameters.h" +#include "processes/process.h" + +#include "utilities/parallel_utilities.h" +#include "utilities/function_parser_utility.h" +#include "utilities/interval_utility.h" +#include "utilities/python_function_callback_utility.h" + + +#include "includes/define.h" +#include "includes/model_part.h" +#include "includes/node.h" +#include "utilities/geometry_utilities.h" +#include "geometries/tetrahedra_3d_4.h" +#include "spatial_containers/spatial_containers.h" +#include "utilities/timer.h" +#include "processes/node_erase_process.h" +#include "utilities/binbased_fast_point_locator.h" +#include "includes/deprecated_variables.h" + +#include +#include "utilities/timer.h" + +namespace Kratos +{ + +class ApplyLaserProcess : public Process +{ + +public: + + KRATOS_CLASS_POINTER_DEFINITION(ApplyLaserProcess); + + typedef Table TableType; + + + /// Constructor + ApplyLaserProcess( + ModelPart& rModelPart, + Parameters rParameters + ) : Process() , + mrModelPart(rModelPart) + { + KRATOS_TRY + + Parameters default_parameters( R"( + { + "model_part_name":"MODEL_PART_NAME", + "filename" : "./LaserSettings.json" + } )" ); + + + // Parameters default_parameters( R"( + // { + // //"model_part_name":"MODEL_PART_NAME" + // "x_coordinate": 0.0, +// "y_coordinate": 0.0, +// "z_coordinate": 0.0, +// "radius": 0.0, +// "face_heat_flux": 0.0 + // } )" ); + + mRadius = rParameters["laser_profile"]["radius"].GetDouble(); + mPower = rParameters["laser_profile"]["power"].GetDouble(); + mDirectionx = rParameters["direction"][0].GetDouble(); + mDirectiony = rParameters["direction"][1].GetDouble(); + mDirectionz = rParameters["direction"][2].GetDouble(); + + mParameters=rParameters; + auto values = rParameters["laser_profile"]["values"]; + + //mCorrectionFactor = rParameters["correction_factor"].GetDouble(); + + // Now validate agains defaults -- this also ensures no type mismatch + //rParameters.ValidateAndAssignDefaults(default_parameters); + + //mLaserProfile.clear(); + //mDirection.clear(); + //mPositionLaserTable.clear(); + int i=0; + //KRATOS_WATCH(rParameters["laser_profile"]["shape"]) + //KRATOS_WATCH(rParameters["laser_profile"]["values"]) + //KRATOS_THROW_ERROR(std::logic_error, "method not implemented", ""); + if(rParameters["laser_profile"]["shape"].GetString()=="custom") + { + while(i < values.size()) + { + //mLaserProfileTable.PushBack(values[i]["distance"].GetDouble(), values[i]["power_per_unit_area"].GetDouble()); + mLaserProfileTable.PushBack(values[i]["distance"].GetDouble(), values[i]["power_deviation_from_flat"].GetDouble()); + i = i + 1; + } + mRadius=values[i-1]["distance"].GetDouble(); + } + + KRATOS_CATCH(""); + } + + ///------------------------------------------------------------------------------------ + + /// Destructor + ~ApplyLaserProcess() override {} + +///---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + /// Execute method is used to execute the ApplyLaserProcess algorithms. + void Execute() override + { + + } + + /// this function is designed for being called at the beginning of the computations + /// right after reading the model and the groups + void ExecuteInitialize() override + { + KRATOS_TRY; + KRATOS_CATCH(""); + } + + /// this function will be executed at every time step BEFORE performing the solve phase + void ApplyLaser(double x, double y, double z, double power) { + KRATOS_TRY; + + //defintions for spatial search + typedef Node < 3 > PointType; + typedef Node < 3 > ::Pointer PointTypePointer; + typedef std::vector PointVector; + + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; + + for (ModelPart::NodesContainerType::iterator node_it = mrModelPart.NodesBegin(); node_it != mrModelPart.NodesEnd(); ++node_it) { + PointTypePointer pnode = *(node_it.base()); + //node_it->FastGetSolutionStepValue(FACE_HEAT_FLUX)=0.0; + if(node_it->FastGetSolutionStepValue(IS_FREE_SURFACE)) { + list_of_nodes.push_back(pnode); + } + } + + Node < 3 > work_point(0, 0.0, 0.0, 0.0); + + array_1d direction; + array_1d normal; + /*direction[0] = 0.0; + direction[1] = 1.0; + direction[2] = 0.0;*/ + + direction[0] = mDirectionx; + direction[1] = mDirectiony; + direction[2] = mDirectionz; + direction *=-1.0; + //KRATOS_WATCH(direction) + array_1d unitary_dir = direction * (1.0 / MathUtils::Norm3(direction)); + + //KRATOS_WATCH(unitary_dir) + for (size_t k = 0; k < list_of_nodes.size(); k++) { + const array_1d& coords = list_of_nodes[k]->Coordinates(); + array_1d distance_vector; + distance_vector[0] = coords[0]-x; + distance_vector[1] = coords[1]-y; + distance_vector[2] = coords[2]-z; + //KRATOS_WATCH(distance_vector) + + const double distance = MathUtils::Norm3(distance_vector); // TODO: squared norm is better here + + normal=list_of_nodes[k]->FastGetSolutionStepValue(NORMAL); + + double norm_direction = std::sqrt( direction[0] * direction[0] + direction[1] * direction[1] + direction[2] * direction[2] ); + double norm_normal = std::sqrt( normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2] ); + + double cos_angle=direction[0] * normal[0] + direction[1] * normal[1] + direction[2] * normal[2]; + cos_angle /=(norm_direction * norm_normal); + //KRATOS_WATCH(cos_angle) + + //KRATOS_WATCH(distance) + const double distance_projected_to_dir = distance_vector[0]*unitary_dir[0] + distance_vector[1]*unitary_dir[1] + distance_vector[2]*unitary_dir[2]; + //KRATOS_WATCH(distance_projected_to_dir) + const double distance_to_laser_axis = std::sqrt(distance*distance - distance_projected_to_dir*distance_projected_to_dir); + + //KRATOS_WATCH(distance_to_laser_axis) + //KRATOS_THROW_ERROR(std::logic_error, "method not implemented", ""); + //KRATOS_WATCH(mRadius) + double power_per_unit_area=0.0; + double power_deviation_from_flat=0.0; + double power_per_unit_area_from_flat=0.0; + if(mParameters["laser_profile"]["shape"].GetString()=="custom") + { + + //KRATOS_WATCH(mLaserProfileTable) + //KRATOS_WATCH(mRadius) + //KRATOS_WATCH(distance_to_laser_axis) + + + //power_per_unit_area=mLaserProfileTable(distance_to_laser_axis); + power_deviation_from_flat=mLaserProfileTable(distance_to_laser_axis); + power_per_unit_area_from_flat=power / (Globals::Pi * mRadius * mRadius); + power_per_unit_area = power_deviation_from_flat * power_per_unit_area_from_flat; + + //KRATOS_WATCH(power); + //KRATOS_WATCH(mLaserProfileTable); + //KRATOS_WATCH(distance_to_laser_axis) + //KRATOS_WATCH(power_per_unit_area) + + if(power_per_unit_area<0) power_per_unit_area=0.0; + + + } + else if(mParameters["laser_profile"]["shape"].GetString()=="flat") + { + power_per_unit_area=mPower / (Globals::Pi * mRadius * mRadius);} + + + if(distance_to_laser_axis < mRadius) { + double& aux= list_of_nodes[k]->FastGetSolutionStepValue(FACE_HEAT_FLUX); + double aux_1 = cos_angle * power_per_unit_area; + if (aux_1>0.000000001) aux=aux_1; + else aux=0.0; + //aux=2000000.0; + + //KRATOS_WATCH(aux) + } + + //KRATOS_THROW_ERROR(std::logic_error, "method not implemented", ""); + + } + //KRATOS_THROW_ERROR(std::logic_error, "method not implemented", ""); + KRATOS_CATCH(""); + } + + void ExecuteInitializeSolutionStep() override { + KRATOS_TRY; + + + KRATOS_CATCH("") + } + + + /** + * @brief This function will be executed at every time step AFTER performing the solve phase + */ + void ExecuteFinalizeSolutionStep() override { + + } + + /// Turn back information as a string. + std::string Info() const override + { + return "ApplyLaserProcess"; + } + + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "ApplyLaserProcess"; + } + + /// Print object's data. + void PrintData(std::ostream& rOStream) const override + { + } + +///---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +protected: + + + +///---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +private: + + ModelPart& mrModelPart; + + //mLaserProfile.clear(); + //mDirection.clear(); + std::vector mPositionLaserTable; + array_1d mPositionLaserTableId; + double mPower; + double mRadius; + double mDirectionx; + double mDirectiony; + double mDirectionz; + + Parameters mParameters; + + TableType mLaserProfileTable; + + /// Assignment operator. + ApplyLaserProcess& operator=(ApplyLaserProcess const& rOther); + + /// Copy constructor. + //ApplyLaserProcess(ApplyLaserProcess const& rOther); + + +}; // Class ApplyLaserProcess + +/// input stream function +inline std::istream& operator >> (std::istream& rIStream, + ApplyLaserProcess& rThis); + +/// output stream function +inline std::ostream& operator << (std::ostream& rOStream, + const ApplyLaserProcess& rThis) +{ + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + + return rOStream; +} + +} // namespace Kratos. + +#endif /* KRATOS_APPLY_LASER_PROCESS defined */ diff --git a/applications/PfemMeltingApplication/custom_processes/hypoelastic_solid_stress_tensor_calculate_process.h b/applications/PfemMeltingApplication/custom_processes/hypoelastic_solid_stress_tensor_calculate_process.h new file mode 100644 index 000000000000..536b6b6b9bc8 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_processes/hypoelastic_solid_stress_tensor_calculate_process.h @@ -0,0 +1,690 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ \. +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Pavel Ryzhakov +// + + +#if !defined(KRATOS_HYPOELASTIC_CALCULATE_PROCESS_INCLUDED ) +#define KRATOS_HYPOELASTIC_CALCULATE_PROCESS_INCLUDED + + + +// System includes +#include +#include +#include + +// External includes + + +// Project includes +#include "includes/define.h" +#include "processes/process.h" +#include "includes/node.h" +#include "includes/element.h" +#include "includes/model_part.h" +#include "utilities/geometry_utilities.h" +#include "pfem_melting_application.h" +#include "custom_elements/hypo.h" + + +namespace Kratos +{ + +///@name Kratos Globals +///@{ + +///@} +///@name Type Definitions +///@{ + + +///@} +///@name Enum's +///@{ + +///@} +///@name Functions +///@{ + +///@} +///@name Kratos Classes +///@{ + +/// Short class definition. +/** Detail class definition. + Update the PRESSURE_FORCE on the nodes + + +*/ + +class HypoelasticStressCalculateProcess + : public Process +{ +public: + ///@name Type Definitions + ///@{ + + /// Pointer definition of HypoelasticStressCalculateProcess + KRATOS_CLASS_POINTER_DEFINITION(HypoelasticStressCalculateProcess); + + ///@} + ///@name Life Cycle + ///@{ + + /// Default constructor. + HypoelasticStressCalculateProcess(ModelPart& model_part, unsigned int domain_size) + : mr_model_part(model_part),mdomain_size(domain_size) + { + } + + /// Destructor. + ~HypoelasticStressCalculateProcess() override + { + } + + + ///@} + ///@name Operators + ///@{ + + void operator()() + { + Execute(); + } + + + ///@} + ///@name Operations + ///@{ + + void Execute() override + { + KRATOS_TRY + + ProcessInfo& proc_info = mr_model_part.GetProcessInfo(); + + + if (mdomain_size==2) + { + Matrix dummy=ZeroMatrix(2,2); + double Area; + array_1d N; + + BoundedMatrix msDN_Dx; + + BoundedMatrix Sigma=ZeroMatrix(2,2); + + BoundedMatrix CauchyStress=ZeroMatrix(2,2); + + + + + //THIS SHOULD BE EXECUTED ONLY FOR THOSE ELEMENTS OF THE MONOLITHIC MODEL THAT ARE IDENTIFIED TO BELONG TO THE SOLID domain + //before the first step we initialize Cauchy stress to zero + if (proc_info[TIME]==0.0) + { + for(ModelPart::ElementsContainerType::iterator im = mr_model_part.ElementsBegin() ; + im != mr_model_part.ElementsEnd() ; ++im) + { + //IN A MONOLITHIC FLUID-SOLID MODEL WE WANT TO EXCEUTE THIS FUNCTION ONLY FOR THE SOLID ELEMENTS + //if(im->GetGeometry()[0].Is(STRUCTURE) && im->GetGeometry()[1].Is(STRUCTURE) && im->GetGeometry()[2].Is(STRUCTURE)) + im->SetValue(CAUCHY_STRESS_TENSOR, dummy); + CauchyStress=im->GetValue(CAUCHY_STRESS_TENSOR); + } + + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY)=0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY)=0.0; + + } + + + } + //and now we actually compute it + else + { + + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + i->FastGetSolutionStepValue(NODAL_AREA) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY)=0.0; + } + + + for(ModelPart::ElementsContainerType::iterator im = mr_model_part.ElementsBegin() ; im != mr_model_part.ElementsEnd() ; ++im) + { + //IN A MONOLITHIC FLUID-SOLID MODEL WE WANT TO EXCEUTE THIS FUNCTION ONLY FOR THE SOLID ELEMENTS + //if(im->GetGeometry()[0].Is(STRUCTURE) && im->GetGeometry()[1].Is(STRUCTURE) && im->GetGeometry()[2].Is(STRUCTURE)) + if(im->GetGeometry()[0].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 && im->GetGeometry()[1].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 && im->GetGeometry()[2].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 ) + + im->Calculate(CAUCHY_STRESS_TENSOR,dummy,proc_info); + + CauchyStress=im->GetValue(CAUCHY_STRESS_TENSOR); + + //KRATOS_WATCH(CauchyStress) + GeometryUtils::CalculateGeometryData(im->GetGeometry(), msDN_Dx, N, Area); + Geometry< Node < 3 > >& geom = im->GetGeometry(); + + for (unsigned int k = 0; k < geom.size(); k++) + { + //TENSOR PROYECTED IN THE NODES! + geom[k].SetLock(); + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_XX) += N[k] * CauchyStress(0,0) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_XY) += N[k] * CauchyStress(0,1) * Area; + + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_YX) += N[k] * CauchyStress(1,0) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_YY) += N[k] * CauchyStress(1,1) * Area; + + //DDDDDDDDDDDDDDDDDDD + + // So it is safe to write in the node in OpenMP + if(Area==0){KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented","");} + double &area=geom[k].FastGetSolutionStepValue(NODAL_AREA); + area +=Area * N[k]; + if (area==0) KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented","") + geom[k].UnSetLock(); // Free the node for other threads + //DDDDDDDDDDDDDDDDDDD + } + } + + + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + + double &A0 = i->FastGetSolutionStepValue(NODAL_AREA); + + if (i->FastGetSolutionStepValue(NODAL_AREA)==0) + { + double pp=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) = 0.0; + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) = 0.0; + + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + else{ + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) += i->FastGetSolutionStepValue(DELTA_SIGMA_XX); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) += i->FastGetSolutionStepValue(DELTA_SIGMA_XY); + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) += i->FastGetSolutionStepValue(DELTA_SIGMA_YX); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) += i->FastGetSolutionStepValue(DELTA_SIGMA_YY); + + + if(i->FastGetSolutionStepValue(IS_INTERFACE) == 0.0) + + { + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) = 0.0; + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) = 0.0; + + } + + } + + } + + + + }// + }//end 2D + else if (mdomain_size==3) + { + + double Area; + array_1d N; + BoundedMatrix msDN_Dx; + + + Matrix dummy=ZeroMatrix(3,3); + + BoundedMatrix Sigma=ZeroMatrix(3,3); + //BoundedMatrix HistoricalCauchyStress=ZeroMatrix(2,2); + + BoundedMatrix CauchyStress=ZeroMatrix(3,3); + + /////////////////////// + //first, we initialize CAUCHY_STRESS_TENSOR to zero + if (proc_info[TIME]==0.0) + { + for(ModelPart::ElementsContainerType::iterator im = mr_model_part.ElementsBegin() ; + im != mr_model_part.ElementsEnd() ; ++im) + { + //GeometryUtils::CalculateGeometryData(im->GetGeometry(), msDN_Dx, N, Area); + //if(im->GetGeometry()[0].Is(STRUCTURE) && im->GetGeometry()[1].Is(STRUCTURE) && im->GetGeometry()[2].Is(STRUCTURE) && im->GetGeometry()[3].Is(STRUCTURE)) + im->SetValue(CAUCHY_STRESS_TENSOR, dummy); + //im->SetValue(GREEN_LAGRANGE_STRAIN_TENSOR, dummy); + //im->SetValue(PK2_STRESS_TENSOR, dummy); + //KRATOS_WATCH(CAUCHY_STRESS_TENSOR) + } + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ)=0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ)=0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY)=0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XZ)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YZ)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_ZX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ)=0.0; + + + } + + } + //and now we actually compute it + else + { + + double dummy_aux=0.0; + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + i->FastGetSolutionStepValue(NODAL_AREA) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_XX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XZ)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YZ)=0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_ZX)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZY)=0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ)=0.0; + + } + + /*for(ModelPart::ElementsContainerType::iterator im = mr_model_part.ElementsBegin() ; im != mr_model_part.ElementsEnd() ; ++im) + { + im->Calculate(NODAL_AREA,dummy_aux,proc_info); + }*/ + for(ModelPart::ElementsContainerType::iterator im = mr_model_part.ElementsBegin() ; im != mr_model_part.ElementsEnd() ; ++im) + { + + + if(im->GetGeometry()[0].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 && im->GetGeometry()[1].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 && im->GetGeometry()[2].FastGetSolutionStepValue(IS_INTERFACE) == 1.0 && im->GetGeometry()[3].FastGetSolutionStepValue(IS_INTERFACE) == 1.0) + { + GeometryUtils::CalculateGeometryData(im->GetGeometry(), msDN_Dx, N, Area); + + Geometry< Node < 3 > >& geom = im->GetGeometry(); + //int nn=0; + im->Calculate(CAUCHY_STRESS_TENSOR,dummy,proc_info); + //CauchyStress=im->FastGetSolutionStepValue(CAUCHY_STRESS_TENSOR); + CauchyStress=im->GetValue(CAUCHY_STRESS_TENSOR); + + for (unsigned int k = 0; k < geom.size(); k++) + { + //TENSOR PROYECTED IN THE NODES! + geom[k].SetLock(); + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_XX) += N[k] * CauchyStress(0,0) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_XY) += N[k] * CauchyStress(0,1) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_XZ) += N[k] * CauchyStress(0,2) * Area; + + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_YX) += N[k] * CauchyStress(1,0) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_YY) += N[k] * CauchyStress(1,1) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_YZ) += N[k] * CauchyStress(1,2) * Area; + + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_ZX) += N[k] * CauchyStress(2,0) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_ZY) += N[k] * CauchyStress(2,1) * Area; + geom[k].FastGetSolutionStepValue(DELTA_SIGMA_ZZ) += N[k] * CauchyStress(2,2) * Area; + + //DDDDDDDDDDDDDDDDDDD + + // So it is safe to write in the node in OpenMP + if(Area==0){KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented","");} + double &area=geom[k].FastGetSolutionStepValue(NODAL_AREA); + area +=Area * N[k]; + if (area==0) KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented","") + geom[k].UnSetLock(); // Free the node for other threads + //DDDDDDDDDDDDDDDDDDD + } + } + } + + for(ModelPart::NodesContainerType::iterator i = mr_model_part.NodesBegin(); i!=mr_model_part.NodesEnd(); i++) + { + //KRATOS_WATCH("#########################################") + //KRATOS_WATCH("#########################################") + + //KRATOS_WATCH(i->FastGetSolutionStepValue(NODAL_AREA)) + + double &A0 = i->FastGetSolutionStepValue(NODAL_AREA); + + if (i->FastGetSolutionStepValue(NODAL_AREA)==0) + { + double pp=0.0; + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XZ) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YZ) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_ZX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ) = 0.0; + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) = 0.0; + + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + else{ + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_XZ) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_YZ) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + + i->FastGetSolutionStepValue(DELTA_SIGMA_ZX) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_ZY) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ) *= (1.0/i->FastGetSolutionStepValue(NODAL_AREA)); + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) += i->FastGetSolutionStepValue(DELTA_SIGMA_XX); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) += i->FastGetSolutionStepValue(DELTA_SIGMA_XY); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) += i->FastGetSolutionStepValue(DELTA_SIGMA_XZ); + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) += i->FastGetSolutionStepValue(DELTA_SIGMA_YX); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) += i->FastGetSolutionStepValue(DELTA_SIGMA_YY); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) += i->FastGetSolutionStepValue(DELTA_SIGMA_YZ); + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) += i->FastGetSolutionStepValue(DELTA_SIGMA_ZX); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) += i->FastGetSolutionStepValue(DELTA_SIGMA_ZY); + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) += i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ); + + + if(i->FastGetSolutionStepValue(IS_INTERFACE) == 0.0) + + { + i->FastGetSolutionStepValue(DELTA_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_XZ) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_YZ) = 0.0; + + i->FastGetSolutionStepValue(DELTA_SIGMA_ZX) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZY) = 0.0; + i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ) = 0.0; + + //HISTORICAL CAUCHY STRESS TENSOR + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_XZ) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_YZ) = 0.0; + + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZX) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZY) = 0.0; + i->FastGetSolutionStepValue(HISTORICAL_SIGMA_ZZ) = 0.0; + + + } + + /*KRATOS_WATCH(i->FastGetSolutionStepValue(NODAL_AREA)) + + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_XX)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_XY)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_XZ)) + + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_YX)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_YY)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_YZ)) + + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_ZX)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_ZY)) + KRATOS_WATCH(i->FastGetSolutionStepValue(DELTA_SIGMA_ZZ))*/ + } + + } + } + //KRATOS_WATCH("Executed of Cauchy stress tensor computation of the hypoelastic element"); + } + KRATOS_CATCH("") + } + + + ///@} + ///@name Access + ///@{ + + + ///@} + ///@name Inquiry + ///@{ + + + ///@} + ///@name Input and output + ///@{ + + /// Turn back information as a string. + std::string Info() const override + { + return "HypoelasticStressCalculateProcess"; + } + + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "HypoelasticStressCalculateProcess"; + } + + /// Print object's data. + void PrintData(std::ostream& rOStream) const override + { + } + + + ///@} + ///@name Friends + ///@{ + + + ///@} + +protected: + ///@name Protected static Member Variables + ///@{ + + + ///@} + ///@name Protected member Variables + ///@{ + + + ///@} + ///@name Protected Operators + ///@{ + + + ///@} + ///@name Protected Operations + ///@{ + + + ///@} + ///@name Protected Access + ///@{ + + + ///@} + ///@name Protected Inquiry + ///@{ + + + ///@} + ///@name Protected LifeCycle + ///@{ + + + ///@} + +private: + ///@name Static Member Variables + ///@{ + + + ///@} + ///@name Member Variables + ///@{ + ModelPart& mr_model_part; + unsigned int mdomain_size; + + + ///@} + ///@name Private Operators + ///@{ + + + ///@} + ///@name Private Operations + ///@{ + + + ///@} + ///@name Private Access + ///@{ + + + ///@} + ///@name Private Inquiry + ///@{ + + + ///@} + ///@name Un accessible methods + ///@{ + + /// Assignment operator. +// HypoelasticStressCalculateProcess& operator=(HypoelasticStressCalculateProcess const& rOther); + + /// Copy constructor. +// HypoelasticStressCalculateProcess(HypoelasticStressCalculateProcess const& rOther); + + + ///@} + +}; // Class HypoelasticStressCalculateProcess + +///@} + +///@name Type Definitions +///@{ + + +///@} +///@name Input and output +///@{ + + +/// input stream function +inline std::istream& operator >> (std::istream& rIStream, + HypoelasticStressCalculateProcess& rThis); + +/// output stream function +inline std::ostream& operator << (std::ostream& rOStream, + const HypoelasticStressCalculateProcess& rThis) +{ + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + + return rOStream; +} +///@} + + +} // namespace Kratos. + +#endif // KRATOS_HYPOELASTIC_CALCULATE_PROCESS_INCLUDED defined + + diff --git a/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.cpp b/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.cpp new file mode 100755 index 000000000000..a5cde04a3c3a --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.cpp @@ -0,0 +1,51 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ ` +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Miguel Angel Celigueta +// +// + +// External includes + +// Project includes +#include "custom_python/add_custom_processes_to_python.h" +#include "includes/model_part.h" +#include "processes/process.h" +#include "includes/kratos_parameters.h" + +// Processes +#include "custom_processes/apply_laser_process.hpp" +#include "custom_processes/hypoelastic_solid_stress_tensor_calculate_process.h" + + +namespace Kratos +{ + +namespace Python +{ + +void AddCustomProcessesToPython(pybind11::module& m) +{ + + namespace py = pybind11; + + // Apply table values + py::class_ + (m, "ApplyLaserProcess") + .def(py::init < ModelPart&, Parameters>()) + .def("ApplyLaser", &ApplyLaserProcess::ApplyLaser); + + py::class_(m,"HypoelasticStressCalculateProcess") + .def(py::init()) + ; +} + +} // namespace Python. +} // Namespace Kratos + diff --git a/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.h b/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.h new file mode 100755 index 000000000000..3d0e48ac826d --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/add_custom_processes_to_python.h @@ -0,0 +1,36 @@ +// | / | +// ' / __| _` | __| _ \ __| +// . \ | ( | | ( |\__ ` +// _|\_\_| \__,_|\__|\___/ ____/ +// Multi-Physics +// +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Miguel Angel Celigueta +// +// + +#if !defined(KRATOS_ADD_CUSTOM_PROCESSES_TO_PYTHON_H_INCLUDED ) +#define KRATOS_ADD_CUSTOM_PROCESSES_TO_PYTHON_H_INCLUDED + +// System includes +#include + +// External includes + +// Project includes +#include "includes/define_python.h" + +namespace Kratos +{ + +namespace Python +{ + +void AddCustomProcessesToPython(pybind11::module& m); + +} // namespace Python. +} // namespace Kratos. + +#endif // KRATOS_ADD_CUSTOM_PROCESSES_TO_PYTHON_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_python/add_custom_response_functions_to_python.cpp b/applications/PfemMeltingApplication/custom_python/add_custom_response_functions_to_python.cpp new file mode 100644 index 000000000000..84383ed9a3b7 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/add_custom_response_functions_to_python.cpp @@ -0,0 +1,43 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +// System includes + +// External includes + +// Project includes +#include "custom_python/add_custom_response_functions_to_python.h" + +// Response Functions +#include "custom_response_functions/local_temperature_average_response_function.h" + + +namespace Kratos { +namespace Python { + +void AddCustomResponseFunctionsToPython(pybind11::module& m) +{ + namespace py = pybind11; + + // Response Functions + py::class_ + (m, "LocalTemperatureAverageResponseFunction") + .def(py::init()); + +} + +} // namespace Python. +} // Namespace Kratos diff --git a/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.cpp b/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.cpp new file mode 100644 index 000000000000..ed9a514a0014 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.cpp @@ -0,0 +1,74 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + + +// System includes + +// External includes +#include + + +// Project includes +//#include "includes/define.h" +#include "includes/define_python.h" +#include "processes/process.h" +#include "custom_python/add_custom_utilities_to_python.h" + +#include "spaces/ublas_space.h" +#include "custom_utilities/face_heat_distribution.h" +#include "custom_utilities/streamline.h" +#include "custom_utilities/heat_source.h" +#include "custom_utilities/pfemmelting_apply_bc_process.h" + +namespace Kratos +{ + +namespace Python +{ + + +void AddCustomUtilitiesToPython(pybind11::module& m) +{ +namespace py = pybind11; + + + + py::class_ >(m,"Streamline").def(py::init<>()) + .def("SubSteppingElementbasedSI", &Streamline < 3 > ::SubSteppingElementbasedSI) + .def("RungeKutta4ElementbasedSI", &Streamline < 3 > ::RungeKutta4ElementbasedSI) + .def("RungeKutta4KernelbasedSI", &Streamline < 3 > ::RungeKutta4KernelbasedSI) + .def("CheckInvertElement", &Streamline < 3 > ::CheckInvertElement) + .def("CalculateVolume", &Streamline < 3 > ::CalculateVolume) + .def("MovingParticles", &Streamline < 3 > ::MovingParticles) + ; + + + py::class_ >(m,"FaceHeatFlux").def(py::init<>()) + .def("FaceHeatFluxDistribution", &FaceHeatFlux < 3 > ::FaceHeatFluxDistribution) + .def("FlameDistribution", &FaceHeatFlux < 3 > ::FlameDistribution) + ; + + py::class_ >(m,"HeatSource").def(py::init<>()) + .def("Heat_Source", &HeatSource < 3 > ::Heat_Source) + ; + + py::class_(m, "PfemMeltingApplyBCProcess").def(py::init()); + +} + +} // namespace Python. + +} // Namespace Kratos diff --git a/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.h b/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.h new file mode 100644 index 000000000000..c8db2c590abe --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/add_custom_utilities_to_python.h @@ -0,0 +1,44 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_ADD_UTILITIES_TO_PYTHON_H_INCLUDED ) +#define KRATOS_ADD_UTILITIES_TO_PYTHON_H_INCLUDED + + + +// System includes +#include + +// External includes + + +// Project includes +#include "includes/define_python.h" + + +namespace Kratos +{ + +namespace Python +{ + +void AddCustomUtilitiesToPython(pybind11::module& m); + +} // namespace Python. + +} // namespace Kratos. + +#endif // KRATOS_ADD_UTILITIES_TO_PYTHON_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_python/kratos_pfem_melting_python_application.cpp b/applications/PfemMeltingApplication/custom_python/kratos_pfem_melting_python_application.cpp new file mode 100644 index 000000000000..2b784d04c227 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_python/kratos_pfem_melting_python_application.cpp @@ -0,0 +1,98 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +// System includes + +#if defined(KRATOS_PYTHON) +// External includes + +// Project includes +#include "includes/define_python.h" +#include "pfem_melting_application.h" +//#include "custom_python/add_custom_strategies_to_python.h" +#include "custom_python/add_custom_utilities_to_python.h" +#include "custom_python/add_custom_processes_to_python.h" +//#include "custom_python/add_custom_response_functions_to_python.h" + +namespace Kratos +{ + +namespace Python +{ + +namespace py = pybind11; + +PYBIND11_MODULE(KratosPfemMeltingApplication,m) +{ + + py::class_(m,"KratosPfemMeltingApplication") + .def(py::init<>()) + ; + //AddCustomStrategiesToPython(m); + AddCustomUtilitiesToPython(m); + AddCustomProcessesToPython(m); + //AddCustomResponseFunctionsToPython(m); + + // Registering variables in python + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, ACTIVATION_ENERGY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, ARRHENIUS_COEFFICIENT) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, RADIOUS) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HEAT_OF_VAPORIZATION) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, ARRHENIUS_VALUE) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, ARRHENIUS_VALUE) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_XX) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_XX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_XY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_XZ) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_YX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_YY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_YZ) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_ZX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_ZY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, DELTA_SIGMA_ZZ) + + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_XX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_XY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_XZ) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_YX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_YY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_YZ) + + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_ZX) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_ZY) + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, HISTORICAL_SIGMA_ZZ) + + + + KRATOS_REGISTER_IN_PYTHON_3D_VARIABLE_WITH_COMPONENTS(m,INITIAL_POSITION) + + +} + +} // namespace Python. + +} // namespace Kratos. + +#endif // KRATOS_PYTHON defined diff --git a/applications/PfemMeltingApplication/custom_utilities/face_heat_distribution.h b/applications/PfemMeltingApplication/custom_utilities/face_heat_distribution.h new file mode 100644 index 000000000000..0400eac46171 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_utilities/face_heat_distribution.h @@ -0,0 +1,284 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_PARTICLES_UTILITIES_INCLUDED ) +#define KRATOS_PARTICLES_UTILITIES_INCLUDED + +#define PRESSURE_ON_EULERIAN_MESH +#define USE_FEW_PARTICLES + +// System includes +#include +#include +#include + +// External includes + + +// Project includes +#include "includes/define.h" +#include "includes/model_part.h" +#include "includes/node.h" +#include "utilities/geometry_utilities.h" +#include "geometries/tetrahedra_3d_4.h" +#include "pfem_melting_application.h" +#include "spatial_containers/spatial_containers.h" +#include "utilities/timer.h" +#include "processes/node_erase_process.h" +#include "utilities/binbased_fast_point_locator.h" +#include "includes/deprecated_variables.h" + +#include +#include "utilities/timer.h" + +#ifdef _OPENMP +#include "omp.h" +#endif + +namespace Kratos +{ + + template< class T, std::size_t dim > + class DistanceCalculator1 + { + public: + + double operator()(T const& p1, T const& p2) + { + double dist = 0.0; + for (std::size_t i = 0; i < dim; i++) + { + double tmp = p1[i] - p2[i]; + dist += tmp*tmp; + } + return dist; //square distance because it is easier to work without the square root// + } + + }; + + template class FaceHeatFlux + { + public: + KRATOS_CLASS_POINTER_DEFINITION(FaceHeatFlux); + + + void FaceHeatFluxDistribution(ModelPart & rLagrangianModelPart, double x, double y, double z, double radius, double face_heat_flux) + { + KRATOS_TRY + + //defintions for spatial search + typedef Node < 3 > PointType; + typedef Node < 3 > ::Pointer PointTypePointer; + typedef std::vector PointVector; + typedef std::vector::iterator PointIterator; + typedef std::vector DistanceVector; + typedef std::vector::iterator DistanceIterator; + + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; + + // ************* + // Bucket types + typedef Bucket< TDim, PointType, PointVector, PointTypePointer, PointIterator, DistanceIterator > BucketType; + + typedef Tree< KDTreePartition > tree; //Kdtree; + + + //starting calculating time of construction of the kdtree + boost::timer kdtree_construction; + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + PointTypePointer pnode = *(node_it.base()); + + //putting the nodes of the destination_model part in an auxiliary list + list_of_nodes.push_back(pnode); + } + + std::cout << "kdt constructin time " << kdtree_construction.elapsed() << std::endl; + + //create a spatial database with the list of new nodes + unsigned int bucket_size = 20; + tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); + + //work arrays + Node < 3 > work_point(0, 0.0, 0.0, 0.0); + unsigned int MaximumNumberOfResults = 10000; + PointVector Results(MaximumNumberOfResults); + DistanceVector SquaredResultsDistances(MaximumNumberOfResults); + + + //if (rEulerianModelPart.NodesBegin()->SolutionStepsDataHas(NODAL_H) == false) + // KRATOS_THROW_ERROR(std::logic_error, "Add ----NODAL_H---- variable!!!!!! ERROR", ""); + + double sigma = 0.0; + if (TDim == 2) + sigma = 10.0 / (7.0 * 3.1415926); + else + sigma = 1.0 / 3.1415926; + + work_point.X() = x; + work_point.Y() = y; + work_point.Z() = z; + + //double radius = 1.5 * node_it->FastGetSolutionStepValue(NODAL_H); + + //find all of the new nodes within the radius + int number_of_points_in_radius; + + //look between the new nodes which of them is inside the radius of the circumscribed cyrcle + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(), SquaredResultsDistances.begin(), MaximumNumberOfResults); + + if (number_of_points_in_radius > 0) + { + + //double& temperature = (node_it)->FastGetSolutionStepValue(TEMPERATURE); + + //double temperature_aux = 0.0; + + //double tot_weight = 0.0; + double maximunweight = SPHCubicKernel(sigma, 0.0, radius); + for (int k = 0; k < number_of_points_in_radius; k++) + { + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + + double weight = SPHCubicKernel(sigma, distance, radius); + + PointIterator it_found = Results.begin() + k; + + if((*it_found)->FastGetSolutionStepValue(IS_FREE_SURFACE)==1) //MATERIAL_VARIABLE + { + + double& aux= (*it_found)->FastGetSolutionStepValue(FACE_HEAT_FLUX); + aux = face_heat_flux * weight / maximunweight; + } + } + } + KRATOS_CATCH("") + } + + + void FlameDistribution(ModelPart & rLagrangianModelPart, double limit) + { + KRATOS_TRY + + //defintions for spatial search + double volume0, volume1, rho; + double volume_total=0, volume_total1=0; double arrehnius0=0.0; double arrhenius1=0.0; + double sum_of_ARR=0.0; double sum_of_ARRpartial=0.0; double heat_of_combustion=0.0; double face_heat_flux=0.0; + + double density=0.0; + double activation_energy=0.0; + double arrhenius_coefficient=0.0; + double heat_of_vaporization=0.0; + double temperature=0.0; + double R=8.31; //universal gas constant + double aux_var_polymer=0.0; + + + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); + node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + + if(node_it->X()<0.0072) + { + volume0 = node_it->FastGetSolutionStepValue(RADIATIVE_INTENSITY,0); + volume1 = node_it->FastGetSolutionStepValue(RADIATIVE_INTENSITY,1); + rho = node_it->FastGetSolutionStepValue(DENSITY); + volume_total = volume_total + volume0 ; + volume_total1 = volume_total1 + volume1 ; + if( node_it->FastGetSolutionStepValue(DENSITY)FastGetSolutionStepValue(ARRHENIUS_VALUE,0); + arrhenius1 = node_it->FastGetSolutionStepValue(ARRHENIUS_VALUE,1); + sum_of_ARR = sum_of_ARR + arrehnius0; + sum_of_ARRpartial = sum_of_ARRpartial + arrhenius1; + } + } + } + heat_of_combustion=abs(sum_of_ARR-sum_of_ARRpartial); + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin(); node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + if( node_it->FastGetSolutionStepValue(IS_FREE_SURFACE)==1) + + { + + if(node_it->Y()>=0.11478 && node_it->Y()<0.55) + { + double aux=pow( (0.43522-(node_it->Y() - 0.11478))/0.43522,8); + face_heat_flux= 150000.0 * aux;// + heat_of_combustion * pow(abs((0.5555-node_it->Y())/0.555),3); + //node_it->FastGetSolutionStepValue(FACE_HEAT_FLUX)=face_heat_flux; + + if(node_it->Y()>=0.3037) + { + double aux=pow( (0.43522-(0.3037 - 0.11478))/0.43522,8); + face_heat_flux= 150000.0 * aux;// + heat_of_combustion * pow(abs((0.5555-node_it->Y())/0.555),3); + + } + node_it->FastGetSolutionStepValue(FACE_HEAT_FLUX)=face_heat_flux; + + + + } + + else + { + node_it->FastGetSolutionStepValue(FACE_HEAT_FLUX)=50000.0; + + } + + + } + } + + + + + + + + KRATOS_CATCH("") + } + + + private: + + inline double SPHCubicKernel(const double sigma, const double r, const double hmax) + { + double h_half = 0.5 * hmax; + const double s = r / h_half; + const double coeff = sigma / pow(h_half, static_cast(TDim)); + + if (s <= 1.0) + return coeff * (1.0 - 1.5 * s * s + 0.75 * s * s * s); + else if (s <= 2.0) + return 0.25 * coeff * pow(2.0 - s, 3); + else + return 0.0; + } + + + + }; + +} // namespace Kratos. + +#endif // KRATOS_LAGRANGIAN_PARTICLES_UTILITIES_INCLUDED defined + + diff --git a/applications/PfemMeltingApplication/custom_utilities/heat_source.h b/applications/PfemMeltingApplication/custom_utilities/heat_source.h new file mode 100644 index 000000000000..56ad15235e9a --- /dev/null +++ b/applications/PfemMeltingApplication/custom_utilities/heat_source.h @@ -0,0 +1,108 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_PARTICLE_UTILITY_INCLUDED ) +#define KRATOS_PARTICLE_UTILITY_INCLUDED + +// System includes +#include +#include +#include + +// External includes + + +// Project includes +#include "includes/define.h" +#include "includes/model_part.h" +#include "includes/node.h" +#include "utilities/geometry_utilities.h" +#include "geometries/tetrahedra_3d_4.h" +#include "pfem_melting_application.h" +#include "spatial_containers/spatial_containers.h" +#include "utilities/timer.h" +#include "processes/node_erase_process.h" +#include "utilities/binbased_fast_point_locator.h" +#include "includes/deprecated_variables.h" + +#include +#include "utilities/timer.h" + +#ifdef _OPENMP +#include "omp.h" +#endif + +namespace Kratos +{ + + + template class HeatSource + { + public: + KRATOS_CLASS_POINTER_DEFINITION(HeatSource); + + + void Heat_Source(ModelPart & rLagrangianModelPart) + { + KRATOS_TRY + + double density=0.0; + double activation_energy=0.0; + double arrhenius_coefficient=0.0; + double heat_of_vaporization=0.0; + double temperature=0.0; + double R=8.31; //universal gas constant + double aux_var_polymer=0.0; + + for (ModelPart::NodesContainerType::iterator node_it = rLagrangianModelPart.NodesBegin();node_it != rLagrangianModelPart.NodesEnd(); ++node_it) + { + node_it->FastGetSolutionStepValue(HEAT_FLUX) = 0.0; + + density= node_it->FastGetSolutionStepValue(DENSITY); + + activation_energy= node_it->FastGetSolutionStepValue(ACTIVATION_ENERGY); + + arrhenius_coefficient= node_it->FastGetSolutionStepValue(ARRHENIUS_COEFFICIENT); + + heat_of_vaporization= node_it->FastGetSolutionStepValue(HEAT_OF_VAPORIZATION); + + temperature= node_it->FastGetSolutionStepValue(TEMPERATURE); + + double E_over_R_polymer = activation_energy / R; + + if(temperature >800.0) temperature=800.0; + + aux_var_polymer= arrhenius_coefficient * exp(-E_over_R_polymer/temperature); + + + node_it->FastGetSolutionStepValue(HEAT_FLUX) = (-1.0) * density * heat_of_vaporization * aux_var_polymer; + + + } + + KRATOS_CATCH("") + } + + + + + }; + +} // namespace Kratos. + +#endif // KRATOS_LAGRANGIAN_PARTICLES_UTILITIES_INCLUDED defined + + diff --git a/applications/PfemMeltingApplication/custom_utilities/pfemmelting_apply_bc_process.h b/applications/PfemMeltingApplication/custom_utilities/pfemmelting_apply_bc_process.h new file mode 100755 index 000000000000..e5ba41621006 --- /dev/null +++ b/applications/PfemMeltingApplication/custom_utilities/pfemmelting_apply_bc_process.h @@ -0,0 +1,297 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + +#if !defined(KRATOS_PFEMMELTING_APPLY_BC_PROCESS_INCLUDED ) +#define KRATOS_PFEMMELTING_APPLY_BC_PROCESS_INCLUDED + + + +// System includes +#include +#include +#include + +// External includes + + +// Project includes +#include "includes/define.h" +#include "processes/process.h" +#include "includes/node.h" +#include "includes/element.h" +#include "includes/model_part.h" +//#include "custom_utilities/geometry_utilities2D.h" +//#include "custom_elements/updated_lagrangian_fluid.h" + + +namespace Kratos +{ + +///@name Kratos Globals +///@{ + +///@} +///@name Type Definitions +///@{ + + +///@} +///@name Enum's +///@{ + +///@} +///@name Functions +///@{ + +///@} +///@name Kratos Classes +///@{ + +/// Short class definition. +/** Detail class definition. + Update the PRESSURE_FORCE on the nodes + + +*/ + + class PfemMeltingApplyBCProcess + : public Process + { + public: + ///@name Type Definitions + ///@{ + + /// Pointer definition of PushStructureProcess + KRATOS_CLASS_POINTER_DEFINITION(PfemMeltingApplyBCProcess); + + ///@} + ///@name Life Cycle + ///@{ + + /// Default constructor. + PfemMeltingApplyBCProcess(ModelPart& model_part) + : mr_model_part(model_part) + { + } + + /// Destructor. + virtual ~PfemMeltingApplyBCProcess() + { + } + + + ///@} + ///@name Operators + ///@{ + + void operator()() + { + Execute(); + } + + + ///@} + ///@name Operations + ///@{ + + virtual void Execute() override + { + KRATOS_TRY + for(ModelPart::NodesContainerType::const_iterator in = mr_model_part.NodesBegin(); in!=mr_model_part.NodesEnd(); in++) + { + //marking wet nodes + /* if(in->FastGetSolutionStepValue(IS_STRUCTURE) ) + if( (in->GetValue(NEIGHBOUR_ELEMENTS)).size() != 0) + in->FastGetSolutionStepValue(IS_FLUID) = 1.0; + else //it is not anymore of fluid + in->FastGetSolutionStepValue(IS_FLUID) = 0.0; + //marking as free surface the lonely nodes + else + */ if( (in->GetValue(NEIGHBOUR_ELEMENTS)).size() == 0) + in->FastGetSolutionStepValue(IS_BOUNDARY) = 1.0; + } + + //identify the free surface + for(ModelPart::NodeIterator i = mr_model_part.NodesBegin() ; + i != mr_model_part.NodesEnd() ; ++i) + { + //reset the free surface + i->FastGetSolutionStepValue(IS_FREE_SURFACE) = 0; + //identify the free surface and fix the pressure accordingly + if( i->FastGetSolutionStepValue(IS_BOUNDARY) != 0 + && + i->FastGetSolutionStepValue(IS_STRUCTURE) == 0) + { + i->FastGetSolutionStepValue(IS_FREE_SURFACE) = 1; + } + } + + + KRATOS_CATCH("") + } + + + ///@} + ///@name Access + ///@{ + + + ///@} + ///@name Inquiry + ///@{ + + + ///@} + ///@name Input and output + ///@{ + + /// Turn back information as a string. + virtual std::string Info() const override + { + return "PfemMeltingApplyBCProcess"; + } + + /// Print information about this object. + virtual void PrintInfo(std::ostream& rOStream) const override + { + rOStream << "PfemMeltingApplyBCProcess"; + } + + /// Print object's data. + virtual void PrintData(std::ostream& rOStream) const override + { + } + + + ///@} + ///@name Friends + ///@{ + + + ///@} + + protected: + ///@name Protected static Member Variables + ///@{ + + + ///@} + ///@name Protected member Variables + ///@{ + + + ///@} + ///@name Protected Operators + ///@{ + + + ///@} + ///@name Protected Operations + ///@{ + + + ///@} + ///@name Protected Access + ///@{ + + + ///@} + ///@name Protected Inquiry + ///@{ + + + ///@} + ///@name Protected LifeCycle + ///@{ + + + ///@} + + private: + ///@name Static Member Variables + ///@{ + + + ///@} + ///@name Member Variables + ///@{ + ModelPart& mr_model_part; + + ///@} + ///@name Private Operators + ///@{ + + + ///@} + ///@name Private Operations + ///@{ + + + ///@} + ///@name Private Access + ///@{ + + + ///@} + ///@name Private Inquiry + ///@{ + + + ///@} + ///@name Un accessible methods + ///@{ + + /// Assignment operator. + // PfemMelingApplyBCProcess& operator=(UlfApplyBCProcess const& rOther); + + /// Copy constructor. + // PfemMelingApplyBCProcess(UlfApplyBCProcess const& rOther); + + + ///@} + +}; // Class PfemMelingApplyBCProcess + +///@} + +///@name Type Definitions +///@{ + + +///@} +///@name Input and output +///@{ + + +/// input stream function + inline std::istream& operator >> (std::istream& rIStream, + PfemMeltingApplyBCProcess& rThis); + + /// output stream function + inline std::ostream& operator << (std::ostream& rOStream, + const PfemMeltingApplyBCProcess& rThis) + { + rThis.PrintInfo(rOStream); + rOStream << std::endl; + rThis.PrintData(rOStream); + + return rOStream; + } + ///@} + + +} // namespace Kratos. + +#endif // KRATOS_PFEMMELTING_APPLY_BC_PROCESS_INCLUDED defined diff --git a/applications/PfemMeltingApplication/custom_utilities/streamline.h b/applications/PfemMeltingApplication/custom_utilities/streamline.h new file mode 100644 index 000000000000..134d2ad710ff --- /dev/null +++ b/applications/PfemMeltingApplication/custom_utilities/streamline.h @@ -0,0 +1,1008 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_PARTICLES2M_UTILITIES_INCLUDED ) +#define KRATOS_PARTICLES2M_UTILITIES_INCLUDED + +//#define PRESSURE_ON_EULERIAN_MESH +//#define USE_FEW_PARTICLES + +// System includes +#include +#include +#include + +// External includes + + +// Project includes +#include "includes/define.h" +#include "includes/model_part.h" +#include "includes/node.h" +#include "includes/kratos_flags.h" +#include "utilities/geometry_utilities.h" +#include "geometries/tetrahedra_3d_4.h" +#include "pfem_melting_application.h" +#include "spatial_containers/spatial_containers.h" +#include "utilities/timer.h" +#include "processes/node_erase_process.h" +#include "utilities/binbased_fast_point_locator.h" +#include "includes/deprecated_variables.h" +#include "utilities/variable_utils.h" +//#include "utilities/enrichment_utilities.h" +//# +#include +#include "utilities/timer.h" + +#ifdef _OPENMP +#include "omp.h" +#endif + +#define pi 3.14159265 + +namespace Kratos +{ + + template class Streamline + { + public: + KRATOS_CLASS_POINTER_DEFINITION(Streamline); + + + + void SubSteppingElementbasedSI(ModelPart& rModelPart, unsigned int substeps) + { + double deltadt = rModelPart.GetProcessInfo()[DELTA_TIME]; + double dt=1.0 * deltadt; + + BinBasedFastPointLocator SearchStructure(rModelPart); + SearchStructure.UpdateSearchDatabase(); + + //do movement + array_1d veulerian; + //double temperature=0.0; + array_1d acc_particle; + array_1d N; + const int max_results = 10000; + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + + const int nparticles = rModelPart.Nodes().size(); + + #pragma omp parallel for firstprivate(results,N,veulerian,acc_particle) + for (int i = 0; i < nparticles; i++) + { + //int substep = 0; + int subdivisions = 10; + //double temperature=0.0; + ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; + Node < 3 > ::Pointer pparticle = *(iparticle.base()); + + bool do_move = true; + //bool first_time=false; + //iparticle->FastGetSolutionStepValue(DISTANCE)=0.0; + + //iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY) = iparticle->FastGetSolutionStepValue(VELOCITY); //AUX_VEL + + if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 1.0) do_move = false; + + if( do_move == true ) //note that we suppose the velocity components to be all fixed + { + array_1d old_position = pparticle->Coordinates(); + array_1d current_position = pparticle->Coordinates(); + noalias(iparticle->GetInitialPosition()) = old_position; + iparticle->FastGetSolutionStepValue(DISPLACEMENT,1) = ZeroVector(3); + const double small_dt = dt / subdivisions; + //iparticle->FastGetSolutionStepValue(DISTANCE)=small_dt; + // + for (int substep = 0; substep < subdivisions; substep++) + { + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + Element::Pointer pelement; + bool is_found = SearchStructure.FindPointOnMesh(current_position, N, pelement, result_begin, max_results); + iparticle->Set(TO_ERASE, true); + //KRATOS_WATCH(is_found); + is_found = false; + if (is_found == true) + { + Geometry< Node < 3 > >& geom = pelement->GetGeometry(); + //int nn=0; + noalias(veulerian) = ZeroVector(3); + //noalias(acc_particle) = ZeroVector(3); + for (unsigned int k = 0; k < geom.size(); k++) + { + noalias(veulerian) += N[k] * geom[k].FastGetSolutionStepValue(VELOCITY); + } + + + noalias(current_position) += small_dt*veulerian; + + pparticle->Set(TO_ERASE, false); + + //iparticle->FastGetSolutionStepValue(EMBEDDED_VELOCITY)=veulerian; + } //if (is_found == true) + else + { + //double time1=iparticle->FastGetSolutionStepValue(DISTANCE); + /*array_1d acc; + acc[0] = 0.0; + acc[1] = -10.0; + acc[2] = 0.0;*/ + + noalias(current_position) += small_dt * iparticle->FastGetSolutionStepValue(VELOCITY); + pparticle->Set(TO_ERASE, false); + iparticle->FastGetSolutionStepValue(IS_INTERFACE) = 1.0; + }//else + }//for + + iparticle->FastGetSolutionStepValue(DISPLACEMENT) = current_position - iparticle->GetInitialPosition(); + }//for + } + for(ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it!=rModelPart.NodesEnd(); it++) + { + array_1d& dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); + noalias(it->Coordinates()) = it->GetInitialPosition(); + noalias(it->Coordinates()) += dn1; + } + } + +void RungeKutta4ElementbasedSI(ModelPart& rModelPart, unsigned int substeps) + { + double dt = rModelPart.GetProcessInfo()[DELTA_TIME]; + dt *=0.5; + BinBasedFastPointLocator SearchStructure(rModelPart); + SearchStructure.UpdateSearchDatabase(); + + //do movement + array_1d veulerian; + //double temperature=0.0; + //array_1d acc_particle; + + array_1d v1,v2,v3,v4,vtot,x; + + array_1d N; + + const int max_results = 10000; + + typename BinBasedFastPointLocator::ResultContainerType results(max_results); + + const int nparticles = rModelPart.Nodes().size(); + + #pragma omp parallel for firstprivate(results,N,veulerian,v1,v2,v3,v4,x) + + for (int i = 0; i < nparticles; i++) + { + + + array_1d current_position; + + array_1d initial_position; + + //bool is_found=false; + bool is_found1=false; + bool is_found2=false; + bool is_found3=false; + bool is_found4=false; + + + typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + + ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; + + + Node < 3 > ::Pointer pparticle = *(iparticle.base()); + +if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 0.0) { + initial_position = pparticle->GetInitialPosition() + pparticle->FastGetSolutionStepValue(DISPLACEMENT); + + Element::Pointer pelement; + + //STEP1 + //noalias(current_position) = initial_position; + + is_found1 = SearchStructure.FindPointOnMesh(initial_position, N, pelement, result_begin, max_results); + + if(is_found1==true) + { + Geometry< Node < 3 > >& geom = pelement->GetGeometry(); + noalias(v1) = N[0] * ( geom[0].FastGetSolutionStepValue(VELOCITY)); + for (unsigned int k = 1; k < geom.size(); k++) + noalias(v1) += N[k] * ( geom[k].FastGetSolutionStepValue(VELOCITY) ); + } + else { + noalias(v1) = pparticle->FastGetSolutionStepValue(VELOCITY); + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + //STEP2 + noalias(x) = initial_position + 0.5 * dt * v1; + is_found2 = SearchStructure.FindPointOnMesh(x, N, pelement, result_begin, max_results); + + if(is_found2==true) + { + Geometry< Node < 3 > >& geom = pelement->GetGeometry(); + noalias(v2) = N[0] * ( geom[0].FastGetSolutionStepValue(VELOCITY)); + for (unsigned int k = 1; k < geom.size(); k++) + noalias(v2) += N[k] * ( geom[k].FastGetSolutionStepValue(VELOCITY) ); + } + else { + noalias(v2) = pparticle->FastGetSolutionStepValue(VELOCITY); + } + + //STEP3 + noalias(x) = initial_position + 0.5 * dt * v2; + is_found3 = SearchStructure.FindPointOnMesh(x, N, pelement, result_begin, max_results); + + if(is_found3==true) + { + Geometry< Node < 3 > >& geom = pelement->GetGeometry(); + noalias(v3) = N[0] * ( geom[0].FastGetSolutionStepValue(VELOCITY)); + for (unsigned int k = 1; k < geom.size(); k++) + noalias(v3) += N[k] * ( geom[k].FastGetSolutionStepValue(VELOCITY) ); + } + else { + noalias(v3) = pparticle->FastGetSolutionStepValue(VELOCITY); + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + //STEP4 + + noalias(x) = initial_position + dt * v3; + is_found4 = SearchStructure.FindPointOnMesh(x, N, pelement, result_begin, max_results); + if(is_found4==true) + { + Geometry< Node < 3 > >& geom = pelement->GetGeometry(); + noalias(v4) = N[0] * ( geom[0].FastGetSolutionStepValue(VELOCITY)); + for (unsigned int k = 1; k < geom.size(); k++) + noalias(v4) += N[k] * ( geom[k].FastGetSolutionStepValue(VELOCITY) ); + } + else { + noalias(v4) = pparticle->FastGetSolutionStepValue(VELOCITY); + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + +} + + if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 0.0) + { + + //is_found1=false; + if(is_found1==true) + if(is_found2==true) + if(is_found3==true) + if(is_found4==true) + { + noalias(x) = initial_position; + noalias(x) += 0.16666666666666666666667*dt*v1; + noalias(x) += 0.33333333333333333333333*dt*v2; + noalias(x) += 0.33333333333333333333333*dt*v3; + noalias(x) += 0.16666666666666666666667*dt*v4; + pparticle->FastGetSolutionStepValue(DISPLACEMENT) = x - pparticle->GetInitialPosition(); + + } + if(is_found1==false || is_found2==false || is_found3==false || is_found4==false) + { + noalias(x) = initial_position; + noalias(x) += dt*pparticle->FastGetSolutionStepValue(VELOCITY); + pparticle->FastGetSolutionStepValue(DISPLACEMENT) = x - pparticle->GetInitialPosition(); + } + + +} + + + }//particles + + + + for(ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it!=rModelPart.NodesEnd(); it++) + { + array_1d& dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); + noalias(it->Coordinates()) = it->GetInitialPosition(); + noalias(it->Coordinates()) += dn1; + + } + + +} + + + +void RungeKutta4KernelbasedSI(ModelPart& rModelPart, unsigned int substeps) + { + double dt = rModelPart.GetProcessInfo()[DELTA_TIME]; + dt *=0.5; + //dt *=1.0; + BinBasedFastPointLocator SearchStructure(rModelPart); + SearchStructure.UpdateSearchDatabase(); + + //do movement + array_1d veulerian; + //double temperature=0.0; + //array_1d acc_particle; + + array_1d v1,v2,v3,v4,vtot,x; + + + const int nparticles = rModelPart.Nodes().size(); + + + //new code! + typedef Node < 3 > PointType; + typedef Node < 3 > ::Pointer PointTypePointer; + typedef std::vector PointVector; + typedef std::vector::iterator PointIterator; + typedef std::vector DistanceVector; + typedef std::vector::iterator DistanceIterator; + //creating an auxiliary list for the new nodes + PointVector list_of_nodes; + typedef Bucket< TDim, PointType, PointVector, PointTypePointer, PointIterator, DistanceIterator > BucketType; + typedef Tree< KDTreePartition > tree; //Kdtree; + + + + + for (ModelPart::NodesContainerType::iterator node_it = rModelPart.NodesBegin(); + node_it != rModelPart.NodesEnd(); ++node_it) + { + PointTypePointer pnode = *(node_it.base()); + + //putting the nodes of the destination_model part in an auxiliary list + list_of_nodes.push_back(pnode); + } + + //create a spatial database with the list of new nodes + unsigned int bucket_size = 20; + tree nodes_tree(list_of_nodes.begin(), list_of_nodes.end(), bucket_size); + + + + //#pragma omp parallel for firstprivate(results,N,veulerian,v1,v2,v3,v4,x) + #pragma omp parallel for firstprivate(v1,v2,v3,v4,x) + for (int i = 0; i < nparticles; i++) + { + + + array_1d current_position; + + array_1d initial_position; + + //bool is_found=false; + bool is_found1=false; + bool is_found2=false; + bool is_found3=false; + bool is_found4=false; + + + double sigma = 0.0; + if (TDim == 2) + sigma = 10.0 / (7.0 * 3.1415926); + else + sigma = 1.0 / 3.1415926; + + + + unsigned int MaximumNumberOfResults = 10000; + PointVector Results(MaximumNumberOfResults); + DistanceVector SquaredResultsDistances(MaximumNumberOfResults); + + + + //typename BinBasedFastPointLocator::ResultIteratorType result_begin = results.begin(); + + ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; + + double radius = 1.5 * iparticle->FastGetSolutionStepValue(NODAL_H); + + + Node < 3 > ::Pointer pparticle = *(iparticle.base()); + + if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 0.0/*iparticle->FastGetSolutionStepValue(IS_INTERFACE) == 0.0 or iparticle->FastGetSolutionStepValue(IS_INTERFACE) == 1.0*/) { + initial_position = pparticle->GetInitialPosition() + pparticle->FastGetSolutionStepValue(DISPLACEMENT); + + Element::Pointer pelement; + + Node < 3 > work_point(0, 0.0, 0.0, 0.0); + + work_point.X() = initial_position(0); + work_point.Y() = initial_position(1); + work_point.Z() = initial_position(2); + + + int number_of_points_in_radius; + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(),SquaredResultsDistances.begin(), MaximumNumberOfResults); + + if (number_of_points_in_radius > 0) + { + is_found1=true; + double tot_weight = 0.0; + noalias(v1)=ZeroVector(3); + + for (int k = 0; k < number_of_points_in_radius; k++) + { + + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + + tot_weight += weight; + + PointIterator it_found = Results.begin() + k; + + v1 += weight * (*it_found)->FastGetSolutionStepValue(VELOCITY); + + } + v1 /= tot_weight; + + } + else { + + noalias(v1) = pparticle->FastGetSolutionStepValue(VELOCITY); + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + //STEP2 + noalias(x) = initial_position + 0.5 * dt * v1; + + + work_point.X() = x(0); + work_point.Y() = x(1); + work_point.Z() = x(2); + + + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(),SquaredResultsDistances.begin(), MaximumNumberOfResults); + + if (number_of_points_in_radius > 0) + { + is_found2=true; + double tot_weight = 0.0; + noalias(v2)=ZeroVector(3); + + for (int k = 0; k < number_of_points_in_radius; k++) + { + + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + + tot_weight += weight; + + PointIterator it_found = Results.begin() + k; + + v2 += weight * (*it_found)->FastGetSolutionStepValue(VELOCITY); + + } + v2 /= tot_weight; + + } + else { + + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + noalias(v2) = pparticle->FastGetSolutionStepValue(VELOCITY); + } + + //STEP3 + noalias(x) = initial_position + 0.5 * dt * v2; + + work_point.X() = x(0); + work_point.Y() = x(1); + work_point.Z() = x(2); + + + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(),SquaredResultsDistances.begin(), MaximumNumberOfResults); + + + //is_found2 = SearchStructure.FindPointOnMesh(x, N, pelement, result_begin, max_results); + + if (number_of_points_in_radius > 0) + { + double tot_weight = 0.0; + noalias(v3)=ZeroVector(3); + is_found3 = true; + for (int k = 0; k < number_of_points_in_radius; k++) + { + + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + + tot_weight += weight; + + PointIterator it_found = Results.begin() + k; + + v3 += weight * (*it_found)->FastGetSolutionStepValue(VELOCITY); + + } + v3 /= tot_weight; + + } + + else { + noalias(v3) = pparticle->FastGetSolutionStepValue(VELOCITY); + } + //STEP4 + + noalias(x) = initial_position + dt * v3; + + work_point.X() = x(0); + work_point.Y() = x(1); + work_point.Z() = x(2); + + number_of_points_in_radius = nodes_tree.SearchInRadius(work_point, radius, Results.begin(),SquaredResultsDistances.begin(), MaximumNumberOfResults); + + + if (number_of_points_in_radius > 0) + { + is_found4 =true; + double tot_weight = 0.0; + noalias(v4)=ZeroVector(3); + + for (int k = 0; k < number_of_points_in_radius; k++) + { + + double distance = sqrt(*(SquaredResultsDistances.begin() + k)); + double weight = SPHCubicKernel(sigma, distance, radius); + + tot_weight += weight; + + PointIterator it_found = Results.begin() + k; + + v4 += weight * (*it_found)->FastGetSolutionStepValue(VELOCITY); + + } + v4 /= tot_weight; + + } + else { + noalias(v4) = pparticle->FastGetSolutionStepValue(VELOCITY); + } + + } + + if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 0.0/*iparticle->FastGetSolutionStepValue(IS_INTERFACE) == 0.0 or iparticle->FastGetSolutionStepValue(IS_INTERFACE) == 1.0 */) + { + + + if(is_found1==true) + if(is_found2==true) + if(is_found3==true) + if(is_found4==true) + { + + noalias(x) = initial_position; + noalias(x) += 0.16666666666666666666667*dt*v1; + noalias(x) += 0.33333333333333333333333*dt*v2; + noalias(x) += 0.33333333333333333333333*dt*v3; + noalias(x) += 0.16666666666666666666667*dt*v4; + pparticle->FastGetSolutionStepValue(DISPLACEMENT) = x - pparticle->GetInitialPosition(); + + } + if(is_found1==false || is_found2==false || is_found3==false || is_found4==false) + { + noalias(x) = initial_position; + noalias(x) += dt*pparticle->FastGetSolutionStepValue(VELOCITY); + pparticle->FastGetSolutionStepValue(DISPLACEMENT) = x - pparticle->GetInitialPosition(); + } + + + } + + //do_move + + }//particles + + for(ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it!=rModelPart.NodesEnd(); it++) + { + array_1d& dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); + noalias(it->Coordinates()) = it->GetInitialPosition(); + noalias(it->Coordinates()) += dn1; + + } +} + +void MovingParticles(ModelPart& rModelPart, unsigned int substeps) + { + double dt = rModelPart.GetProcessInfo()[DELTA_TIME]; + dt *=0.5; + BinBasedFastPointLocator SearchStructure(rModelPart); + SearchStructure.UpdateSearchDatabase(); + + //do movement + array_1d veulerian; + //double temperature=0.0; + //array_1d acc_particle; + + array_1d v1,v2,v3,v4,vtot,x; + + //array_1d N; + + const int max_results = 10000; + + //typename BinBasedFastPointLocator::ResultContainerType results(max_results); + + const int nparticles = rModelPart.Nodes().size(); + + //#pragma omp parallel for firstprivate(results,N,veulerian,v1,v2,v3,v4,x) + #pragma omp parallel for firstprivate(veulerian,v1,v2,v3,v4,x) + for (int i = 0; i < nparticles; i++) + { + array_1d initial_position; + + ModelPart::NodesContainerType::iterator iparticle = rModelPart.NodesBegin() + i; + + Node < 3 > ::Pointer pparticle = *(iparticle.base()); + + if(iparticle->FastGetSolutionStepValue(IS_STRUCTURE) == 0.0) { + initial_position = pparticle->GetInitialPosition() + pparticle->FastGetSolutionStepValue(DISPLACEMENT); + + noalias(x) = initial_position; + noalias(x) += dt*pparticle->FastGetSolutionStepValue(VELOCITY); + pparticle->FastGetSolutionStepValue(DISPLACEMENT) = x - pparticle->GetInitialPosition(); + } + + + } + + + for(ModelPart::NodesContainerType::iterator it = rModelPart.NodesBegin(); it!=rModelPart.NodesEnd(); it++) + { + array_1d& dn1 = it->FastGetSolutionStepValue(DISPLACEMENT); + noalias(it->Coordinates()) = it->GetInitialPosition(); + noalias(it->Coordinates()) += dn1; + + } + + +} + + + bool CheckInvertElement(ModelPart& ThisModelPart, int domain_size, double mesh_element_size) + { + KRATOS_TRY + + //set to zero the nodal area + bool inverted=false; + double vol=0.0; + array_1d N; + double dt = ThisModelPart.GetProcessInfo()[DELTA_TIME]; + //defining work arrays + //PointerVector< Element > elements_to_solve; + std::vector> nodal_neighbours; + //elements_to_solve.reserve(ThisModelPart.Elements().size()); + + VariableUtils().SetFlag(TO_ERASE, false, ThisModelPart.Elements()); + + VariableUtils().SetFlag(TO_ERASE, false, ThisModelPart.Nodes()); + //VariableUtils().SetFlag(INTERFACE, 0, ThisModelPart.Nodes()); + //rDestinationModelPart.RemoveNodesFromAllLevels(TO_ERASE); + //rDestinationModelPart.RemoveElementsFromAllLevels(TO_ERASE); + + if(domain_size == 2) + { + KRATOS_ERROR<<"error: this part is emptyyyy"; + } + else + { + + //reference volumen + double vol_r=sqrt(2)* pow(mesh_element_size, 3) /12.0; + for(ModelPart::NodesContainerType::iterator in = ThisModelPart.NodesBegin(); + in!=ThisModelPart.NodesEnd(); in++) + { + in->FastGetSolutionStepValue(RADIATIVE_INTENSITY) = 0.00; + } + + bool erase_node=false; + for(ModelPart::ElementsContainerType::iterator i = ThisModelPart.ElementsBegin(); i!=ThisModelPart.ElementsEnd(); i++) + { + //calculating shape functions values + Geometry< Node<3> >& geom = i->GetGeometry(); + + + //counting number of structural nodes + vol = GeometryUtils::CalculateVolume3D(geom); + +// if(vol <= 0 or vol<= 0.00000000000001) + //if(vol <= 0 or vol<= 0.0001*vol_r) + //if(vol <= 0 or vol<= 0.001*vol_r) + + ///// + + //erase_node=false; + //for (unsigned int k = 0; k < geom.size(); k++) + //{ + //array_1d delta_disp = geom[k].FastGetSolutionStepValue(DISPLACEMENT); + //noalias(delta_disp) -= geom[k].FastGetSolutionStepValue(DISPLACEMENT,1); + + //double norm_delta_disp = norm_2(delta_disp); + + //array_1d v_old = geom[k].FastGetSolutionStepValue(VELOCITY,1); + //double norm_v = norm_2(v_old); + + //if(norm_delta_disp*3.0 < norm_v*dt ) erase_node=true; + //if(norm_delta_disp* (0.333333333333333*0.001) > norm_v*dt ) erase_node=true; + //if(norm_v >1.5) erase_node=true; + //} + + + + ///// + if(vol<= 0.01*vol_r or vol> 2.5*vol_r )//or erase_node==true) //0.001 + + { + inverted=true; + + i->Set(TO_ERASE, true); + + geom[0].FastGetSolutionStepValue(RADIATIVE_INTENSITY)=1.0; + geom[1].FastGetSolutionStepValue(RADIATIVE_INTENSITY)=1.0; + geom[2].FastGetSolutionStepValue(RADIATIVE_INTENSITY)=1.0; + geom[3].FastGetSolutionStepValue(RADIATIVE_INTENSITY)=1.0; + + auto& r_nodes_current_element = i->GetGeometry(); + + auto& pNode0 = r_nodes_current_element[0]; + auto& pNode1 = r_nodes_current_element[1]; + auto& pNode2 = r_nodes_current_element[2]; + auto& pNode3 = r_nodes_current_element[3]; + + // Neighbour elements of each node of the current element + GlobalPointersVector& r_neigh_node_0 = pNode0.GetValue(NEIGHBOUR_ELEMENTS); + GlobalPointersVector& r_neigh_node_1 = pNode1.GetValue(NEIGHBOUR_ELEMENTS); + GlobalPointersVector& r_neigh_node_2 = pNode2.GetValue(NEIGHBOUR_ELEMENTS); + GlobalPointersVector& r_neigh_node_3 = pNode3.GetValue(NEIGHBOUR_ELEMENTS); + + + nodal_neighbours.push_back(r_neigh_node_0); + nodal_neighbours.push_back(r_neigh_node_1); + nodal_neighbours.push_back(r_neigh_node_2); + nodal_neighbours.push_back(r_neigh_node_3); + + bool is_inside_0 = false; + bool is_inside_1 = false; + bool is_inside_2 = false; + bool is_inside_3 = false; + bool all_neigh_0 =false; + bool all_neigh_1 =false; + bool all_neigh_2 =false; + bool all_neigh_3 =false; + + //first node + for (unsigned int neigh_elem = 0; neigh_elem < nodal_neighbours.size(); neigh_elem++) { //loop for nodes + // Nodes of the neigh element + for (unsigned int elem = 0; elem < nodal_neighbours[neigh_elem].size(); elem++) //loop for elements + { + Element& parent = nodal_neighbours[neigh_elem][elem]; + + /*auto& Node0 = parent.GetGeometry()[0]; + auto& Node1 = parent.GetGeometry()[1]; + auto& Node2 = parent.GetGeometry()[2]; + auto& Node3 = parent.GetGeometry()[3];*/ + is_inside_0 = false; + is_inside_1 = false; + is_inside_2 = false; + is_inside_3 = false; + + is_inside_0 = CalculatePosition(parent.GetGeometry(),pNode0[0],pNode0[1],pNode0[2],N); //observe if node is inside the neighbours! + is_inside_1 = CalculatePosition(parent.GetGeometry(),pNode1[0],pNode1[1],pNode1[2],N); + is_inside_2 = CalculatePosition(parent.GetGeometry(),pNode2[0],pNode2[1],pNode2[2],N); + is_inside_3 = CalculatePosition(parent.GetGeometry(),pNode3[0],pNode3[1],pNode3[2],N); + /*if(is_inside_0 == true) parent.Set(TO_ERASE, true); + if(is_inside_1 == true) parent.Set(TO_ERASE, true); + if(is_inside_2 == true) parent.Set(TO_ERASE, true); + if(is_inside_3 == true) parent.Set(TO_ERASE, true);*/ + + if(is_inside_0 == true) {all_neigh_0=true; pNode0.Set(TO_ERASE, true);} + if(is_inside_1 == true) {all_neigh_1=true;pNode1.Set(TO_ERASE, true);} + if(is_inside_2 == true) {all_neigh_2=true;pNode2.Set(TO_ERASE, true);} + if(is_inside_3 == true) {all_neigh_3=true;pNode3.Set(TO_ERASE, true);} + + //KRATOS_WATCH("--------------------------->") + //KRATOS_WATCH("--------------------------->") + //KRATOS_WATCH("--------------------------->") + //KRATOS_WATCH("NODOSSSS PADRESSSSSSSSSSSSSSSSSSS") + //KRATOS_WATCH(pNode0) + //KRATOS_WATCH(pNode1) + //KRATOS_WATCH(pNode2) + //KRATOS_WATCH(pNode3) + //KRATOS_WATCH("ELEMENTOOOOOOOOOO VECINOOOOOOOOOOOO") + //KRATOS_WATCH(parent.GetGeometry()) + } + + } + if(all_neigh_0==true) + { + for (unsigned int elem = 0; elem < nodal_neighbours[0].size(); elem++) //loop for elements + { + Element& parent = nodal_neighbours[0][elem]; + parent.Set(TO_ERASE, true); + } + } + + if(all_neigh_1==true) + { + for (unsigned int elem = 0; elem < nodal_neighbours[1].size(); elem++) //loop for elements + { + Element& parent = nodal_neighbours[1][elem]; + parent.Set(TO_ERASE, true); + } + } + if(all_neigh_2==true) + { + for (unsigned int elem = 0; elem < nodal_neighbours[2].size(); elem++) //loop for elements + { + Element& parent = nodal_neighbours[2][elem]; + parent.Set(TO_ERASE, true); + } + } + if(all_neigh_3==true) + { + for (unsigned int elem = 0; elem < nodal_neighbours[3].size(); elem++) //loop for elements + { + Element& parent = nodal_neighbours[3][elem]; + parent.Set(TO_ERASE, true); + } + } + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + + + nodal_neighbours.clear(); + } + //KRATOS_THROW_ERROR(std::logic_error,"pressure calculation 3D not implemented",""); + } + } + + ThisModelPart.RemoveElementsFromAllLevels(TO_ERASE); + ThisModelPart.RemoveNodesFromAllLevels(TO_ERASE); + + + return inverted; + + KRATOS_CATCH("") + } + + + double CalculateVolume(ModelPart& ThisModelPart, int domain_size) + { + KRATOS_TRY + + //set to zero the nodal area + bool inverted=false; + double vol=0.0; + double totvol=0.0; + array_1d N; + + + if(domain_size == 2) + { + KRATOS_ERROR<<"error: this part is emptyyyy"; + } + else + { + + for(ModelPart::ElementsContainerType::iterator i = ThisModelPart.ElementsBegin(); + i!=ThisModelPart.ElementsEnd(); i++) + { + //calculating shape functions values + Geometry< Node<3> >& geom = i->GetGeometry(); + + //counting number of structural nodes + vol = GeometryUtils::CalculateVolume3D(geom); + totvol += vol; + } + } + + + + return totvol; + + KRATOS_CATCH("") + } + + + private: + inline double SPHCubicKernel(const double sigma, const double r, const double hmax) + { + + + double h_half = 0.5 * hmax; + const double s = r / h_half; + const double coeff = sigma / pow(h_half, static_cast(TDim)); + + if (s <= 1.0) + return coeff * (1.0 - 1.5 * s * s + 0.75 * s * s * s); + else if (s <= 2.0) + return 0.25 * coeff * pow(2.0 - s, 3); + else + return 0.0; + } + + inline bool CalculatePosition( + Geometry >&geom, + const double xc, + const double yc, + const double zc, + array_1d & N + ) + { + + const double x0 = geom[0].X(); + const double y0 = geom[0].Y(); + const double z0 = geom[0].Z(); + const double x1 = geom[1].X(); + const double y1 = geom[1].Y(); + const double z1 = geom[1].Z(); + const double x2 = geom[2].X(); + const double y2 = geom[2].Y(); + const double z2 = geom[2].Z(); + const double x3 = geom[3].X(); + const double y3 = geom[3].Y(); + const double z3 = geom[3].Z(); + + const double vol = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3); + + double inv_vol = 0.0; + if (vol < 0.0000000000001) + { + //The interpolated node will not be inside an elemente with zero area + return false; + } + else + { + inv_vol = 1.0 / vol; + } + + N[0] = CalculateVol(x1, y1, z1, x3, y3, z3, x2, y2, z2, xc, yc, zc) * inv_vol; + N[1] = CalculateVol(x0, y0, z0, x1, y1, z1, x2, y2, z2, xc, yc, zc) * inv_vol; + N[2] = CalculateVol(x3, y3, z3, x1, y1, z1, x0, y0, z0, xc, yc, zc) * inv_vol; + N[3] = CalculateVol(x3, y3, z3, x0, y0, z0, x2, y2, z2, xc, yc, zc) * inv_vol; + + + if (N[0] >= 0.0 && N[1] >= 0.0 && N[2] >= 0.0 && N[3] >= 0.0 && + N[0] <= 1.0 && N[1] <= 1.0 && N[2] <= 1.0 && N[3] <= 1.0) + //if the xc yc zc is inside the tetrahedron return true + return true; + + return false; + } + /** + * This method computes the volume of a tetrahedra + */ + inline double CalculateVol(const double x0, const double y0, const double z0, + const double x1, const double y1, const double z1, + const double x2, const double y2, const double z2, + const double x3, const double y3, const double z3 + ) + { + const double x10 = x1 - x0; + const double y10 = y1 - y0; + const double z10 = z1 - z0; + + const double x20 = x2 - x0; + const double y20 = y2 - y0; + const double z20 = z2 - z0; + + const double x30 = x3 - x0; + const double y30 = y3 - y0; + const double z30 = z3 - z0; + + const double detJ = x10 * y20 * z30 - x10 * y30 * z20 + y10 * z20 * x30 - y10 * x20 * z30 + z10 * x20 * y30 - z10 * y20 * x30; + return detJ * 0.1666666666666666666667; + } + + + +}; + +} // namespace Kratos. + +#endif // KRATOS_LAGRANGIAN_PARTICLES_UTILITIES_INCLUDED defined + + + diff --git a/applications/PfemMeltingApplication/pfem_melting_application.cpp b/applications/PfemMeltingApplication/pfem_melting_application.cpp new file mode 100644 index 000000000000..ec7f8ffc2611 --- /dev/null +++ b/applications/PfemMeltingApplication/pfem_melting_application.cpp @@ -0,0 +1,105 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +// System includes + +// External includes +// + +// Project includes +#include "includes/define.h" +#include "geometries/triangle_2d_3.h" +#include "geometries/triangle_3d_3.h" +#include "geometries/quadrilateral_2d_4.h" +#include "geometries/tetrahedra_3d_4.h" +#include "geometries/hexahedra_3d_8.h" +#include "geometries/hexahedra_3d_27.h" +#include "pfem_melting_application.h" +#include "includes/variables.h" + +namespace Kratos { + + + +KratosPfemMeltingApplication::KratosPfemMeltingApplication() + : KratosApplication("PfemMeltingApplication"), + + mLagrangianFluidVMS2D(0, Element::GeometryType::Pointer(new Triangle2D3 >(Element::GeometryType::PointsArrayType(3)))), + mLagrangianFluidVMS3D(0, Element::GeometryType::Pointer(new Tetrahedra3D4 >(Element::GeometryType::PointsArrayType(4)))), + //mHYPOELASTICSOLID2D (0, Element::GeometryType::Pointer(new Triangle2D3 >(Element::GeometryType::PointsArrayType(3)))), + //mHYPOELASTICSOLID3D(0, Element::GeometryType::Pointer(new Tetrahedra3D4 >(Element::GeometryType::PointsArrayType(4)))) + mHYPO2D (0, Element::GeometryType::Pointer(new Triangle2D3 >(Element::GeometryType::PointsArrayType(3)))), + mHYPO3D(0, Element::GeometryType::Pointer(new Tetrahedra3D4 >(Element::GeometryType::PointsArrayType(4)))) + {} + +void KratosPfemMeltingApplication::Register() { + KRATOS_INFO("") << + " KRATOS " << std::endl << + " _____ __ __ __ _ _ _ " << std::endl << + "| __ \\ / _| | \\/ | | | | (_) " << std::endl << + "| |__) | |_ ___ _ __ ___ | \\ / | ___| | |_ _ _ __ __ _ " << std::endl << + "| ___/| _/ _ \\ '_ ` _ \\| |\\/| |/ _ \\ | __| | '_ \\ / _` | " << std::endl << + "| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | " << std::endl << + "|_| |_| \\___|_| |_| |_|_| |_|\\___|_|\\__|_|_| |_|\\__, | " << std::endl << + " __/ | " << std::endl << + " |___/ APPLICATION " << std::endl; + + // Registering variables + KRATOS_REGISTER_VARIABLE(ACTIVATION_ENERGY) + KRATOS_REGISTER_VARIABLE(ARRHENIUS_COEFFICIENT) + KRATOS_REGISTER_VARIABLE(RADIOUS) + KRATOS_REGISTER_VARIABLE(HEAT_OF_VAPORIZATION) + KRATOS_REGISTER_VARIABLE(ARRHENIUS_VALUE) + + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_XX) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_XY) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_XZ) + + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_YX) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_YY) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_YZ) + + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_ZX) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_ZY) + KRATOS_REGISTER_VARIABLE(DELTA_SIGMA_ZZ) + + + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_XX) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_XY) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_XZ) + + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_YX) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_YY) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_YZ) + + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_ZX) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_ZY) + KRATOS_REGISTER_VARIABLE(HISTORICAL_SIGMA_ZZ) + + + KRATOS_REGISTER_3D_VARIABLE_WITH_COMPONENTS(INITIAL_POSITION) + + KRATOS_REGISTER_ELEMENT("LagrangianFluidVMS2D",mLagrangianFluidVMS2D); + KRATOS_REGISTER_ELEMENT("LagrangianFluidVMS3D",mLagrangianFluidVMS3D); + //KRATOS_REGISTER_ELEMENT("HYPOELASTICSOLID2D",mHYPOELASTICSOLID2D); + //KRATOS_REGISTER_ELEMENT("HYPOELASTICSOLID3D",mHYPOELASTICSOLID3D); + KRATOS_REGISTER_ELEMENT("HYPO2D",mHYPO2D); + KRATOS_REGISTER_ELEMENT("HYPO3D",mHYPO3D); + + +} + +} // namespace Kratos. diff --git a/applications/PfemMeltingApplication/pfem_melting_application.h b/applications/PfemMeltingApplication/pfem_melting_application.h new file mode 100644 index 000000000000..73cee4ff075e --- /dev/null +++ b/applications/PfemMeltingApplication/pfem_melting_application.h @@ -0,0 +1,264 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_KRATOS_PFEM_MELTING_APPLICATION_H_INCLUDED ) +#define KRATOS_KRATOS_PFEM_MELTING_APPLICATION_H_INCLUDED + + +// System includes +#include +#include + +// External includes + +// Project includes +#include "includes/define.h" +#include "includes/kratos_application.h" +#include "pfem_melting_application_variables.h" + +#include "includes/variables.h" +#include "includes/condition.h" + +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application.h" +#include "../applications/FluidDynamicsApplication/fluid_dynamics_application_variables.h" +#include "../applications/FluidDynamicsApplication/custom_elements/vms.h" + +#include "../applications/FluidDynamicsApplication/custom_constitutive/bingham_3d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/euler_2d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/euler_3d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/herschel_bulkley_3d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_2d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_3d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_two_fluid_2d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_two_fluid_3d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_temperature_dependent_2d_law.h" +#include "../applications/FluidDynamicsApplication/custom_constitutive/newtonian_temperature_dependent_3d_law.h" + +#include "custom_elements/lagrangian_vms.h" +//#include "custom_elements/HypoElasticSolid.h" +#include "custom_elements/hypo.h" +namespace Kratos +{ + +///@name Kratos Globals +///@{ + +///@} +///@name Type Definitions +///@{ + +///@} +///@name Enum's +///@{ + +///@} +///@name Functions +///@{ + +///@} +///@name Kratos Classes +///@{ + + +class KRATOS_API(PFEM_MELTING_APPLICATION) KratosPfemMeltingApplication : public KratosApplication +{ +public: + ///@name Type Definitions + ///@{ + + + /// Pointer definition of KratosConvectionDiffusionApplication + KRATOS_CLASS_POINTER_DEFINITION(KratosPfemMeltingApplication); + + ///@} + ///@name Life Cycle + ///@{ + + /// Default constructor. + KratosPfemMeltingApplication(); + + /// Destructor. + virtual ~KratosPfemMeltingApplication() {} + + + ///@} + ///@name Operators + ///@{ + + + ///@} + ///@name Operations + ///@{ + + void Register() override; + + + + ///@} + ///@name Access + ///@{ + + + ///@} + ///@name Inquiry + ///@{ + + + ///@} + ///@name Input and output + ///@{ + + /// Turn back information as a string. + std::string Info() const override + { + return "KratosPfemMeltingApplication"; + } + + /// Print information about this object. + void PrintInfo(std::ostream& rOStream) const override + { + rOStream << Info(); + PrintData(rOStream); + } + + ///// Print object's data. + void PrintData(std::ostream& rOStream) const override + { + KRATOS_WATCH("in KratosPfemMeltingApplication"); + KRATOS_WATCH(KratosComponents::GetComponents().size() ); + rOStream << "Variables:" << std::endl; + KratosComponents().PrintData(rOStream); + rOStream << std::endl; + rOStream << "Elements:" << std::endl; + KratosComponents().PrintData(rOStream); + rOStream << std::endl; + rOStream << "Conditions:" << std::endl; + KratosComponents().PrintData(rOStream); + } + + + ///@} + ///@name Friends + ///@{ + + + ///@} + +protected: + ///@name Protected static Member Variables + ///@{ + + + ///@} + ///@name Protected member Variables + ///@{ + + + ///@} + ///@name Protected Operators + ///@{ + + + ///@} + ///@name Protected Operations + ///@{ + + + ///@} + ///@name Protected Access + ///@{ + + + ///@} + ///@name Protected Inquiry + ///@{ + + + ///@} + ///@name Protected LifeCycle + ///@{ + + + ///@} + +private: + ///@name Static Member Variables + ///@{ + + ///@} + ///@name Member Variables + ///@{ + + + ///@} + ///@name Private Operators + ///@{ + + const LagrangianFluidVMS<2,3> mLagrangianFluidVMS2D; + const LagrangianFluidVMS<3,4> mLagrangianFluidVMS3D; + //const HYPOELASTICSOLID<2,3> mHYPOELASTICSOLID2D; + //const HYPOELASTICSOLID<3,4> mHYPOELASTICSOLID3D; + + const HYPO<2,3> mHYPO2D; + const HYPO<3,4> mHYPO3D; + + ///@} + ///@name Private Operations + ///@{ + + + ///@} + ///@name Private Access + ///@{ + + + ///@} + ///@name Private Inquiry + ///@{ + + + ///@} + ///@name Un accessible methods + ///@{ + + /// Assignment operator. + KratosPfemMeltingApplication& operator=(KratosPfemMeltingApplication const& rOther); + + /// Copy constructor. + KratosPfemMeltingApplication(KratosPfemMeltingApplication const& rOther); + + + ///@} + +}; // Class KratosConvectionDiffusionApplication + +///@} + + +///@name Type Definitions +///@{ + + +///@} +///@name Input and output +///@{ + +///@} + + +} // namespace Kratos. + +#endif // KRATOS_KRATOS_CONVECTION_DIFFUSION_APPLICATION_H_INCLUDED defined diff --git a/applications/PfemMeltingApplication/pfem_melting_application_variables.cpp b/applications/PfemMeltingApplication/pfem_melting_application_variables.cpp new file mode 100644 index 000000000000..c58fdd9b964d --- /dev/null +++ b/applications/PfemMeltingApplication/pfem_melting_application_variables.cpp @@ -0,0 +1,60 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#include "pfem_melting_application_variables.h" + +namespace Kratos +{ + +KRATOS_CREATE_VARIABLE(double, ACTIVATION_ENERGY) +KRATOS_CREATE_VARIABLE(double, ARRHENIUS_COEFFICIENT) +KRATOS_CREATE_VARIABLE(double, RADIOUS) +KRATOS_CREATE_VARIABLE(double, HEAT_OF_VAPORIZATION) +KRATOS_CREATE_VARIABLE(double, ARRHENIUS_VALUE) + + + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_XX) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_XY) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_XZ) + + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_YX) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_YY) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_YZ) + + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_ZX) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_ZY) + KRATOS_CREATE_VARIABLE(double, DELTA_SIGMA_ZZ) + + + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_XX) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_XY) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_XZ) + + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_YX) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_YY) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_YZ) + + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_ZX) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_ZY) + KRATOS_CREATE_VARIABLE(double, HISTORICAL_SIGMA_ZZ) + + + +KRATOS_CREATE_3D_VARIABLE_WITH_COMPONENTS(INITIAL_POSITION) + + + +} diff --git a/applications/PfemMeltingApplication/pfem_melting_application_variables.h b/applications/PfemMeltingApplication/pfem_melting_application_variables.h new file mode 100644 index 000000000000..69ab3449e4bb --- /dev/null +++ b/applications/PfemMeltingApplication/pfem_melting_application_variables.h @@ -0,0 +1,70 @@ +// KRATOS +// _____ __ __ __ _ _ _ +//| __ \ / _| | \/ | | | | (_) +//| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +//| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +//| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +//|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | +// __/ | +// |___/ APPLICATION +// License: BSD License +// Kratos default license: kratos/license.txt +// +// Main authors: Julio Marti +// + + +#if !defined(KRATOS_PFEM_MELTING_APPLICATION_VARIABLES_H_INCLUDED) +#define KRATOS_PFEM_MELTING_APPLICATION_VARIABLES_H_INCLUDED + +// System includes + +// External includes + +// Project includes +#include "includes/define.h" +#include "includes/variables.h" +#include "includes/global_pointer_variables.h" +// +//////// +namespace Kratos +{ + +// Variables definition + +KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION, double, ACTIVATION_ENERGY) +KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION, double, ARRHENIUS_COEFFICIENT) +KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION, double, RADIOUS) +KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION, double, HEAT_OF_VAPORIZATION) +KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION, double, ARRHENIUS_VALUE) + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_XX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_XY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_XZ) + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_YX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_YY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_YZ) + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_ZX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_ZY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, DELTA_SIGMA_ZZ) + + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_XX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_XY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_XZ) + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_YX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_YY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_YZ) + + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_ZX) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_ZY) + KRATOS_DEFINE_APPLICATION_VARIABLE( PFEM_MELTING_APPLICATION,double, HISTORICAL_SIGMA_ZZ) + +KRATOS_DEFINE_3D_APPLICATION_VARIABLE_WITH_COMPONENTS( PFEM_MELTING_APPLICATION, INITIAL_POSITION) + +} + +#endif /* KRATOS_CONVECTION_DIFUSSION_APPLICATION_VARIABLES_H_INCLUDED */ diff --git a/applications/PfemMeltingApplication/python_scripts/apply_laser_process.py b/applications/PfemMeltingApplication/python_scripts/apply_laser_process.py new file mode 100644 index 000000000000..142c0f9bfb89 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/apply_laser_process.py @@ -0,0 +1,165 @@ +import KratosMultiphysics +import KratosMultiphysics.PfemMeltingApplication as PfemM + +def Factory(settings, Model): + if(type(settings) != KratosMultiphysics.Parameters): + raise Exception("expected input shall be a Parameters object, encapsulating a json string") + + return ApplyLaserProcess(Model, settings["Parameters"]) + +class ApplyLaserProcess(KratosMultiphysics.Process): + + def __init__(self, Model, settings): + + KratosMultiphysics.Process.__init__(self) + print("here") + # Check the default values + default_settings = KratosMultiphysics.Parameters( """ + { + "model_part_name" : "CHOOSE_FLUID_MODELPART_NAME", + "filename" : "provide_the_name_of_the laser_file" + } """ ) + + + # Get the fluid model part from the Model container + self.fluid_model_part = Model[settings["model_part_name"].GetString()] + + #first laser + with open("LaserSettings.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + self.radius=project_parameters["laser_settings"]["laser_profile"]["radius"].GetDouble() + self.power=project_parameters["laser_settings"]["laser_profile"]["power"].GetDouble() + self.shape=project_parameters["laser_settings"]["laser_profile"]["shape"].GetString() + + self.path=project_parameters["laser_settings"]["path"] + + list_of_coordinates = [] + list_of_power = [] + if(self.shape=="custom"): + + len = project_parameters["laser_settings"]["laser_profile"]["values"] + i=0 + while(i < len.size()): + coordinates = float(len[i]["distance"].GetDouble()) + #power = float(len[i]["power_per_unit_area"].GetDouble()) + power = float(len[i]["power_deviation_from_flat"].GetDouble()) + + list_of_coordinates.append(coordinates) + list_of_power.append(power) + i = i + 1 + + sum=0.0 + for i in range(len.size()-1): + c_i_sq = list_of_coordinates[i] * list_of_coordinates[i] + c_i1_sq = list_of_coordinates[i+1] * list_of_coordinates[i+1] + c_i_cu = c_i_sq * list_of_coordinates[i] + c_i1_cu = c_i1_sq * list_of_coordinates[i+1] + slope = (list_of_power[i+1] - list_of_power[i]) / (list_of_coordinates[i+1] - list_of_coordinates[i]) + sum += 0.5 * list_of_power[i] * (c_i1_sq-c_i_sq) + slope * 0.3333333333333333 * (c_i1_cu - c_i_cu) + + + total_heat=2.0 * 3.1416 * sum + print(total_heat) + + laser_path = project_parameters["laser_settings"]["path"] + + print(laser_path.size()) + i=0 + + self.new_table_x = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_y = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_z = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_Q = KratosMultiphysics.PiecewiseLinearTable() + + self.maximum_time= laser_path[laser_path.size()-1]["time"].GetDouble() + + while(i < laser_path.size()): + time=laser_path[0]["time"].GetDouble() + self.new_table_x.AddRow(laser_path[i]["time"].GetDouble(), laser_path[i]["x"].GetDouble()) + self.new_table_y.AddRow(laser_path[i]["time"].GetDouble(), laser_path[i]["y"].GetDouble()) + self.new_table_z.AddRow(laser_path[i]["time"].GetDouble(), laser_path[i]["z"].GetDouble()) + self.new_table_Q.AddRow(laser_path[i]["time"].GetDouble(), laser_path[i]["power"].GetDouble()) + i = i + 1 + + + self.ApplyLaserProcess = PfemM.ApplyLaserProcess(self.fluid_model_part, project_parameters["laser_settings"]) + + #second laser + self.SecondLaser=False + try: + with open("LaserSettingsSecond.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + self.SecondLaser=True + except FileNotFoundError: + + self.SecondLaser=False + + + if(self.SecondLaser==True): + self.radius=project_parameters["laser_settings"]["laser_profile"]["radius"].GetDouble() + self.power=project_parameters["laser_settings"]["laser_profile"]["power"].GetDouble() + self.shape=project_parameters["laser_settings"]["laser_profile"]["shape"].GetString() + + self.path=project_parameters["laser_settings"]["path"] + + + laser_path_Second = project_parameters["laser_settings"]["path"] + + print(laser_path_Second.size()) + i=0 + + self.new_table_x_Second = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_y_Second = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_z_Second = KratosMultiphysics.PiecewiseLinearTable() + self.new_table_Q_Second = KratosMultiphysics.PiecewiseLinearTable() + + self.maximum_time_Second= laser_path_Second[laser_path.size()-1]["time"].GetDouble() + + while(i < laser_path_Second.size()): + time=laser_path_Second[0]["time"].GetDouble() + self.new_table_x_Second.AddRow(laser_path_Second[i]["time"].GetDouble(), laser_path_Second[i]["x"].GetDouble()) + self.new_table_y_Second.AddRow(laser_path_Second[i]["time"].GetDouble(), laser_path_Second[i]["y"].GetDouble()) + self.new_table_z_Second.AddRow(laser_path_Second[i]["time"].GetDouble(), laser_path_Second[i]["z"].GetDouble()) + i = i + 1 + + self.ApplyLaserProcessSecond = PfemM.ApplyLaserProcess(self.fluid_model_part, project_parameters["laser_settings"]) + + def ExecuteInitialize(self): + self.ApplyLaserProcess.ExecuteInitialize() + if(self.SecondLaser==True): + self.ApplyLaserProcessSecond.ExecuteInitialize() + + def ExecuteInitializeSolutionStep(self): + + self.ApplyLaserProcess.ExecuteInitializeSolutionStep() + if(self.SecondLaser==True): + self.ApplyLaserProcessSecond.ExecuteInitializeSolutionStep() + current_time = self.fluid_model_part.ProcessInfo[KratosMultiphysics.TIME] + + if(current_time < self.maximum_time): + x=self.new_table_x.GetValue(current_time) + y=self.new_table_y.GetValue(current_time) + z=self.new_table_z.GetValue(current_time) + Q=self.new_table_Q.GetValue(current_time) + if(self.SecondLaser==True): + xSecond=self.new_table_x_Second.GetValue(current_time) + ySecond=self.new_table_y_Second.GetValue(current_time) + zSecond=self.new_table_z_Second.GetValue(current_time) + + else: + x=laser_path[laser_path.size()-1]["x"].GetDouble() + y=laser_path[laser_path.size()-1]["y"].GetDouble() + z=laser_path[laser_path.size()-1]["z"].GetDouble() + Q=laser_path[laser_path.size()-1]["power"].GetDouble() + + if(self.SecondLaser==True): + xSecond=laser_path_Second[laser_path_Second.size()-1]["x"].GetDouble() + ySecond=laser_path_Second[laser_path_Second.size()-1]["y"].GetDouble() + zSecond=laser_path_Second[laser_path_Second.size()-1]["z"].GetDouble() + + self.ApplyLaserProcess.ApplyLaser(x, y, z, Q) + if(self.SecondLaser==True): + self.ApplyLaserProcessSecond.ApplyLaser(xSecond, ySecond, zSecond) + + diff --git a/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_pfem2solver.py b/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_pfem2solver.py new file mode 100644 index 000000000000..fc454b519888 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_pfem2solver.py @@ -0,0 +1,667 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +import sys +import math +# Importing the Kratos Library +import KratosMultiphysics + +# Import applications +import KratosMultiphysics.FluidDynamicsApplication as KratosCFD +import KratosMultiphysics.ConvectionDiffusionApplication as ConvDiff +import KratosMultiphysics.MeshingApplication as MeshApp +#import KratosMultiphysics.PFEM2Application as PFEM2 +import KratosMultiphysics.PfemMeltingApplication as PfemM + +import time as timer + +# Importing the base class +from KratosMultiphysics.python_solver import PythonSolver + +def CreateSolver(main_model_part, custom_settings): + + return PfemCoupledFluidThermalSolver(main_model_part, custom_settings) + +class PfemCoupledFluidThermalSolver(PythonSolver): + + @classmethod + def GetDefaultParameters(cls): + + default_settings = KratosMultiphysics.Parameters(""" + { + "solver_type" : "ThermallyCoupled1", + "domain_size" : -1, + "echo_level": 0, + "material_import_settings" : { + "materials_filename" : "file_name_to_be_defined.json" + }, + "environment_settings" : { + "gravity": [0, 0, 0], + "ambient_temperature" : 0.15 + }, + "mesh_element_size" : 0.0, + "fluid_solver_settings": { + "solver_type": "navier_stokes_solver_vmsmonolithic", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "unknown_name" + } + }, + "thermal_solver_settings": { + "solver_type": "Transient", + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "ThermalMaterials.json" + } + } + } + """) + + + default_settings.AddMissingParameters(super().GetDefaultParameters()) + return default_settings + + def __init__(self, model, custom_settings): + + super(PfemCoupledFluidThermalSolver, self).__init__(model, custom_settings) + + self.settings["fluid_solver_settings"].AddEmptyValue("alpha") + self.settings["fluid_solver_settings"]["alpha"].SetDouble(0.0) + self.settings["fluid_solver_settings"].AddEmptyValue("move_mesh_strategy") + self.settings["fluid_solver_settings"]["move_mesh_strategy"].SetInt(2) + self.settings["fluid_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["fluid_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + self.settings["thermal_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["thermal_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + + ## Get domain size + self.domain_size = self.settings["domain_size"].GetInt() + + from KratosMultiphysics.FluidDynamicsApplication import python_solvers_wrapper_fluid + self.fluid_solver = python_solvers_wrapper_fluid.CreateSolverByParameters(self.model, self.settings["fluid_solver_settings"],"OpenMP") + + + + from KratosMultiphysics.ConvectionDiffusionApplication import python_solvers_wrapper_convection_diffusion + self.thermal_solver = python_solvers_wrapper_convection_diffusion.CreateSolverByParameters(self.model,self.settings["thermal_solver_settings"],"OpenMP") + + + + self.readmeshSettings() + + self.readenvironmentSettings() + + #self.readLasserSettings() + #Laser settings + + + + self.readMaterialCharacterization() + + + self.Mesher = MeshApp.TetGenPfemModeler() + + self.modeler = KratosMultiphysics.ConnectivityPreserveModeler() + + self.PfemM_apply_bc_process = PfemM.PfemMeltingApplyBCProcess(self.fluid_solver.main_model_part); + + self.node_erase_process = KratosMultiphysics.NodeEraseProcess(self.fluid_solver.main_model_part); + + self.Streamline = PfemM.Streamline() + + #self.Pfem2Utils = PFEM2.Pfem2Utils() + + self.faceheatflux = PfemM.FaceHeatFlux() + + self.HeatSource = PfemM.HeatSource() + + self.outstring3 = "volume" + self.outputfile4 = open(self.outstring3, 'w') + + self.outstring5 = "computational_times" + self.outputfile6 = open(self.outstring5, 'w') + + + self.streamlineintegration=0.0 + self.fillingsubmodelparts=0.0 + self.initializeSolutionStep=0.0 + self.problemsolution=0.0 + self.meshingprocedure=0.0 + def readmeshSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + self.mesh_element_size=project_parameters["problem_data"]["mesh_element_size"] + + def readenvironmentSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + + self.gravity = [] + #self.gravity= [] + self.ambient_temperature=project_parameters["problem_data"]["environment_settings"]["ambient_temperature"] + self.gravity=project_parameters["problem_data"]["environment_settings"]["gravity"] + + + + #materials_filename = self.settings["laser_import_settings"]["laser_filename"].GetString() + + #material_settings = KratosMultiphysics.Parameters("""{"Parameters": {"materials_filename": ""}} """) + + + #open(self.settings["environment_settings"]) as parameter_file: + #materials = KratosMultiphysics.Parameters(self.settings["environment_settings"].read()) ##laser_settings + + + #materials_filename = self.settings["environment_settings"]["ambient_temperature"] + + #materials = KratosMultiphysics.Parameters(materials_filename.read()) + + def readLasserSettings(self): + + materials_filename = self.settings["laser_import_settings"]["laser_filename"].GetString() + + material_settings = KratosMultiphysics.Parameters("""{"Parameters": {"materials_filename": ""}} """) + + with open(self.settings["laser_import_settings"]["laser_filename"].GetString(), 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) ##laser_settings + + + mat = materials["properties"][0]["Material"] + + self.variables = [] + self.values = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables.append(var) + self.values.append(value) + + + for key, table in mat["Tables"].items(): + table_name = key + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table["output_variable"].GetString()) + self.new_table = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table["data"].size()): + self.new_table.AddRow(table["data"][i][0].GetDouble(), table["data"][i][1].GetDouble()) + + + def readMaterialCharacterization(self): + + materials_filename = self.settings["thermal_solver_settings"]["material_import_settings"]["materials_filename"].GetString() + + with open(materials_filename, 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) + + mat = materials["properties"][0]["Material"] + + self.variables_aux = [] + self.values_aux = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables_aux.append(var) + self.values_aux.append(value) + + #The part below reads the temperature dependent viscosity + table1=mat["Tables"]["Table1"] + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["output_variable"].GetString()) + + read_materials_utility = KratosMultiphysics.ReadMaterialsUtility(self.model) + + read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[0]) + #read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[1]) + + '''self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DYNAMIC_VISCOSITY]=self.values_aux[6].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DENSITY]=self.values_aux[5].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.EMISSIVITY]=self.values_aux[7].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.values_aux[1].GetDouble() #298.0 + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.CONVECTION_COEFFICIENT]=self.values_aux[4].GetDouble()''' + + + #self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + self.fluid_solver.main_model_part.GetProperties()[1][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + + self.new_table_aux = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table1["data"].size()): + self.new_table_aux.AddRow(table1["data"][i][0].GetDouble(), table1["data"][i][1].GetDouble()) + + + #taux1= table1["Table2"] + #input_var = KratosMultiphysics.KratosGlobals.GetVariable(taux1["input_variable"].GetString()) + #output_var = KratosMultiphysics.KratosGlobals.GetVariable(taux1["output_variable"].GetString()) + + #self.new_table_aux2 = KratosMultiphysics.PiecewiseLinearTable() + + + #for i in range(taux1["data"].size()): + # self.new_table_aux2.AddRow(taux1["data"][i][0].GetDouble(), taux1["data"][i][1].GetDouble()) + + #taux1= table1["Table3"] + #input_var = KratosMultiphysics.KratosGlobals.GetVariable(taux1["input_variable"].GetString()) + #output_var = KratosMultiphysics.KratosGlobals.GetVariable(taux1["output_variable"].GetString()) + + #self.new_table_aux3 = KratosMultiphysics.PiecewiseLinearTable() + + #for i in range(taux1["data"].size()): + # self.new_table_aux3.AddRow(taux1["data"][i][0].GetDouble(), taux1["data"][i][1].GetDouble()) + + + def AddVariables(self): + # Import the fluid and thermal solver variables. Then merge them to have them in both fluid and thermal solvers. + + self.fluid_solver.AddVariables() + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FREE_SURFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_STRUCTURE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_BOUNDARY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FLUID) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_LAGRANGIAN_INLET) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.DYNAMIC_VISCOSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_INTERFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.RADIATIVE_INTENSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NORMAL) + + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ACTIVATION_ENERGY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_COEFFICIENT) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HEAT_OF_VAPORIZATION) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_VALUE) + + + + self.thermal_solver.AddVariables() + + KratosMultiphysics.MergeVariableListsUtility().Merge(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part) + + def ImportModelPart(self): + # Call the fluid solver to import the model part from the mdpa + + self.fluid_solver.ImportModelPart() + + + # Save the convection diffusion settings + convection_diffusion_settings = self.thermal_solver.main_model_part.ProcessInfo.GetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS) + + # Here the fluid model part is cloned to be thermal model part so that the nodes are shared + #self.modeler = KratosMultiphysics.ConnectivityPreserveModeler() + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff2D", + "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff3D", + "ThermalFace3D3N") + + + # Set the saved convection diffusion settings to the new thermal model part + self.thermal_solver.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS, convection_diffusion_settings) + + + def PrepareModelPart(self): + + + self.fluid_solver.PrepareModelPart() + + self.thermal_solver.PrepareModelPart() + + + self.cleaning_submodelparts() + self.assign_nodally_properties(); + self.ReMesh() + + + def assign_nodally_properties(self): + #here we assign ACTIVATION_ENERGY, ARRHENIUS_COEFFICIENT and HEAT_OF_VAPORIZATION taken from FluidMaterial.json + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[0], self.values_aux[0].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[1], self.values_aux[1].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[2], self.values_aux[2].GetDouble(), self.fluid_solver.main_model_part.Nodes) + + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_X,0,self.gravity[0].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Y,0,self.gravity[1].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Z,0,self.gravity[2].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.TEMPERATURE,0,self.ambient_temperature.GetDouble()) + + + + + def AddDofs(self): + self.fluid_solver.AddDofs() + self.thermal_solver.AddDofs() + + + + def CalculateViscosityaux(self): + import math + for node in self.fluid_solver.main_model_part.Nodes: + rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + mu=self.new_table_aux.GetValue(T) + node.SetSolutionStepValue(KratosMultiphysics.VISCOSITY,0,mu/rho) + + + def cleaning_submodelparts(self): + + parametersf=self.settings["fluid_solver_settings"] + + parameters=self.settings["thermal_solver_settings"] + + self.skin_parts_list = [] + + if parametersf.Has("skin_parts"): + self.skin_parts_list = parametersf["skin_parts"] + + for i in range(self.skin_parts_list.size()): + body_model_part_name=self.skin_parts_list[i].GetString() + body_model_part_name=self.fluid_solver.main_model_part.GetSubModelPart(body_model_part_name) + body_model_part_name.Conditions.clear() + body_model_part_name.Elements.clear() + body_model_part_name.Nodes.clear() + + + + #self.bodies_parts_list = [] + #if parameters.Has("processes_sub_model_part_list"): + # self.bodies_parts_list = parameters["processes_sub_model_part_list"] + + + ##NEW FOR THERMAL SOLVER + #self.skin_parts_listaux = [] + #if parametersf.Has("skin_parts"): + # self.skin_parts_listaux = parametersf["skin_parts"] + + #Parts_Parts_Auto1=self.fluid_solver.main_model_part.GetSubModelPart("FluidParts_Parts_Auto1") + #Parts_Parts_Auto1.Conditions.clear() + #Parts_Parts_Auto1.Elements.clear() + #Parts_Parts_Auto1.Nodes.clear() + + + #Parts_Parts_Auto1=self.thermal_solver.main_model_part.GetSubModelPart("FluidParts_Parts_Auto1") + #Parts_Parts_Auto1.Conditions.clear() + #Parts_Parts_Auto1.Elements.clear() + #Parts_Parts_Auto1.Nodes.clear() + + + + + def filling_submodelparts(self): + + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODESANDELEMENTS) + transfer_process.Execute() + + + fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + self.thermal_solver.main_model_part.Conditions.clear() + self.thermal_solver.main_model_part.Elements.clear() + self.thermal_solver.main_model_part.Nodes.clear() + + + if not self.thermal_solver.main_model_part.HasSubModelPart("thermal_computing_domain"): + self.thermal_solver.main_model_part.CreateSubModelPart("thermal_computing_domain") + + + thermal_computing_domain=self.thermal_solver.main_model_part.GetSubModelPart("thermal_computing_domain") + + thermal_computing_domain.Conditions.clear() + thermal_computing_domain.Elements.clear() + thermal_computing_domain.Nodes.clear() + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain,"EulerianConvDiff3D","ThermalFace3D3N") + + + self.thermal_solver.main_model_part.Conditions.clear() + + + + + + + thermal_computing_domain.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + thermal_computing_domain.Properties = self.fluid_solver.main_model_part.Properties + + + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(thermal_computing_domain, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.CONDITIONS) + transfer_process.Execute() + + + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(thermal_computing_domain) + neighbor_search.Execute() + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(thermal_computing_domain,3, 20) + neighbor_condition_search.Execute() + + + + + + def ReMesh(self): + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.NODAL_H,0,self.mesh_element_size.GetDouble()); + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + #self.fluid_solver.main_model_part.Conditions.clear() + + #self.fluid_solver.main_model_part.Elements.clear() + + (self.Mesher).ReGenerateMesh("LagrangianFluidVMS3D","ThermalFace3D3N", self.fluid_solver.main_model_part, self.node_erase_process, True, False, 1.4, 0.1) #1.8 + + #LagrangianFluidVMS3D + #VMS3D + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + (self.PfemM_apply_bc_process).Execute(); + + + + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + + + + + pass + + def CalculateNorm(array_3d_value): + return math.sqrt(array_3d_value[0]**2+array_3d_value[1]**2+array_3d_value[2]**2) + + + def GetComputingModelPart(self): + return self.fluid_solver.GetComputingModelPart() + + def GetOutputVariables(self): + pass + + def ComputeDeltaTime(self): + + return self.fluid_solver._ComputeDeltaTime() + + def GetMinimumBufferSize(self): + buffer_size_fluid = self.fluid_solver.GetMinimumBufferSize() + buffer_size_thermal = self.thermal_solver.GetMinimumBufferSize() + return max(buffer_size_fluid, buffer_size_thermal) + + def Initialize(self): + self.fluid_solver.Initialize() + self.thermal_solver.Initialize() + + def Clear(self): + + (self.fluid_solver).Clear() + (self.thermal_solver).Clear() + + def Check(self): + (self.fluid_solver).Check() + (self.thermal_solver).Check() + + def SetEchoLevel(self, level): + (self.fluid_solver).SetEchoLevel(level) + (self.thermal_solver).SetEchoLevel(level) + + def AdvanceInTime(self, current_time): + + + #NOTE: the cloning is done ONLY ONCE since the nodes are shared + new_time = self.fluid_solver.AdvanceInTime(current_time) + return new_time + + def InitializeSolutionStep(self): + + ##poner aca + + #print(self.fluid_solver._GetSolver().GetComputingModelPart().ProcessInfo[KratosMultiphysics.STEP]) + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + for node in self.fluid_solver.main_model_part.Nodes: + if(node.IsFixed(KratosMultiphysics.VELOCITY_X)==True): + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + node.Fix(KratosMultiphysics.TEMPERATURE) + + + t1 = timer.time() + + self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + + t2= timer.time() + self.streamlineintegration=self.streamlineintegration + t2 - t1 + #volume evaluation + #volume=self.Streamline.CalculateVolume(self.fluid_solver.main_model_part,3) + #step=self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP] + #self.outputfile4.write(str(step)+" "+ str(volume) +"\n") + + + self.ReMesh() + + t3=timer.time() + self.meshingprocedure=self.meshingprocedure + t3 - t2 + + t4=timer.time() + + self.filling_submodelparts() + + t5=timer.time() + self.fillingsubmodelparts=self.fillingsubmodelparts + t5 - t4 + + + self.fluid_solver.InitializeSolutionStep() + + self.thermal_solver.InitializeSolutionStep() + + t6=timer.time() + self.initializeSolutionStep=self.initializeSolutionStep + t6 - t5 + + def Predict(self): + + self.fluid_solver.Predict() + self.thermal_solver.Predict() + + def SolveSolutionStep(self): + + + for node in self.fluid_solver.main_model_part.Nodes: + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + if(T<500.0): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_X,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_Y,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_Z,0, 0.0) + + t7=timer.time() + #print("BEFORE FLUID SOLVINF") + fluid_is_converged = self.fluid_solver.SolveSolutionStep() + #self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + + #print("AFTER FLUID SOLVING") + for node in self.fluid_solver.main_model_part.Nodes: + velocity = node.GetSolutionStepValue(KratosMultiphysics.VELOCITY) + node.SetSolutionStepValue(KratosMultiphysics.MESH_VELOCITY, velocity) + + + self.HeatSource.Heat_Source(self.fluid_solver.main_model_part) #heat source for the thermal problem + + #print("BEFORE THERMAL SOLVING") + thermal_is_converged = self.thermal_solver.SolveSolutionStep() + #print("AFTER T SOLVING") + self.CalculateViscosityaux() + + + t8=timer.time() + self.problemsolution=self.problemsolution + t8 - t7 + + + step=self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP] + self.outputfile6.write(str(step)+" "+ str(self.streamlineintegration) +" "+ str(self.meshingprocedure) +" "+ str(self.fillingsubmodelparts) +" "+ str(self.initializeSolutionStep)+" "+ str(self.problemsolution) +"\n") + + + return (fluid_is_converged and thermal_is_converged) + + def FinalizeSolutionStep(self): + self.fluid_solver.FinalizeSolutionStep() + self.thermal_solver.FinalizeSolutionStep() + + def Solve(self): + + self.InitializeSolutionStep() + self.Predict() + sssssssssss + self.SolveSolutionStep() + self.FinalizeSolutionStep() diff --git a/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_solverwithoutmeshgeneration.py b/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_solverwithoutmeshgeneration.py new file mode 100644 index 000000000000..98a435ff1acc --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/coupled_fluid_thermal_solverwithoutmeshgeneration.py @@ -0,0 +1,614 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +import sys +import math +# Importing the Kratos Library +import KratosMultiphysics + +# Import applications +import KratosMultiphysics.FluidDynamicsApplication as KratosCFD +import KratosMultiphysics.ConvectionDiffusionApplication as ConvDiff +import KratosMultiphysics.MeshingApplication as MeshApp +import KratosMultiphysics.PfemMeltingApplication as PfemM + +import time as timer + +# Importing the base class +from KratosMultiphysics.python_solver import PythonSolver + +def CreateSolver(main_model_part, custom_settings): + + return PfemCoupledFluidThermalSolver(main_model_part, custom_settings) + +class PfemCoupledFluidThermalSolver(PythonSolver): + + @classmethod + def GetDefaultParameters(cls): + + default_settings = KratosMultiphysics.Parameters(""" + { + "solver_type" : "ThermallyCoupled1", + "domain_size" : -1, + "echo_level": 0, + "material_import_settings" : { + "materials_filename" : "file_name_to_be_defined.json" + }, + "environment_settings" : { + "gravity": [0, 0, 0], + "ambient_temperature" : 0.15 + }, + "mesh_element_size" : 0.0, + "fluid_solver_settings": { + "solver_type": "navier_stokes_solver_vmsmonolithic", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "unknown_name" + } + }, + "thermal_solver_settings": { + "solver_type": "Transient", + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "ThermalMaterials.json" + } + } + } + """) + + + default_settings.AddMissingParameters(super().GetDefaultParameters()) + return default_settings + + def __init__(self, model, custom_settings): + + super(PfemCoupledFluidThermalSolver, self).__init__(model, custom_settings) + + self.settings["fluid_solver_settings"].AddEmptyValue("alpha") + self.settings["fluid_solver_settings"]["alpha"].SetDouble(0.0) + self.settings["fluid_solver_settings"].AddEmptyValue("move_mesh_strategy") + self.settings["fluid_solver_settings"]["move_mesh_strategy"].SetInt(2) + self.settings["fluid_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["fluid_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + self.settings["thermal_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["thermal_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + + ## Get domain size + self.domain_size = self.settings["domain_size"].GetInt() + + from KratosMultiphysics.FluidDynamicsApplication import python_solvers_wrapper_fluid + self.fluid_solver = python_solvers_wrapper_fluid.CreateSolverByParameters(self.model, self.settings["fluid_solver_settings"],"OpenMP") + + + + from KratosMultiphysics.ConvectionDiffusionApplication import python_solvers_wrapper_convection_diffusion + self.thermal_solver = python_solvers_wrapper_convection_diffusion.CreateSolverByParameters(self.model,self.settings["thermal_solver_settings"],"OpenMP") + + + + self.readmeshSettings() + + self.readenvironmentSettings() + + self.readMaterialCharacterization() + + self.Mesher = MeshApp.TetGenPfemModeler() + + self.modeler = KratosMultiphysics.ConnectivityPreserveModeler() + + self.PfemM_apply_bc_process = PfemM.PfemMeltingApplyBCProcess(self.fluid_solver.main_model_part); + + self.node_erase_process = KratosMultiphysics.NodeEraseProcess(self.fluid_solver.main_model_part); + + self.Streamline = PfemM.Streamline() + + self.faceheatflux = PfemM.FaceHeatFlux() + + self.HeatSource = PfemM.HeatSource() + + self.outstring3 = "Volumen_withoutmesh" + self.outputfile4 = open(self.outstring3, 'w') + + self.outstring5 = "computational_times" + self.outputfile6 = open(self.outstring5, 'w') + + + self.streamlineintegration=0.0 + self.fillingsubmodelparts=0.0 + self.initializeSolutionStep=0.0 + self.problemsolution=0.0 + self.meshingprocedure=0.0 + + + + def readmeshSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + self.mesh_element_size=project_parameters["problem_data"]["mesh_element_size"] + + def readenvironmentSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + + self.gravity = [] + self.ambient_temperature=project_parameters["problem_data"]["environment_settings"]["ambient_temperature"] + self.gravity=project_parameters["problem_data"]["environment_settings"]["gravity"] + + def readMaterialCharacterization(self): + + materials_filename = self.settings["thermal_solver_settings"]["material_import_settings"]["materials_filename"].GetString() + + with open(materials_filename, 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) + + mat = materials["properties"][0]["Material"] + + self.variables_aux = [] + self.values_aux = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables_aux.append(var) + self.values_aux.append(value) + + #The part below reads the temperature dependent viscosity + table1=mat["Tables"]["Table1"] + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["output_variable"].GetString()) + + read_materials_utility = KratosMultiphysics.ReadMaterialsUtility(self.model) + + read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[0]) + #read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[1]) + + '''self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DYNAMIC_VISCOSITY]=self.values_aux[6].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DENSITY]=self.values_aux[5].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.EMISSIVITY]=self.values_aux[7].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.values_aux[1].GetDouble() #298.0 + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.CONVECTION_COEFFICIENT]=self.values_aux[4].GetDouble()''' + + + #self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + self.fluid_solver.main_model_part.GetProperties()[1][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + + self.new_table_aux = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table1["data"].size()): + self.new_table_aux.AddRow(table1["data"][i][0].GetDouble(), table1["data"][i][1].GetDouble()) + + + def AddVariables(self): + # Import the fluid and thermal solver variables. Then merge them to have them in both fluid and thermal solvers. + + self.fluid_solver.AddVariables() + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FREE_SURFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_STRUCTURE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_BOUNDARY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FLUID) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_LAGRANGIAN_INLET) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.DYNAMIC_VISCOSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_INTERFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.RADIATIVE_INTENSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NORMAL) + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ACTIVATION_ENERGY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_COEFFICIENT) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HEAT_OF_VAPORIZATION) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_VALUE) + + + + self.thermal_solver.AddVariables() + + KratosMultiphysics.MergeVariableListsUtility().Merge(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part) + + def ImportModelPart(self): + # Call the fluid solver to import the model part from the mdpa + + self.fluid_solver.ImportModelPart() + + + # Save the convection diffusion settings + convection_diffusion_settings = self.thermal_solver.main_model_part.ProcessInfo.GetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS) + + # Here the fluid model part is cloned to be thermal model part so that the nodes are shared + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff2D", + "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff3D", + "ThermalFace3D3N") + + + # Set the saved convection diffusion settings to the new thermal model part + self.thermal_solver.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS, convection_diffusion_settings) + + + def PrepareModelPart(self): + + + self.fluid_solver.PrepareModelPart() + + self.thermal_solver.PrepareModelPart() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 0.0) + parametersf=self.settings["fluid_solver_settings"] + + self.cleaning_submodelparts() + self.assign_nodally_properties(); + self.ReMesh() + + + def assign_nodally_properties(self): + #here we assign ACTIVATION_ENERGY, ARRHENIUS_COEFFICIENT and HEAT_OF_VAPORIZATION taken from FluidMaterial.json + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[0], self.values_aux[0].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[1], self.values_aux[1].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[2], self.values_aux[2].GetDouble(), self.fluid_solver.main_model_part.Nodes) + + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_X,0,self.gravity[0].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Y,0,self.gravity[1].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Z,0,self.gravity[2].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.TEMPERATURE,0,self.ambient_temperature.GetDouble()) + + + + + def AddDofs(self): + self.fluid_solver.AddDofs() + self.thermal_solver.AddDofs() + + + + def CalculateViscosityaux(self): + import math + for node in self.fluid_solver.main_model_part.Nodes: + rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + mu=self.new_table_aux.GetValue(T) + node.SetSolutionStepValue(KratosMultiphysics.VISCOSITY,0,mu/rho) + + + def cleaning_submodelparts(self): + + parametersf=self.settings["fluid_solver_settings"] + + parameters=self.settings["thermal_solver_settings"] + + self.skin_parts_list = [] + + if parametersf.Has("skin_parts"): + self.skin_parts_list = parametersf["skin_parts"] + + for i in range(self.skin_parts_list.size()): + body_model_part_name=self.skin_parts_list[i].GetString() + body_model_part_name=self.fluid_solver.main_model_part.GetSubModelPart(body_model_part_name) + body_model_part_name.Conditions.clear() + body_model_part_name.Elements.clear() + body_model_part_name.Nodes.clear() + + + + self.bodies_parts_list = [] + if parameters.Has("processes_sub_model_part_list"): + self.bodies_parts_list = parameters["processes_sub_model_part_list"] + + + + def filling_submodelparts(self): + + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODESANDELEMENTS) + transfer_process.Execute() + + + fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + if not self.thermal_solver.main_model_part.HasSubModelPart("thermal_computing_domain"): + self.thermal_solver.main_model_part.CreateSubModelPart("thermal_computing_domain") + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part,"EulerianConvDiff3D","ThermalFace3D3N") + + + def filling_submodelparts_aux(self): + + + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part,"EulerianConvDiff3D","ThermalFace3D3N") + + def ReMesh(self): + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.NODAL_H,0,self.mesh_element_size.GetDouble()); + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + + self.fluid_solver.main_model_part.Conditions.clear() + + self.fluid_solver.main_model_part.Elements.clear() + + + + (self.Mesher).ReGenerateMesh("LagrangianFluidVMS3D","ThermalFace3D3N", self.fluid_solver.main_model_part, self.node_erase_process, True, False, 1.4, 0.1) #1.8 + + #LagrangianFluidVMS3D + kratos_comm = KratosMultiphysics.DataCommunicator.GetDefault() + neighbor_search = KratosMultiphysics.FindGlobalNodalNeighboursProcess(kratos_comm,self.fluid_solver.main_model_part) + + neighbor_search.Execute() + neighbor_elements_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(kratos_comm,self.fluid_solver.main_model_part) + + neighbor_elements_search.Execute() + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + (self.PfemM_apply_bc_process).Execute(); + + self.node_erase_process.Execute() + + skin_params = KratosMultiphysics.Parameters(""" + { + "name_auxiliar_model_part" : "SkinDEMModelPart", + "name_auxiliar_condition" : "Condition", + "echo_level" : 1 + }""") + + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + pass + + + def AuxReMesh(self): + + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + self.fluid_solver.main_model_part.Conditions.clear() + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + (self.PfemM_apply_bc_process).Execute(); + + + skin_params = KratosMultiphysics.Parameters(""" + { + "name_auxiliar_model_part" : "SkinDEMModelPart", + "name_auxiliar_condition" : "Condition", + "echo_level" : 1 + }""") + + + skin_detection_process = KratosMultiphysics.SkinDetectionProcess3D(self.fluid_solver.main_model_part, skin_params) + + skin_detection_process.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.IS_FREE_SURFACE,0, 0.0) + + + for node in self.fluid_solver.main_model_part.GetSubModelPart("SkinDEMModelPart").Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 1.0) + + + + (self.PfemM_apply_bc_process).Execute(); + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + pass + + def CalculateNorm(array_3d_value): + return math.sqrt(array_3d_value[0]**2+array_3d_value[1]**2+array_3d_value[2]**2) + + + def GetComputingModelPart(self): + return self.fluid_solver.GetComputingModelPart() + + def GetOutputVariables(self): + pass + + def ComputeDeltaTime(self): + + return self.fluid_solver._ComputeDeltaTime() + + def GetMinimumBufferSize(self): + buffer_size_fluid = self.fluid_solver.GetMinimumBufferSize() + buffer_size_thermal = self.thermal_solver.GetMinimumBufferSize() + return max(buffer_size_fluid, buffer_size_thermal) + + def Initialize(self): + self.fluid_solver.Initialize() + self.thermal_solver.Initialize() + + def Clear(self): + + (self.fluid_solver).Clear() + (self.thermal_solver).Clear() + + def Check(self): + (self.fluid_solver).Check() + (self.thermal_solver).Check() + + def SetEchoLevel(self, level): + (self.fluid_solver).SetEchoLevel(level) + (self.thermal_solver).SetEchoLevel(level) + + def AdvanceInTime(self, current_time): + + + #NOTE: the cloning is done ONLY ONCE since the nodes are shared + new_time = self.fluid_solver.AdvanceInTime(current_time) + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.FACE_HEAT_FLUX, 0.0) + + return new_time + + def InitializeSolutionStep(self): + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + for node in self.fluid_solver.main_model_part.Nodes: + if(node.IsFixed(KratosMultiphysics.VELOCITY_X)==True): + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + node.Fix(KratosMultiphysics.TEMPERATURE) + + + t1 = timer.time() + + self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + + t2= timer.time() + self.streamlineintegration=self.streamlineintegration + t2 - t1 + + self.inverted=False + + self.inverted=self.Streamline.CheckInvertElement(self.fluid_solver.main_model_part,self.domain_size,self.mesh_element_size.GetDouble()) + + self.AuxReMesh() + + t3=timer.time() + self.meshingprocedure=self.meshingprocedure + t3 - t2 + + #Volume evaluation + volume=self.Streamline.CalculateVolume(self.fluid_solver.main_model_part,3) + step=self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP] + + self.outputfile4.write(str(step)+" "+ str(volume) +"\n") + + t4=timer.time() + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + self.filling_submodelparts() + else: + self.filling_submodelparts_aux() + + t5=timer.time() + self.fillingsubmodelparts=self.fillingsubmodelparts + t5 - t4 + + + self.fluid_solver.InitializeSolutionStep() + + self.thermal_solver.InitializeSolutionStep() + + t6=timer.time() + self.initializeSolutionStep=self.initializeSolutionStep + t6 - t5 + + + def Predict(self): + + self.fluid_solver.Predict() + self.thermal_solver.Predict() + + def SolveSolutionStep(self): + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + if(T<500.0): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_X,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_Y,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.VELOCITY_Z,0, 0.0) + t7=timer.time() + fluid_is_converged = self.fluid_solver.SolveSolutionStep() + + for node in self.fluid_solver.main_model_part.Nodes: + velocity = node.GetSolutionStepValue(KratosMultiphysics.VELOCITY) + node.SetSolutionStepValue(KratosMultiphysics.MESH_VELOCITY, velocity) + + + self.HeatSource.Heat_Source(self.fluid_solver.main_model_part) #heat source for the thermal problem + + thermal_is_converged = self.thermal_solver.SolveSolutionStep() + + self.CalculateViscosityaux() + t8=timer.time() + self.problemsolution=self.problemsolution + t8 - t7 + + step=self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP] + self.outputfile6.write(str(step)+" "+ str(self.streamlineintegration) +" "+ str(self.meshingprocedure) +" "+ str(self.fillingsubmodelparts) +" "+ str(self.initializeSolutionStep)+" "+ str(self.problemsolution) +"\n") + + + return (fluid_is_converged and thermal_is_converged) + + def FinalizeSolutionStep(self): + self.fluid_solver.FinalizeSolutionStep() + self.thermal_solver.FinalizeSolutionStep() + + def Solve(self): + + self.InitializeSolutionStep() + self.Predict() + self.SolveSolutionStep() + self.FinalizeSolutionStep() diff --git a/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithmeshgeneration.py b/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithmeshgeneration.py new file mode 100644 index 000000000000..60c0a473d580 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithmeshgeneration.py @@ -0,0 +1,760 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +import sys +import math +# Importing the Kratos Library +import KratosMultiphysics + +# Import applications +import KratosMultiphysics.FluidDynamicsApplication as KratosCFD +import KratosMultiphysics.ConvectionDiffusionApplication as ConvDiff +import KratosMultiphysics.MeshingApplication as MeshApp +import KratosMultiphysics.PfemMeltingApplication as PfemM + +import time as timer + +# Importing the base class +from KratosMultiphysics.python_solver import PythonSolver + +def CreateSolver(main_model_part, custom_settings): + + return PfemCoupledFluidThermalSolver(main_model_part, custom_settings) + +class PfemCoupledFluidThermalSolver(PythonSolver): + + @classmethod + def GetDefaultParameters(cls): + + default_settings = KratosMultiphysics.Parameters(""" + { + "solver_type" : "ThermallyCoupled1", + "domain_size" : -1, + "echo_level": 0, + "material_import_settings" : { + "materials_filename" : "file_name_to_be_defined.json" + }, + "environment_settings" : { + "gravity": [0, 0, 0], + "ambient_temperature" : 0.15 + }, + "mesh_element_size" : 0.0, + "fluid_solver_settings": { + "solver_type": "navier_stokes_solver_vmsmonolithic", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "unknown_name" + } + }, + "thermal_solver_settings": { + "solver_type": "Transient", + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "ThermalMaterials.json" + } + } + } + """) + + + default_settings.AddMissingParameters(super().GetDefaultParameters()) + return default_settings + + def __init__(self, model, custom_settings): + + super(PfemCoupledFluidThermalSolver, self).__init__(model, custom_settings) + + self.settings["fluid_solver_settings"].AddEmptyValue("alpha") + self.settings["fluid_solver_settings"]["alpha"].SetDouble(0.0) + self.settings["fluid_solver_settings"].AddEmptyValue("move_mesh_strategy") + self.settings["fluid_solver_settings"]["move_mesh_strategy"].SetInt(2) + self.settings["fluid_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["fluid_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + self.settings["thermal_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["thermal_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + + ## Get domain size + self.domain_size = self.settings["domain_size"].GetInt() + + from KratosMultiphysics.FluidDynamicsApplication import python_solvers_wrapper_fluid + self.fluid_solver = python_solvers_wrapper_fluid.CreateSolverByParameters(self.model, self.settings["fluid_solver_settings"],"OpenMP") + + + + from KratosMultiphysics.ConvectionDiffusionApplication import python_solvers_wrapper_convection_diffusion + self.thermal_solver = python_solvers_wrapper_convection_diffusion.CreateSolverByParameters(self.model,self.settings["thermal_solver_settings"],"OpenMP") + + + + self.readmeshSettings() + + self.readenvironmentSettings() + + self.readMaterialCharacterization() + print("ssssssssssssssssssssssssss") + print("ssssssssssssssssssssssssss") + print("ssssssssssssssssssssssssss") + print("ssssssssssssssssssssssssss") + print("ssssssssssssssssssssssssss") + + + if(self.domain_size==3): + self.Mesher = MeshApp.TetGenPfemModeler() + else: + self.Mesher = MeshApp.TriGenPFEMModeler() + + print ("HOLAAAAAAAAAA") + + self.modeler = KratosMultiphysics.ConnectivityPreserveModeler() + + self.PfemM_apply_bc_process = PfemM.PfemMeltingApplyBCProcess(self.fluid_solver.main_model_part); + + self.node_erase_process = KratosMultiphysics.NodeEraseProcess(self.fluid_solver.main_model_part); + + self.Streamline = PfemM.Streamline() + + self.faceheatflux = PfemM.FaceHeatFlux() + + self.HeatSource = PfemM.HeatSource() + + self.outstring3 = "Volumen_withoutmesh" + self.outputfile4 = open(self.outstring3, 'w') + + self.outstring5 = "computational_times" + self.outputfile6 = open(self.outstring5, 'w') + + + self.streamlineintegration=0.0 + self.fillingsubmodelparts=0.0 + self.initializeSolutionStep=0.0 + self.problemsolution=0.0 + self.meshingprocedure=0.0 + + self.hypoelastic_solid_stress_tensor_calculate_process=PfemM.HypoelasticStressCalculateProcess(self.fluid_solver.main_model_part, self.domain_size) + + + def readmeshSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + self.mesh_element_size=project_parameters["problem_data"]["mesh_element_size"] + + def readenvironmentSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + + self.gravity = [] + self.ambient_temperature=project_parameters["problem_data"]["environment_settings"]["ambient_temperature"] + self.gravity=project_parameters["problem_data"]["environment_settings"]["gravity"] + + def readLasserSettings(self): + + materials_filename = self.settings["laser_import_settings"]["laser_filename"].GetString() + + material_settings = KratosMultiphysics.Parameters("""{"Parameters": {"materials_filename": ""}} """) + + with open(self.settings["laser_import_settings"]["laser_filename"].GetString(), 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) ##laser_settings + + + mat = materials["properties"][0]["Material"] + + self.variables = [] + self.values = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables.append(var) + self.values.append(value) + + + for key, table in mat["Tables"].items(): + table_name = key + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table["output_variable"].GetString()) + self.new_table = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table["data"].size()): + self.new_table.AddRow(table["data"][i][0].GetDouble(), table["data"][i][1].GetDouble()) + + + def readMaterialCharacterization(self): + + materials_filename = self.settings["thermal_solver_settings"]["material_import_settings"]["materials_filename"].GetString() + + with open(materials_filename, 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) + + mat = materials["properties"][0]["Material"] + + self.variables_aux = [] + self.values_aux = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables_aux.append(var) + self.values_aux.append(value) + + #The part below reads the temperature dependent viscosity + table1=mat["Tables"]["Table1"] + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["output_variable"].GetString()) + + read_materials_utility = KratosMultiphysics.ReadMaterialsUtility(self.model) + + read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[0]) + #read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[1]) + + '''self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DYNAMIC_VISCOSITY]=self.values_aux[6].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DENSITY]=self.values_aux[5].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.EMISSIVITY]=self.values_aux[7].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.values_aux[1].GetDouble() #298.0 + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.CONVECTION_COEFFICIENT]=self.values_aux[4].GetDouble()''' + + + #self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + self.fluid_solver.main_model_part.GetProperties()[1][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + + self.new_table_aux = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table1["data"].size()): + self.new_table_aux.AddRow(table1["data"][i][0].GetDouble(), table1["data"][i][1].GetDouble()) + + + def AddVariables(self): + # Import the fluid and thermal solver variables. Then merge them to have them in both fluid and thermal solvers. + + self.fluid_solver.AddVariables() + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FREE_SURFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_STRUCTURE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_BOUNDARY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FLUID) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_LAGRANGIAN_INLET) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.DYNAMIC_VISCOSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_INTERFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.RADIATIVE_INTENSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NORMAL) + + + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ACTIVATION_ENERGY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_COEFFICIENT) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HEAT_OF_VAPORIZATION) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_VALUE) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZZ) + + + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NODAL_AREA) + + + + self.thermal_solver.AddVariables() + + KratosMultiphysics.MergeVariableListsUtility().Merge(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part) + + def ImportModelPart(self): + # Call the fluid solver to import the model part from the mdpa + + self.fluid_solver.ImportModelPart() + + + # Save the convection diffusion settings + convection_diffusion_settings = self.thermal_solver.main_model_part.ProcessInfo.GetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS) + + # Here the fluid model part is cloned to be thermal model part so that the nodes are shared + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff2D", + "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff3D", + "ThermalFace3D3N") + + + # Set the saved convection diffusion settings to the new thermal model part + self.thermal_solver.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS, convection_diffusion_settings) + + + def PrepareModelPart(self): + + + self.fluid_solver.PrepareModelPart() + + self.thermal_solver.PrepareModelPart() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 0.0) + parametersf=self.settings["fluid_solver_settings"] + + self.cleaning_submodelparts() + self.assign_nodally_properties(); + self.ReMesh() + + + + + def assign_nodally_properties(self): + #here we assign ACTIVATION_ENERGY, ARRHENIUS_COEFFICIENT and HEAT_OF_VAPORIZATION taken from FluidMaterial.json + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[0], self.values_aux[0].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[1], self.values_aux[1].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[2], self.values_aux[2].GetDouble(), self.fluid_solver.main_model_part.Nodes) + + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_X,0,self.gravity[0].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Y,0,self.gravity[1].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Z,0,self.gravity[2].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.TEMPERATURE,0,self.ambient_temperature.GetDouble()) + + + + + def AddDofs(self): + self.fluid_solver.AddDofs() + self.thermal_solver.AddDofs() + + + + def CalculateViscosityaux(self): + import math + for node in self.fluid_solver.main_model_part.Nodes: + rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + mu=self.new_table_aux.GetValue(T) + node.SetSolutionStepValue(KratosMultiphysics.VISCOSITY,0,mu/rho) + + + def cleaning_submodelparts(self): + + parametersf=self.settings["fluid_solver_settings"] + + parameters=self.settings["thermal_solver_settings"] + + self.skin_parts_list = [] + + if parametersf.Has("skin_parts"): + self.skin_parts_list = parametersf["skin_parts"] + + for i in range(self.skin_parts_list.size()): + body_model_part_name=self.skin_parts_list[i].GetString() + body_model_part_name=self.fluid_solver.main_model_part.GetSubModelPart(body_model_part_name) + body_model_part_name.Conditions.clear() + body_model_part_name.Elements.clear() + body_model_part_name.Nodes.clear() + + + + self.bodies_parts_list = [] + if parameters.Has("processes_sub_model_part_list"): + self.bodies_parts_list = parameters["processes_sub_model_part_list"] + + + def new(self): + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + fluid_computational_model_part.Nodes.clear() + + + if not self.fluid_solver.main_model_part.HasSubModelPart("solid_model_part"): + solid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("solid_model_part") + + + if not self.fluid_solver.main_model_part.HasSubModelPart("fluid_model_part"): + fluid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("fluid_model_part") + + + solid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("solid_model_part") + solid_model_part.Elements.clear() + + fluid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("fluid_model_part") + fluid_model_part.Elements.clear() + + + #for node in self.fluid_solver.main_model_part.Nodes: + #rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + #T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + for elem in self.fluid_solver.main_model_part.Elements: + solid_model_part.AddElement(elem,0) + + + else: + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + + for elem in self.fluid_solver.main_model_part.Elements: + nnodes=0 + for node in elem.GetNodes(): + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + if(T >450.0): + #if (node.Z>0.0028 ): #or node.X<0.000): + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 0.0) + nnodes=nnodes+1; + if(nnodes>1): + fluid_model_part.AddElement(elem,0) + else: + solid_model_part.AddElement(elem,0) + + print("················") + print("fluid model part") + print(fluid_model_part) + + if(self.domain_size==3): + new_elem_name= "LagrangianFluidVMS3D" #"LagrangianFluidVMS3D"#"HYPO3D" + new_cond_name= "ThermalFace3D3N" + else: + new_elem_name= "LagrangianFluidVMS2D" #"LagrangianFluidVMS3D"#"HYPO3D" + new_cond_name= "ThermalFace2D2N" + + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(fluid_model_part, self.settings["element_replace_settings"]).Execute() + + #new_elem_name= "HYPO3D" #"LagrangianFluidVMS3D"#"HYPO3D" + #new_cond_name= "ThermalFace3D3N" + + if(self.domain_size==3): + new_elem_name= "HYPO3D" #"LagrangianFluidVMS3D"#"HYPO3D" + new_cond_name= "ThermalFace3D3N" + else: + new_elem_name= "HYPO2D" #"LagrangianFluidVMS3D"#"HYPO3D" + new_cond_name= "ThermalFace2D2N" + + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(solid_model_part, self.settings["element_replace_settings"]).Execute() + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, fluid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, solid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODES) + transfer_process.Execute() + + + fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + + self.thermal_solver.main_model_part.Conditions.clear() + self.thermal_solver.main_model_part.Elements.clear() + self.thermal_solver.main_model_part.Nodes.clear() + + + if not self.thermal_solver.main_model_part.HasSubModelPart("thermal_computing_domain"): + self.thermal_solver.main_model_part.CreateSubModelPart("thermal_computing_domain") + + + thermal_computing_domain=self.thermal_solver.main_model_part.GetSubModelPart("thermal_computing_domain") + + thermal_computing_domain.Conditions.clear() + thermal_computing_domain.Elements.clear() + thermal_computing_domain.Nodes.clear() + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain,"EulerianConvDiff3D","ThermalFace3D3N") + + + #self.thermal_solver.main_model_part.Conditions.clear() + + + #thermal_computing_domain.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + #thermal_computing_domain.Properties = self.fluid_solver.main_model_part.Properties + + + + #transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(thermal_computing_domain, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.CONDITIONS) + #transfer_process.Execute() + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(thermal_computing_domain) + neighbor_search.Execute() + + if(self.domain_size ==3): + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(thermal_computing_domain,3, 20) + neighbor_condition_search.Execute() + else: + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(thermal_computing_domain,2, 10) + neighbor_condition_search.Execute() + + + def ReMesh(self): + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.NODAL_H,0,self.mesh_element_size.GetDouble()); + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + #self.fluid_solver.main_model_part.Conditions.clear() + + #self.fluid_solver.main_model_part.Elements.clear() + + + if(self.domain_size ==3): + (self.Mesher).ReGenerateMesh("LagrangianFluidVMS3D","ThermalFace3D3N", self.fluid_solver.main_model_part, self.node_erase_process, True, False, 1.2, 0.01) #1.8 + else: + (self.Mesher).ReGenerateMesh("LagrangianFluidVMS2D","ThermalFace2D2N", self.fluid_solver.main_model_part, self.node_erase_process, True, False, 1.2, 0.01) #1.8 + + + #LagrangianFluidVMS3D + #VMS3D + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + if(self.domain_size ==3): + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + else: + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,2, 10) + neighbor_condition_search.Execute() + + (self.PfemM_apply_bc_process).Execute(); + + + + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + + + + pass + + + + def CalculateNorm(array_3d_value): + return math.sqrt(array_3d_value[0]**2+array_3d_value[1]**2+array_3d_value[2]**2) + + + def GetComputingModelPart(self): + return self.fluid_solver.GetComputingModelPart() + + def GetOutputVariables(self): + pass + + def ComputeDeltaTime(self): + + return self.fluid_solver._ComputeDeltaTime() + + def GetMinimumBufferSize(self): + buffer_size_fluid = self.fluid_solver.GetMinimumBufferSize() + buffer_size_thermal = self.thermal_solver.GetMinimumBufferSize() + return max(buffer_size_fluid, buffer_size_thermal) + + def Initialize(self): + self.fluid_solver.Initialize() + self.thermal_solver.Initialize() + + def Clear(self): + + (self.fluid_solver).Clear() + (self.thermal_solver).Clear() + + def Check(self): + (self.fluid_solver).Check() + (self.thermal_solver).Check() + + def SetEchoLevel(self, level): + (self.fluid_solver).SetEchoLevel(level) + (self.thermal_solver).SetEchoLevel(level) + + def AdvanceInTime(self, current_time): + + + #NOTE: the cloning is done ONLY ONCE since the nodes are shared + new_time = self.fluid_solver.AdvanceInTime(current_time) + return new_time + + def InitializeSolutionStep(self): + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 0.0) #NODES NOT + #if(node.IsFixed(KratosMultiphysics.VELOCITY_X)==True): + # node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + # node.Fix(KratosMultiphysics.TEMPERATURE) + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + #if(node.X<-0.02499): + #if(node.Z<0.00000098): + if(node.X<0.00000098): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + + + + + + + + #self.Streamline.MovingParticles(self.fluid_solver.main_model_part,100) + + #self.Streamline.RungeKutta4KernelbasedSI(self.fluid_solver.main_model_part,100) + + self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + + + + #self.inverted=False + + #self.inverted=self.Streamline.CheckInvertElement(self.fluid_solver.main_model_part,self.domain_size,self.mesh_element_size.GetDouble()) + + + + self.ReMesh() + self.new() + + + self.fluid_solver.InitializeSolutionStep() + + self.thermal_solver.InitializeSolutionStep() + + + + def Predict(self): + + self.fluid_solver.Predict() + + self.thermal_solver.Predict() + + def SolveSolutionStep(self): + + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + for node in self.fluid_solver.main_model_part.Nodes: + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + #if(node.X<-0.02499): + #if(node.Z<0.0000098): + if(node.X<0.0000098): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.Fix(KratosMultiphysics.TEMPERATURE) + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + + + + + + + + + + + #print("calculo de cautchy") + self.hypoelastic_solid_stress_tensor_calculate_process.Execute() + #print("entra al solver") + fluid_is_converged = self.fluid_solver.SolveSolutionStep() + + + for node in self.fluid_solver.main_model_part.Nodes: + velocity = node.GetSolutionStepValue(KratosMultiphysics.VELOCITY) + node.SetSolutionStepValue(KratosMultiphysics.MESH_VELOCITY, velocity) + + + #self.HeatSource.Heat_Source(self.fluid_solver.main_model_part) #heat source for the thermal problem + + thermal_is_converged = self.thermal_solver.SolveSolutionStep() + + + #self.Streamline.RungeKutta4KernelbasedSI(self.fluid_solver.main_model_part,100) + #self.Streamline.MovingParticles(self.fluid_solver.main_model_part,100) + self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + + return (fluid_is_converged) + + def FinalizeSolutionStep(self): + self.fluid_solver.FinalizeSolutionStep() + self.thermal_solver.FinalizeSolutionStep() + + def Solve(self): + + self.InitializeSolutionStep() + self.Predict() + self.SolveSolutionStep() + self.FinalizeSolutionStep() diff --git a/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithoutmeshgeneration.py b/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithoutmeshgeneration.py new file mode 100644 index 000000000000..3b10738d71c3 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/coupled_solid_thermal_solverwithoutmeshgeneration.py @@ -0,0 +1,992 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +import sys +import math +# Importing the Kratos Library +import KratosMultiphysics + +# Import applications +import KratosMultiphysics.FluidDynamicsApplication as KratosCFD +import KratosMultiphysics.ConvectionDiffusionApplication as ConvDiff +import KratosMultiphysics.MeshingApplication as MeshApp +import KratosMultiphysics.PfemMeltingApplication as PfemM + +import time as timer + +# Importing the base class +from KratosMultiphysics.python_solver import PythonSolver + +def CreateSolver(main_model_part, custom_settings): + + return PfemCoupledFluidThermalSolver(main_model_part, custom_settings) + +class PfemCoupledFluidThermalSolver(PythonSolver): + + @classmethod + def GetDefaultParameters(cls): + + default_settings = KratosMultiphysics.Parameters(""" + { + "solver_type" : "ThermallyCoupled1", + "domain_size" : -1, + "echo_level": 0, + "material_import_settings" : { + "materials_filename" : "file_name_to_be_defined.json" + }, + "environment_settings" : { + "gravity": [0, 0, 0], + "ambient_temperature" : 0.15 + }, + "mesh_element_size" : 0.0, + "fluid_solver_settings": { + "solver_type": "navier_stokes_solver_vmsmonolithic", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "unknown_name" + } + }, + "thermal_solver_settings": { + "solver_type": "Transient", + "analysis_type": "linear", + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "ThermalMaterials.json" + } + } + } + """) + + + default_settings.AddMissingParameters(super().GetDefaultParameters()) + return default_settings + + def __init__(self, model, custom_settings): + + super(PfemCoupledFluidThermalSolver, self).__init__(model, custom_settings) + + self.settings["fluid_solver_settings"].AddEmptyValue("alpha") + self.settings["fluid_solver_settings"]["alpha"].SetDouble(0.0) + self.settings["fluid_solver_settings"].AddEmptyValue("move_mesh_strategy") + self.settings["fluid_solver_settings"]["move_mesh_strategy"].SetInt(2) + self.settings["fluid_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["fluid_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + self.settings["thermal_solver_settings"].AddEmptyValue("reform_dofs_at_each_step") + self.settings["thermal_solver_settings"]["reform_dofs_at_each_step"].SetBool(True) + + ## Get domain size + self.domain_size = self.settings["domain_size"].GetInt() + + from KratosMultiphysics.FluidDynamicsApplication import python_solvers_wrapper_fluid + self.fluid_solver = python_solvers_wrapper_fluid.CreateSolverByParameters(self.model, self.settings["fluid_solver_settings"],"OpenMP") + + + + from KratosMultiphysics.ConvectionDiffusionApplication import python_solvers_wrapper_convection_diffusion + self.thermal_solver = python_solvers_wrapper_convection_diffusion.CreateSolverByParameters(self.model,self.settings["thermal_solver_settings"],"OpenMP") + + + + self.readmeshSettings() + + self.readenvironmentSettings() + + self.readMaterialCharacterization() + + self.Mesher = MeshApp.TetGenPfemModeler() + + self.modeler = KratosMultiphysics.ConnectivityPreserveModeler() + + self.PfemM_apply_bc_process = PfemM.PfemMeltingApplyBCProcess(self.fluid_solver.main_model_part); + + self.node_erase_process = KratosMultiphysics.NodeEraseProcess(self.fluid_solver.main_model_part); + + self.Streamline = PfemM.Streamline() + + self.faceheatflux = PfemM.FaceHeatFlux() + + self.HeatSource = PfemM.HeatSource() + + self.outstring3 = "Volumen_withoutmesh" + self.outputfile4 = open(self.outstring3, 'w') + + self.outstring5 = "computational_times" + self.outputfile6 = open(self.outstring5, 'w') + + + self.streamlineintegration=0.0 + self.fillingsubmodelparts=0.0 + self.initializeSolutionStep=0.0 + self.problemsolution=0.0 + self.meshingprocedure=0.0 + + self.hypoelastic_solid_stress_tensor_calculate_process=PfemM.HypoelasticStressCalculateProcess(self.fluid_solver.main_model_part, self.domain_size) + + + def readmeshSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + self.mesh_element_size=project_parameters["problem_data"]["mesh_element_size"] + + def readenvironmentSettings(self): + + with open("ProjectParameters.json",'r') as parameter_file: + project_parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + + self.gravity = [] + self.ambient_temperature=project_parameters["problem_data"]["environment_settings"]["ambient_temperature"] + self.gravity=project_parameters["problem_data"]["environment_settings"]["gravity"] + + def readLasserSettings(self): + + materials_filename = self.settings["laser_import_settings"]["laser_filename"].GetString() + + material_settings = KratosMultiphysics.Parameters("""{"Parameters": {"materials_filename": ""}} """) + + with open(self.settings["laser_import_settings"]["laser_filename"].GetString(), 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) ##laser_settings + + + mat = materials["properties"][0]["Material"] + + self.variables = [] + self.values = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables.append(var) + self.values.append(value) + + + for key, table in mat["Tables"].items(): + table_name = key + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table["output_variable"].GetString()) + self.new_table = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table["data"].size()): + self.new_table.AddRow(table["data"][i][0].GetDouble(), table["data"][i][1].GetDouble()) + + + def readMaterialCharacterization(self): + + materials_filename = self.settings["thermal_solver_settings"]["material_import_settings"]["materials_filename"].GetString() + + with open(materials_filename, 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) + + mat = materials["properties"][0]["Material"] + + self.variables_aux = [] + self.values_aux = [] + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + self.variables_aux.append(var) + self.values_aux.append(value) + + #The part below reads the temperature dependent viscosity + table1=mat["Tables"]["Table1"] + + input_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["input_variable"].GetString()) + output_var = KratosMultiphysics.KratosGlobals.GetVariable(table1["output_variable"].GetString()) + + read_materials_utility = KratosMultiphysics.ReadMaterialsUtility(self.model) + + read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[0]) + #read_materials_utility.AssignVariablesToProperty(mat, self.fluid_solver.main_model_part.GetProperties()[1]) + + '''self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DYNAMIC_VISCOSITY]=self.values_aux[6].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.DENSITY]=self.values_aux[5].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.EMISSIVITY]=self.values_aux[7].GetDouble() + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.values_aux[1].GetDouble() #298.0 + self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.CONVECTION_COEFFICIENT]=self.values_aux[4].GetDouble()''' + + + #self.fluid_solver.main_model_part.GetProperties()[0][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + self.fluid_solver.main_model_part.GetProperties()[1][KratosMultiphysics.AMBIENT_TEMPERATURE]=self.ambient_temperature.GetDouble() + + self.new_table_aux = KratosMultiphysics.PiecewiseLinearTable() + + for i in range(table1["data"].size()): + self.new_table_aux.AddRow(table1["data"][i][0].GetDouble(), table1["data"][i][1].GetDouble()) + + + def AddVariables(self): + # Import the fluid and thermal solver variables. Then merge them to have them in both fluid and thermal solvers. + + self.fluid_solver.AddVariables() + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FREE_SURFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_STRUCTURE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_BOUNDARY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_FLUID) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_LAGRANGIAN_INLET) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.DYNAMIC_VISCOSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.IS_INTERFACE) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.RADIATIVE_INTENSITY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NORMAL) + + + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ACTIVATION_ENERGY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_COEFFICIENT) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HEAT_OF_VAPORIZATION) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.ARRHENIUS_VALUE) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_XZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_YZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.DELTA_SIGMA_ZZ) + + + + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_XZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_YZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZX) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZY) + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(PfemM.HISTORICAL_SIGMA_ZZ) + + self.fluid_solver.main_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NODAL_AREA) + + + + self.thermal_solver.AddVariables() + + KratosMultiphysics.MergeVariableListsUtility().Merge(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part) + + def ImportModelPart(self): + # Call the fluid solver to import the model part from the mdpa + + self.fluid_solver.ImportModelPart() + + + # Save the convection diffusion settings + convection_diffusion_settings = self.thermal_solver.main_model_part.ProcessInfo.GetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS) + + # Here the fluid model part is cloned to be thermal model part so that the nodes are shared + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff2D", + "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, + self.thermal_solver.main_model_part, + "EulerianConvDiff3D", + "ThermalFace3D3N") + + + # Set the saved convection diffusion settings to the new thermal model part + self.thermal_solver.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS, convection_diffusion_settings) + + + def PrepareModelPart(self): + + + self.fluid_solver.PrepareModelPart() + + self.thermal_solver.PrepareModelPart() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 0.0) + parametersf=self.settings["fluid_solver_settings"] + + self.cleaning_submodelparts() + self.assign_nodally_properties(); + self.ReMesh() + + + def assign_nodally_properties(self): + #here we assign ACTIVATION_ENERGY, ARRHENIUS_COEFFICIENT and HEAT_OF_VAPORIZATION taken from FluidMaterial.json + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[0], self.values_aux[0].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[1], self.values_aux[1].GetDouble(), self.fluid_solver.main_model_part.Nodes) + KratosMultiphysics.VariableUtils().SetVariable(self.variables_aux[2], self.values_aux[2].GetDouble(), self.fluid_solver.main_model_part.Nodes) + + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_X,0,self.gravity[0].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Y,0,self.gravity[1].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.BODY_FORCE_Z,0,self.gravity[2].GetDouble()) + node.SetSolutionStepValue(KratosMultiphysics.TEMPERATURE,0,self.ambient_temperature.GetDouble()) + + + + + def AddDofs(self): + self.fluid_solver.AddDofs() + self.thermal_solver.AddDofs() + + + + def CalculateViscosityaux(self): + import math + for node in self.fluid_solver.main_model_part.Nodes: + rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + mu=self.new_table_aux.GetValue(T) + node.SetSolutionStepValue(KratosMultiphysics.VISCOSITY,0,mu/rho) + + + def cleaning_submodelparts(self): + + parametersf=self.settings["fluid_solver_settings"] + + parameters=self.settings["thermal_solver_settings"] + + self.skin_parts_list = [] + + if parametersf.Has("skin_parts"): + self.skin_parts_list = parametersf["skin_parts"] + + for i in range(self.skin_parts_list.size()): + body_model_part_name=self.skin_parts_list[i].GetString() + body_model_part_name=self.fluid_solver.main_model_part.GetSubModelPart(body_model_part_name) + body_model_part_name.Conditions.clear() + body_model_part_name.Elements.clear() + body_model_part_name.Nodes.clear() + + + + self.bodies_parts_list = [] + if parameters.Has("processes_sub_model_part_list"): + self.bodies_parts_list = parameters["processes_sub_model_part_list"] + + + def new(self): + + #if not self.fluid_solver.main_model_part.HasSubModelPart("fluid_computational_model_part"): + # ggggg + #fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + #fluid_computational_model_part.Conditions.clear() + #fluid_computational_model_part.Elements.clear() + #fluid_computational_model_part.Nodes.clear() + + ##newww + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + self.fluid_solver.main_model_part.Conditions.clear() + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + #(self.PfemM_apply_bc_process).Execute(); + + if not self.fluid_solver.main_model_part.HasSubModelPart("SkinDEMModelPart"): + print("nada") + else: + SkinDEMModelPart=self.fluid_solver.main_model_part.GetSubModelPart("SkinDEMModelPart") + SkinDEMModelPart.Conditions.clear() + SkinDEMModelPart.Elements.clear() + SkinDEMModelPart.Nodes.clear() + + skin_params = KratosMultiphysics.Parameters(""" + { + "name_auxiliar_model_part" : "SkinDEMModelPart", + "name_auxiliar_condition" : "Condition", + "echo_level" : 2 + }""") + + + skin_detection_process = KratosMultiphysics.SkinDetectionProcess3D(self.fluid_solver.main_model_part, skin_params) + + skin_detection_process.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.IS_FREE_SURFACE,0, 0.0) + + + for node in self.fluid_solver.main_model_part.GetSubModelPart("SkinDEMModelPart").Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 1.0) + + + + (self.PfemM_apply_bc_process).Execute(); + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + + ###end new + + + if not self.fluid_solver.main_model_part.HasSubModelPart("solid_model_part"): + solid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("solid_model_part") + + + if not self.fluid_solver.main_model_part.HasSubModelPart("fluid_model_part"): + fluid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("fluid_model_part") + + + solid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("solid_model_part") + solid_model_part.Elements.clear() + + fluid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("fluid_model_part") + fluid_model_part.Elements.clear() + + + #for node in self.fluid_solver.main_model_part.Nodes: + #rho = node.GetSolutionStepValue(KratosMultiphysics.DENSITY) + #T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + for elem in self.fluid_solver.main_model_part.Elements: + solid_model_part.AddElement(elem,0) + + + else: + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + + for elem in self.fluid_solver.main_model_part.Elements: + nnodes=0 + for node in elem.GetNodes(): + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + if(T >450.0): + #if (node.Z>0.0028 ): #or node.X<0.000): + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 0.0) + nnodes=nnodes+1; + if(nnodes>1): + fluid_model_part.AddElement(elem,0) + else: + solid_model_part.AddElement(elem,0) + + print("················") + print("fluid model part") + print(fluid_model_part) + + new_elem_name= "LagrangianFluidVMS3D" #"LagrangianFluidVMS3D"#"HYPO3D" + + new_cond_name= "ThermalFace3D3N" + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(fluid_model_part, self.settings["element_replace_settings"]).Execute() + + new_elem_name= "HYPO3D" #"LagrangianFluidVMS3D"#"HYPO3D" + + new_cond_name= "ThermalFace3D3N" + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(solid_model_part, self.settings["element_replace_settings"]).Execute() + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + #fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + #fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, fluid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, solid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + + #transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODES) + #transfer_process.Execute() + + + fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + + self.thermal_solver.main_model_part.Conditions.clear() + self.thermal_solver.main_model_part.Elements.clear() + self.thermal_solver.main_model_part.Nodes.clear() + + + if not self.thermal_solver.main_model_part.HasSubModelPart("thermal_computing_domain"): + self.thermal_solver.main_model_part.CreateSubModelPart("thermal_computing_domain") + + + thermal_computing_domain=self.thermal_solver.main_model_part.GetSubModelPart("thermal_computing_domain") + + thermal_computing_domain.Conditions.clear() + thermal_computing_domain.Elements.clear() + thermal_computing_domain.Nodes.clear() + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, thermal_computing_domain,"EulerianConvDiff3D","ThermalFace3D3N") + + + #self.thermal_solver.main_model_part.Conditions.clear() + + + thermal_computing_domain.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + thermal_computing_domain.Properties = self.fluid_solver.main_model_part.Properties + + + + #transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(thermal_computing_domain, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.CONDITIONS) + #transfer_process.Execute() + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(thermal_computing_domain) + neighbor_search.Execute() + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(thermal_computing_domain,3, 20) + neighbor_condition_search.Execute() + + + + + + def ReMesh(self): + + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.NODAL_H,0,self.mesh_element_size.GetDouble()); + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + #self.fluid_solver.main_model_part.Conditions.clear() + + #self.fluid_solver.main_model_part.Elements.clear() + + (self.Mesher).ReGenerateMesh("LagrangianFluidVMS3D","ThermalFace3D3N", self.fluid_solver.main_model_part, self.node_erase_process, True, False, 1.2, 0.01) #1.8 + + #LagrangianFluidVMS3D + #VMS3D + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + (self.PfemM_apply_bc_process).Execute(); + + + + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + + + + pass + + + + def CalculateNorm(array_3d_value): + return math.sqrt(array_3d_value[0]**2+array_3d_value[1]**2+array_3d_value[2]**2) + + + def GetComputingModelPart(self): + return self.fluid_solver.GetComputingModelPart() + + def GetOutputVariables(self): + pass + + def ComputeDeltaTime(self): + + return self.fluid_solver._ComputeDeltaTime() + + def GetMinimumBufferSize(self): + buffer_size_fluid = self.fluid_solver.GetMinimumBufferSize() + buffer_size_thermal = self.thermal_solver.GetMinimumBufferSize() + return max(buffer_size_fluid, buffer_size_thermal) + + def Initialize(self): + self.fluid_solver.Initialize() + self.thermal_solver.Initialize() + + def Clear(self): + + (self.fluid_solver).Clear() + (self.thermal_solver).Clear() + + def Check(self): + (self.fluid_solver).Check() + (self.thermal_solver).Check() + + def SetEchoLevel(self, level): + (self.fluid_solver).SetEchoLevel(level) + (self.thermal_solver).SetEchoLevel(level) + + def AdvanceInTime(self, current_time): + + + #NOTE: the cloning is done ONLY ONCE since the nodes are shared + new_time = self.fluid_solver.AdvanceInTime(current_time) + return new_time + + def InitializeSolutionStep(self): + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 0.0) #NODES NOT + #if(node.IsFixed(KratosMultiphysics.VELOCITY_X)==True): + # node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + # node.Fix(KratosMultiphysics.TEMPERATURE) + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + #if(node.X<-0.02499): + if(node.Z<0.00000098): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + + + + + + + + + self.Streamline.RungeKutta4ElementbasedSI(self.fluid_solver.main_model_part,100) + #self.Streamline.MovingParticles(self.fluid_solver.main_model_part,100) + + + + self.inverted=False + + print("ANTESSSSSSSS") + print(self.fluid_solver.main_model_part) + self.inverted=self.Streamline.CheckInvertElement(self.fluid_solver.main_model_part,self.domain_size,self.mesh_element_size.GetDouble()) + print("DESPUESSSSS") + print(self.fluid_solver.main_model_part) + + + #self.ReMesh() + #self.new() + + self.AuxReMesh() + + + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + self.filling_submodelparts() + self.modelpart() + else: + + + self.filling_submodelparts_aux() + self.modelpart() + + + self.fluid_solver.InitializeSolutionStep() + + self.thermal_solver.InitializeSolutionStep() + + + def modelpart(self): + if not self.fluid_solver.main_model_part.HasSubModelPart("solid_model_part"): + solid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("solid_model_part") + + + if not self.fluid_solver.main_model_part.HasSubModelPart("fluid_model_part"): + fluid_model_part= self.fluid_solver.main_model_part.CreateSubModelPart("fluid_model_part") + + + solid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("solid_model_part") + solid_model_part.Elements.clear() + + fluid_model_part= self.fluid_solver.main_model_part.GetSubModelPart("fluid_model_part") + fluid_model_part.Elements.clear() + + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + for elem in self.fluid_solver.main_model_part.Elements: + solid_model_part.AddElement(elem,0) + + + else: + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 1.0) + + for elem in self.fluid_solver.main_model_part.Elements: + nnodes=0 + for node in elem.GetNodes(): + T = node.GetSolutionStepValue(KratosMultiphysics.TEMPERATURE) + if(T >450.0): + #if (node.Z>0.0028 ): #or node.X<0.000): + node.SetSolutionStepValue(KratosMultiphysics.IS_INTERFACE,0, 0.0) + nnodes=nnodes+1; + if(nnodes>1): + fluid_model_part.AddElement(elem,0) + else: + solid_model_part.AddElement(elem,0) + + print("················") + print("fluid model part") + print(fluid_model_part) + + new_elem_name= "LagrangianFluidVMS3D" #"LagrangianFluidVMS3D"#"HYPO3D" + + new_cond_name= "ThermalFace3D3N" + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(fluid_model_part, self.settings["element_replace_settings"]).Execute() + + new_elem_name= "HYPO3D" #"LagrangianFluidVMS3D"#"HYPO3D" + + new_cond_name= "ThermalFace3D3N" + self.settings.AddValue("element_replace_settings", KratosMultiphysics.Parameters("""{}""")) + self.settings["element_replace_settings"].AddEmptyValue("element_name").SetString(new_elem_name) + self.settings["element_replace_settings"].AddEmptyValue("condition_name").SetString(new_cond_name) + #print(self.settings["element_replace_settings"]) + + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(solid_model_part, self.settings["element_replace_settings"]).Execute() + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + #fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + #fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, fluid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, solid_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.ELEMENTS) + transfer_process.Execute() + + + #transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODES) + #transfer_process.Execute() + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + #fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + #fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + def AuxReMesh(self): + + + for node in (self.fluid_solver.main_model_part).Nodes: + node.Set(KratosMultiphysics.TO_ERASE, False) + + + self.fluid_solver.main_model_part.Conditions.clear() + + + neighbor_search = KratosMultiphysics.FindGlobalNodalElementalNeighboursProcess(self.fluid_solver.main_model_part) + neighbor_search.Execute() + + (self.PfemM_apply_bc_process).Execute(); + + + skin_params = KratosMultiphysics.Parameters(""" + { + "name_auxiliar_model_part" : "SkinDEMModelPart", + "name_auxiliar_condition" : "Condition", + "echo_level" : 1 + }""") + + + skin_detection_process = KratosMultiphysics.SkinDetectionProcess3D(self.fluid_solver.main_model_part, skin_params) + + skin_detection_process.Execute() + + + neighbor_condition_search = KratosMultiphysics.FindConditionsNeighboursProcess(self.fluid_solver.main_model_part,3, 20) + neighbor_condition_search.Execute() + + + for node in self.fluid_solver.main_model_part.Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 0.0) + node.SetSolutionStepValue(KratosMultiphysics.IS_FREE_SURFACE,0, 0.0) + + + for node in self.fluid_solver.main_model_part.GetSubModelPart("SkinDEMModelPart").Nodes: + node.SetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY,0, 1.0) + + + + (self.PfemM_apply_bc_process).Execute(); + + KratosMultiphysics.VariableUtils().SetHistoricalVariableToZero(KratosMultiphysics.NORMAL, self.fluid_solver.main_model_part.Nodes) + normal_calculation_utils = KratosMultiphysics.NormalCalculationUtils() + + + normal_calculation_utils.CalculateOnSimplex(self.fluid_solver.main_model_part.Conditions, self.domain_size) + for node in self.fluid_solver.main_model_part.Nodes: + if(node.GetSolutionStepValue(KratosMultiphysics.IS_BOUNDARY)== 1.0): + solution_normal = node.GetSolutionStepValue(KratosMultiphysics.NORMAL) + solution_normal /= math.sqrt(solution_normal[0]**2+solution_normal[1]**2+solution_normal[2]**2) + node.SetSolutionStepValue(KratosMultiphysics.NORMAL, solution_normal) + + + pass + + + def filling_submodelparts(self): + + + fluid_computational_model_part=self.fluid_solver.main_model_part.GetSubModelPart("fluid_computational_model_part") + fluid_computational_model_part.Conditions.clear() + fluid_computational_model_part.Elements.clear() + fluid_computational_model_part.Nodes.clear() + + transfer_process = KratosMultiphysics.FastTransferBetweenModelPartsProcess(fluid_computational_model_part, self.fluid_solver.main_model_part, KratosMultiphysics.FastTransferBetweenModelPartsProcess.EntityTransfered.NODESANDELEMENTS) + transfer_process.Execute() + + + fluid_computational_model_part.ProcessInfo = self.fluid_solver.main_model_part.ProcessInfo + + fluid_computational_model_part.Properties = self.fluid_solver.main_model_part.Properties + + + if not self.thermal_solver.main_model_part.HasSubModelPart("thermal_computing_domain"): + self.thermal_solver.main_model_part.CreateSubModelPart("thermal_computing_domain") + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part,"EulerianConvDiff3D","ThermalFace3D3N") + + + def filling_submodelparts_aux(self): + + + + if self.domain_size == 2: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part, "EulerianConvDiff2D", "ThermalFace2D2N") + else: + self.modeler.GenerateModelPart(self.fluid_solver.main_model_part, self.thermal_solver.main_model_part,"EulerianConvDiff3D","ThermalFace3D3N") + + + def Predict(self): + + self.fluid_solver.Predict() + + self.thermal_solver.Predict() + + def SolveSolutionStep(self): + + + self.step=1 + if(self.step==self.fluid_solver.main_model_part.ProcessInfo[KratosMultiphysics.STEP]): + for node in self.fluid_solver.main_model_part.Nodes: + node.Free(KratosMultiphysics.VELOCITY_X) + node.Free(KratosMultiphysics.VELOCITY_Y) + node.Free(KratosMultiphysics.VELOCITY_Z) + #if(node.X<-0.02499): + if(node.Z<0.00000098): + node.Fix(KratosMultiphysics.VELOCITY_X) + node.Fix(KratosMultiphysics.VELOCITY_Y) + node.Fix(KratosMultiphysics.VELOCITY_Z) + node.Fix(KratosMultiphysics.TEMPERATURE) + node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0, 1.0) #NODES NOT + + + + + + + + + + + #print("calculo de cautchy") + self.hypoelastic_solid_stress_tensor_calculate_process.Execute() + #print("entra al solver") + fluid_is_converged = self.fluid_solver.SolveSolutionStep() + + + for node in self.fluid_solver.main_model_part.Nodes: + velocity = node.GetSolutionStepValue(KratosMultiphysics.VELOCITY) + node.SetSolutionStepValue(KratosMultiphysics.MESH_VELOCITY, velocity) + + + self.HeatSource.Heat_Source(self.fluid_solver.main_model_part) #heat source for the thermal problem + + thermal_is_converged = self.thermal_solver.SolveSolutionStep() + + + #self.Streamline.MovingParticles(self.fluid_solver.main_model_part,100) + + return (fluid_is_converged) + + def FinalizeSolutionStep(self): + self.fluid_solver.FinalizeSolutionStep() + self.thermal_solver.FinalizeSolutionStep() + + def Solve(self): + + self.InitializeSolutionStep() + self.Predict() + self.SolveSolutionStep() + self.FinalizeSolutionStep() diff --git a/applications/PfemMeltingApplication/python_scripts/pfem_melting_analysis.py b/applications/PfemMeltingApplication/python_scripts/pfem_melting_analysis.py new file mode 100644 index 000000000000..9393730f73d8 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/pfem_melting_analysis.py @@ -0,0 +1,63 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +# Importing Kratos +import KratosMultiphysics +from KratosMultiphysics.PfemMeltingApplication import python_solvers_wrapper_pfem_melting as solver_wrapper + +# Importing the base class +from KratosMultiphysics.analysis_stage import AnalysisStage + +# Other imports +import sys + +class PfemMeltingAnalysis(AnalysisStage): + """ + This class is the main-script of the ConvectionDiffusionApplication put in a class + + It can be imported and used as "black-box" + """ + def __init__(self, model, project_parameters): + # Making sure that older cases still work by properly initalizing the parameters + solver_settings = project_parameters["solver_settings"] + + if not solver_settings.Has("domain_size"): + KratosMultiphysics.Logger.PrintInfo("PfemMeltingAnalysis", "Using the old way to pass the domain_size, this will be removed!") + solver_settings.AddEmptyValue("domain_size") + solver_settings["domain_size"].SetInt(project_parameters["problem_data"]["domain_size"].GetInt()) + + super(PfemMeltingAnalysis, self).__init__(model, project_parameters) + + #### Internal functions #### + def _CreateSolver(self): + """ Create the Solver (and create and import the ModelPart if it is not alread in the model) """ + + ## Solver construction + return solver_wrapper.CreateSolverByParameters(self.model, self.project_parameters["solver_settings"],self.project_parameters["problem_data"]["parallel_type"].GetString()) + + def _GetSimulationName(self): + + return "::[Convection-Diffusion Simulation]:: " + +if __name__ == "__main__": + from sys import argv + pppppppppppppppppppppp + if len(argv) > 2: + err_msg = 'Too many input arguments!\n' + err_msg += 'Use this script in the following way:\n' + err_msg += '- With default ProjectParameters (read from "ProjectParameters.json"):\n' + err_msg += ' "python3 convection_diffusion_analysis.py"\n' + err_msg += '- With custom ProjectParameters:\n' + err_msg += ' "python3 convection_diffusion_analysis.py CustomProjectParameters.json"\n' + raise Exception(err_msg) + + if len(argv) == 2: # ProjectParameters is being passed from outside + project_parameters_file_name = argv[1] + else: # using default name + project_parameters_file_name = "ProjectParameters.json" + + with open(parameter_file_name,'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + lllllllllllllllllllllllllllll + model = KratosMultiphysics.Model() + simulation = PfemMeltingAnalysis(model, parameters) + simulation.Run() diff --git a/applications/PfemMeltingApplication/python_scripts/pfem_melting_solver.py b/applications/PfemMeltingApplication/python_scripts/pfem_melting_solver.py new file mode 100644 index 000000000000..1f47ee01c31f --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/pfem_melting_solver.py @@ -0,0 +1,639 @@ +from __future__ import print_function, absolute_import, division # makes KratosMultiphysics backward compatible with python 2.6 and 2.7 +sssssss +# Importing the Kratos Library +import KratosMultiphysics +import KratosMultiphysics.python_linear_solver_factory as linear_solver_factory +import KratosMultiphysics.base_convergence_criteria_factory as convergence_criteria_factory +sssssssssssss +# Import applications +import KratosMultiphysics.PfemMeltingApplication +import KratosMultiphysics.PfemMeltingApplication.check_and_prepare_model_process_convection_diffusion as check_and_prepare_model_process + +# Importing the base class +from KratosMultiphysics.python_solver import PythonSolver + +def CreateSolver(model, custom_settings): + return PfemMeltingSolver(model, custom_settings) + +class PfemMeltingSolver(PythonSolver): + """The base class for convection-diffusion solvers. + + This class provides functions for importing and exporting models, + adding nodal variables and dofs and solving each solution step. + + Derived classes must override the function _create_solution_scheme which + constructs and returns a solution scheme. Depending on the type of + solver, derived classes may also need to override the following functions: + + _create_solution_scheme + _create_convergence_criterion + _create_linear_solver + _create_builder_and_solver + _create_convection_diffusion_solution_strategy + + The convection_diffusion_solution_strategy, builder_and_solver, etc. should alway be retrieved + using the getter functions get_convection_diffusion_solution_strategy, get_builder_and_solver, + etc. from this base class. + + Only the member variables listed below should be accessed directly. + + Public member variables: + model -- the model containing the modelpart used to construct the solver. + settings -- Kratos parameters containing solver settings. + """ + + def __init__(self, model, custom_settings): + self._validate_settings_in_baseclass = True + super().__init__(model, custom_settings) + + # Convection diffusion variables check + self._PfemMeltingVariablesCheck(custom_settings) + + model_part_name = self.settings["model_part_name"].GetString() + + # Set default buffer size + self.min_buffer_size = 1 + + if model_part_name == "": + raise Exception('Please specify a model_part name!') + + # This will be changed once the Model is fully supported! + if self.model.HasModelPart(model_part_name): + self.main_model_part = self.model[model_part_name] + self.solver_imports_model_part = False + else: + self.main_model_part = self.model.CreateModelPart(model_part_name) # Model.CreateodelPart() + domain_size = self.settings["domain_size"].GetInt() + if domain_size < 0: + raise Exception('Please specify a "domain_size" >= 0!') + self.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.DOMAIN_SIZE, domain_size) + self.solver_imports_model_part = True + + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Construction finished") + + @classmethod + def GetDefaultParameters(cls): + default_settings = KratosMultiphysics.Parameters(""" + { + "model_part_name" : "ThermalModelPart", + "domain_size" : -1, + "echo_level": 0, + "analysis_type": "linear", + "solver_type": "convection_diffusion_solver", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "unknown_name" + }, + "computing_model_part_name" : "thermal_computing_domain", + "material_import_settings" :{ + "materials_filename": "" + }, + "convection_diffusion_variables" : { + "density_variable" : "DENSITY", + "diffusion_variable" : "CONDUCTIVITY", + "unknown_variable" : "TEMPERATURE", + "volume_source_variable" : "HEAT_FLUX", + "surface_source_variable" : "FACE_HEAT_FLUX", + "projection_variable" : "PROJECTED_SCALAR1", + "convection_variable" : "CONVECTION_VELOCITY", + "mesh_velocity_variable" : "MESH_VELOCITY", + "transfer_coefficient_variable" : "TRANSFER_COEFFICIENT", + "velocity_variable" : "VELOCITY", + "specific_heat_variable" : "SPECIFIC_HEAT", + "reaction_variable" : "REACTION_FLUX" + }, + "time_stepping" : { + "time_step": 1.0 + }, + "reform_dofs_at_each_step": false, + "line_search": false, + "compute_reactions": true, + "block_builder": true, + "clear_storage": false, + "move_mesh_flag": false, + "convergence_criterion": "residual_criterion", + "solution_relative_tolerance": 1.0e-4, + "solution_absolute_tolerance": 1.0e-9, + "residual_relative_tolerance": 1.0e-4, + "residual_absolute_tolerance": 1.0e-9, + "max_iteration": 10, + "linear_solver_settings":{ + "solver_type": "amgcl", + "smoother_type":"ilu0", + "krylov_type":"gmres", + "coarsening_type":"aggregation", + "max_iteration": 5000, + "tolerance": 1e-9, + "scaling": false + }, + "element_replace_settings" : { + "element_name" : "EulerianConvDiff", + "condition_name" : "ThermalFace" + }, + "problem_domain_sub_model_part_list": [""], + "processes_sub_model_part_list": [""], + "auxiliary_variables_list" : [] + } + """) + default_settings.AddMissingParameters(super().GetDefaultParameters()) + return default_settings + + def AddVariables(self, target_model_part=None): + lllllllllllllll + if target_model_part == None: + target_model_part = self.main_model_part + + ''' Add nodal solution step variables based on provided CONVECTION_DIFFUSION_SETTINGS + ''' + convention_diffusion_settings = KratosMultiphysics.ConvectionDiffusionSettings() + density_variable = self.settings["convection_diffusion_variables"]["density_variable"].GetString() + if (density_variable != ""): + convention_diffusion_settings.SetDensityVariable(KratosMultiphysics.KratosGlobals.GetVariable(density_variable)) + diffusion_variable = self.settings["convection_diffusion_variables"]["diffusion_variable"].GetString() + if (diffusion_variable != ""): + convention_diffusion_settings.SetDiffusionVariable(KratosMultiphysics.KratosGlobals.GetVariable(diffusion_variable)) + unknown_variable = self.settings["convection_diffusion_variables"]["unknown_variable"].GetString() + if (unknown_variable != ""): + convention_diffusion_settings.SetUnknownVariable(KratosMultiphysics.KratosGlobals.GetVariable(unknown_variable)) + volume_source_variable = self.settings["convection_diffusion_variables"]["volume_source_variable"].GetString() + if (volume_source_variable != ""): + convention_diffusion_settings.SetVolumeSourceVariable(KratosMultiphysics.KratosGlobals.GetVariable(volume_source_variable)) + surface_source_variable = self.settings["convection_diffusion_variables"]["surface_source_variable"].GetString() + if (surface_source_variable != ""): + convention_diffusion_settings.SetSurfaceSourceVariable(KratosMultiphysics.KratosGlobals.GetVariable(surface_source_variable)) + projection_variable = self.settings["convection_diffusion_variables"]["projection_variable"].GetString() + if (projection_variable != ""): + convention_diffusion_settings.SetProjectionVariable(KratosMultiphysics.KratosGlobals.GetVariable(projection_variable)) + convection_variable = self.settings["convection_diffusion_variables"]["convection_variable"].GetString() + if (convection_variable != ""): + convention_diffusion_settings.SetConvectionVariable(KratosMultiphysics.KratosGlobals.GetVariable(convection_variable)) + mesh_velocity_variable = self.settings["convection_diffusion_variables"]["mesh_velocity_variable"].GetString() + if (mesh_velocity_variable != ""): + convention_diffusion_settings.SetMeshVelocityVariable(KratosMultiphysics.KratosGlobals.GetVariable(mesh_velocity_variable)) + transfer_coefficient_variable = self.settings["convection_diffusion_variables"]["transfer_coefficient_variable"].GetString() + if (transfer_coefficient_variable != ""): + convention_diffusion_settings.SetTransferCoefficientVariable(KratosMultiphysics.KratosGlobals.GetVariable(transfer_coefficient_variable)) + velocity_variable = self.settings["convection_diffusion_variables"]["velocity_variable"].GetString() + if (velocity_variable != ""): + convention_diffusion_settings.SetVelocityVariable(KratosMultiphysics.KratosGlobals.GetVariable(velocity_variable)) + specific_heat_variable = self.settings["convection_diffusion_variables"]["specific_heat_variable"].GetString() + if (specific_heat_variable != ""): + convention_diffusion_settings.SetSpecificHeatVariable(KratosMultiphysics.KratosGlobals.GetVariable(specific_heat_variable)) + reaction_variable = self.settings["convection_diffusion_variables"]["reaction_variable"].GetString() + if (reaction_variable != ""): + convention_diffusion_settings.SetReactionVariable(KratosMultiphysics.KratosGlobals.GetVariable(reaction_variable)) + + target_model_part.ProcessInfo.SetValue(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS, convention_diffusion_settings) + + if target_model_part.ProcessInfo.Has(KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS): + if convention_diffusion_settings.IsDefinedDensityVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetDensityVariable()) + if convention_diffusion_settings.IsDefinedDiffusionVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetDiffusionVariable()) + if convention_diffusion_settings.IsDefinedUnknownVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetUnknownVariable()) + if convention_diffusion_settings.IsDefinedVolumeSourceVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetVolumeSourceVariable()) + if convention_diffusion_settings.IsDefinedSurfaceSourceVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetSurfaceSourceVariable()) + if convention_diffusion_settings.IsDefinedProjectionVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetProjectionVariable()) + if convention_diffusion_settings.IsDefinedConvectionVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetConvectionVariable()) + if convention_diffusion_settings.IsDefinedMeshVelocityVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetMeshVelocityVariable()) + if convention_diffusion_settings.IsDefinedTransferCoefficientVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetTransferCoefficientVariable()) + if convention_diffusion_settings.IsDefinedVelocityVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetVelocityVariable()) + if convention_diffusion_settings.IsDefinedSpecificHeatVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetSpecificHeatVariable()) + if convention_diffusion_settings.IsDefinedReactionVariable(): + target_model_part.AddNodalSolutionStepVariable(convention_diffusion_settings.GetReactionVariable()) + else: + raise Exception("The provided target_model_part does not have CONVECTION_DIFFUSION_SETTINGS defined.") + + # Adding nodal area variable (some solvers use it. TODO: Ask) + #target_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NODAL_AREA) + # If LaplacianElement is used + if (self.settings["element_replace_settings"]["element_name"].GetString() == "LaplacianElement"): + target_model_part.AddNodalSolutionStepVariable(KratosMultiphysics.NORMAL) + + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Variables ADDED") + + def GetMinimumBufferSize(self): + return self.min_buffer_size + + def AddDofs(self): + settings = self.main_model_part.ProcessInfo[KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS] + if settings.IsDefinedReactionVariable(): + KratosMultiphysics.VariableUtils().AddDof(settings.GetUnknownVariable(), settings.GetReactionVariable(),self.main_model_part) + else: + KratosMultiphysics.VariableUtils().AddDof(settings.GetUnknownVariable(), self.main_model_part) + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "DOF's ADDED") + + def ImportModelPart(self): + """This function imports the ModelPart""" + if self.solver_imports_model_part: + self._ImportModelPart(self.main_model_part, self.settings["model_import_settings"]) + + def PrepareModelPart(self): + if not self.is_restarted(): + # Check and prepare computing model part and import constitutive laws. + self._execute_after_reading() + + throw_errors = False + KratosMultiphysics.TetrahedralMeshOrientationCheck(self.main_model_part, throw_errors).Execute() + + KratosMultiphysics.ReplaceElementsAndConditionsProcess(self.main_model_part,self._get_element_condition_replace_settings()).Execute() + + self._set_and_fill_buffer() + + if (self.settings["echo_level"].GetInt() > 0): + KratosMultiphysics.Logger.PrintInfo(self.model) + + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]::", "ModelPart prepared for Solver.") + + def Initialize(self): + """Perform initialization after adding nodal variables and dofs to the main model part.""" + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Initializing ...") + # The convection_diffusion solution strategy is created here if it does not already exist. + if self.settings["clear_storage"].GetBool(): + self.Clear() + convection_diffusion_solution_strategy = self.get_convection_diffusion_solution_strategy() + convection_diffusion_solution_strategy.SetEchoLevel(self.settings["echo_level"].GetInt()) + if not self.is_restarted(): + convection_diffusion_solution_strategy.Initialize() + else: + # SetInitializePerformedFlag is not a member of SolvingStrategy but + # is used by ResidualBasedNewtonRaphsonStrategy. + try: + convection_diffusion_solution_strategy.SetInitializePerformedFlag(True) + except AttributeError: + pass + self.Check() + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Finished initialization.") + + def GetOutputVariables(self): + pass + + def Solve(self): + if self.settings["clear_storage"].GetBool(): + self.Clear() + convection_diffusion_solution_strategy = self.get_convection_diffusion_solution_strategy() + convection_diffusion_solution_strategy.Solve() + + def InitializeSolutionStep(self): + self.get_convection_diffusion_solution_strategy().InitializeSolutionStep() + + def Predict(self): + self.get_convection_diffusion_solution_strategy().Predict() + + def SolveSolutionStep(self): + is_converged = self.get_convection_diffusion_solution_strategy().SolveSolutionStep() + return is_converged + + def FinalizeSolutionStep(self): + self.get_convection_diffusion_solution_strategy().FinalizeSolutionStep() + + def AdvanceInTime(self, current_time): + dt = self.ComputeDeltaTime() + new_time = current_time + dt + self.main_model_part.ProcessInfo[KratosMultiphysics.STEP] += 1 + self.main_model_part.CloneTimeStep(new_time) + + return new_time + + def ComputeDeltaTime(self): + return self.settings["time_stepping"]["time_step"].GetDouble() + + def GetComputingModelPart(self): + return self.main_model_part.GetSubModelPart(self.settings["computing_model_part_name"].GetString()) + + def ExportModelPart(self): + name_out_file = self.settings["model_import_settings"]["input_filename"].GetString()+".out" + file = open(name_out_file + ".mdpa","w") + file.close() + KratosMultiphysics.ModelPartIO(name_out_file, KratosMultiphysics.IO.WRITE).WriteModelPart(self.main_model_part) + + def SetEchoLevel(self, level): + self.get_convection_diffusion_solution_strategy().SetEchoLevel(level) + + def Clear(self): + self.get_convection_diffusion_solution_strategy().Clear() + + def Check(self): + self.get_convection_diffusion_solution_strategy().Check() + + #### Specific internal functions #### + + def get_solution_scheme(self): + if not hasattr(self, '_solution_scheme'): + self._solution_scheme = self._create_solution_scheme() + return self._solution_scheme + + def get_convergence_criterion(self): + if not hasattr(self, '_convergence_criterion'): + self._convergence_criterion = self._create_convergence_criterion() + return self._convergence_criterion + + def get_linear_solver(self): + if not hasattr(self, '_linear_solver'): + self._linear_solver = self._create_linear_solver() + return self._linear_solver + + def get_builder_and_solver(self): + if not hasattr(self, '_builder_and_solver'): + self._builder_and_solver = self._create_builder_and_solver() + return self._builder_and_solver + + def get_convection_diffusion_solution_strategy(self): + if not hasattr(self, '_convection_diffusion_solution_strategy'): + self._convection_diffusion_solution_strategy = self._create_convection_diffusion_solution_strategy() + return self._convection_diffusion_solution_strategy + + def import_materials(self): + materials_filename = self.settings["material_import_settings"]["materials_filename"].GetString() + + if (materials_filename != ""): + print("@@@@@@@@@@@@@@@@@@@@@@@@22") + print(materials_filename) + + # Add constitutive laws and material properties from json file to model parts. + material_settings = KratosMultiphysics.Parameters("""{"Parameters": {"materials_filename": ""}} """) + material_settings["Parameters"]["materials_filename"].SetString(materials_filename) + KratosMultiphysics.ReadMaterialsUtility(material_settings, self.model) + + # We set the properties that are nodal + self._assign_nodally_properties() + materials_imported = True + else: + materials_imported = False + + return materials_imported + + def is_restarted(self): + # this function avoids the long call to ProcessInfo and is also safer + # in case the detection of a restart is changed later + return self.main_model_part.ProcessInfo[KratosMultiphysics.IS_RESTARTED] + + #### Private functions #### + + def _assign_nodally_properties(self): + + # We transfer the values of the con.diff variables to the nodes + with open(self.settings["material_import_settings"]["materials_filename"].GetString(), 'r') as parameter_file: + materials = KratosMultiphysics.Parameters(parameter_file.read()) + + for i in range(materials["properties"].size()): + model_part = self.model.GetModelPart(materials["properties"][i]["model_part_name"].GetString()) + mat = materials["properties"][i]["Material"] + + for key, value in mat["Variables"].items(): + var = KratosMultiphysics.KratosGlobals.GetVariable(key) + if (self._check_variable_to_set(var)): + if value.IsDouble(): + KratosMultiphysics.VariableUtils().SetVariable(var, value.GetDouble(), model_part.Nodes) + elif value.IsVector(): + KratosMultiphysics.VariableUtils().SetVariable(var, value.GetVector(), model_part.Nodes) + else: + raise ValueError("Type of value is not available") + + def _check_variable_to_set(self, var): + thermal_settings = self.main_model_part.ProcessInfo[KratosMultiphysics.CONVECTION_DIFFUSION_SETTINGS] + if (thermal_settings.IsDefinedDensityVariable()): + if (thermal_settings.GetDensityVariable() == var): + return True + if (thermal_settings.IsDefinedDiffusionVariable()): + if (thermal_settings.GetDiffusionVariable() == var): + return True + if (thermal_settings.IsDefinedVolumeSourceVariable()): + if (thermal_settings.GetVolumeSourceVariable() == var): + return True + if (thermal_settings.IsDefinedSurfaceSourceVariable()): + if (thermal_settings.GetSurfaceSourceVariable() == var): + return True + if (thermal_settings.IsDefinedProjectionVariable()): + if (thermal_settings.GetProjectionVariable() == var): + kkkkkkkkkkkk + return True + if (thermal_settings.IsDefinedConvectionVariable()): + if (thermal_settings.GetConvectionVariable() == var): + return True + if (thermal_settings.IsDefinedTransferCoefficientVariable()): + if (thermal_settings.GetTransferCoefficientVariable() == var): + return True + if (thermal_settings.IsDefinedSpecificHeatVariable()): + if (thermal_settings.GetSpecificHeatVariable() == var): + return True + else: + return False + + def _execute_after_reading(self): + """Prepare computing model part and import constitutive laws.""" + # Auxiliary parameters object for the CheckAndPepareModelProcess + params = KratosMultiphysics.Parameters("{}") + params.AddValue("computing_model_part_name",self.settings["computing_model_part_name"]) + params.AddValue("problem_domain_sub_model_part_list",self.settings["problem_domain_sub_model_part_list"]) + params.AddValue("processes_sub_model_part_list",self.settings["processes_sub_model_part_list"]) + # Assign mesh entities from domain and process sub model parts to the computing model part. + check_and_prepare_model_process.CheckAndPrepareModelProcess(self.main_model_part, params).Execute() + + # Import constitutive laws. + materials_imported = self.import_materials() + if materials_imported: + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Materials were successfully imported.") + else: + KratosMultiphysics.Logger.PrintInfo("::[ConvectionDiffusionSolver]:: ", "Materials were not imported.") + + def _set_and_fill_buffer(self): + """Prepare nodal solution step data containers and time step information.""" + # Set the buffer size for the nodal solution steps data. Existing nodal + # solution step data may be lost. + required_buffer_size = self.GetMinimumBufferSize() + current_buffer_size = self.main_model_part.GetBufferSize() + buffer_size = max(current_buffer_size, required_buffer_size) + self.main_model_part.SetBufferSize(buffer_size) + # Cycle the buffer. This sets all historical nodal solution step data to + # the current value and initializes the time stepping in the process info. + delta_time = self.main_model_part.ProcessInfo[KratosMultiphysics.DELTA_TIME] + time = self.main_model_part.ProcessInfo[KratosMultiphysics.TIME] + step =-buffer_size + time = time - delta_time * buffer_size + self.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.TIME, time) + for _ in range(0, buffer_size): + step = step + 1 + time = time + delta_time + self.main_model_part.ProcessInfo.SetValue(KratosMultiphysics.STEP, step) + self.main_model_part.CloneTimeStep(time) + + def _get_element_condition_replace_settings(self): + domain_size = self.main_model_part.ProcessInfo[KratosMultiphysics.DOMAIN_SIZE] + + ## Elements + num_nodes_elements = 0 + if (len(self.main_model_part.Elements) > 0): + for elem in self.main_model_part.Elements: + num_nodes_elements = len(elem.GetNodes()) + break + + num_nodes_elements = self.main_model_part.GetCommunicator().GetDataCommunicator().MaxAll(num_nodes_elements) + + element_name = self.settings["element_replace_settings"]["element_name"].GetString() + + if domain_size not in (2,3): + raise Exception("DOMAIN_SIZE not set") + + if element_name == "EulerianConvDiff": + if domain_size == 2: + if num_nodes_elements == 3: + self.settings["element_replace_settings"]["element_name"].SetString("EulerianConvDiff2D") + else: + self.settings["element_replace_settings"]["element_name"].SetString("EulerianConvDiff2D4N") + else: + if num_nodes_elements == 4: + self.settings["element_replace_settings"]["element_name"].SetString("EulerianConvDiff3D") + else: + self.settings["element_replace_settings"]["element_name"].SetString("EulerianConvDiff3D8N") + elif element_name in ("LaplacianElement","AdjointHeatDiffusionElement","QSConvectionDiffusionExplicit","DConvectionDiffusionExplicit"): + name_string = "{0}{1}D{2}N".format(element_name,domain_size, num_nodes_elements) + self.settings["element_replace_settings"]["element_name"].SetString(name_string) + + ## Conditions + num_conditions = self.main_model_part.GetCommunicator().GetDataCommunicator().SumAll(len(self.main_model_part.Conditions)) + + if num_conditions > 0: + num_nodes_conditions = 0 + if (len(self.main_model_part.Conditions) > 0): + for cond in self.main_model_part.Conditions: + num_nodes_conditions = len(cond.GetNodes()) + break + + num_nodes_conditions = self.main_model_part.GetCommunicator().GetDataCommunicator().MaxAll(num_nodes_conditions) + + condition_name = self.settings["element_replace_settings"]["condition_name"].GetString() + if condition_name in ("FluxCondition","ThermalFace","Condition"): + name_string = "{0}{1}D{2}N".format(condition_name,domain_size, num_nodes_conditions) + self.settings["element_replace_settings"]["condition_name"].SetString(name_string) + else: + self.settings["element_replace_settings"]["condition_name"].SetString("") + + return self.settings["element_replace_settings"] + + def _get_convergence_criterion_settings(self): + # Create an auxiliary Kratos parameters object to store the convergence settings. + conv_params = KratosMultiphysics.Parameters("{}") + conv_params.AddValue("convergence_criterion",self.settings["convergence_criterion"]) + conv_params.AddValue("echo_level",self.settings["echo_level"]) + conv_params.AddValue("solution_relative_tolerance",self.settings["solution_relative_tolerance"]) + conv_params.AddValue("solution_absolute_tolerance",self.settings["solution_absolute_tolerance"]) + conv_params.AddValue("residual_relative_tolerance",self.settings["residual_relative_tolerance"]) + conv_params.AddValue("residual_absolute_tolerance",self.settings["residual_absolute_tolerance"]) + + return conv_params + + def _create_convergence_criterion(self): + convergence_criterion = convergence_criteria_factory.ConvergenceCriteriaFactory(self._get_convergence_criterion_settings()) + return convergence_criterion.convergence_criterion + + def _create_linear_solver(self): + linear_solver = linear_solver_factory.ConstructSolver(self.settings["linear_solver_settings"]) + return linear_solver + + def _create_builder_and_solver(self): + linear_solver = self.get_linear_solver() + if self.settings["block_builder"].GetBool(): + builder_and_solver = KratosMultiphysics.ResidualBasedBlockBuilderAndSolver(linear_solver) + else: + builder_and_solver = KratosMultiphysics.ResidualBasedEliminationBuilderAndSolver(linear_solver) + return builder_and_solver + + @classmethod + def _create_solution_scheme(self): + """Create the solution scheme for the convection-diffusion problem.""" + raise Exception("Solution Scheme creation must be implemented in the derived class.") + + def _create_convection_diffusion_solution_strategy(self): + analysis_type = self.settings["analysis_type"].GetString() + + + if analysis_type == "linear": + convection_diffusion_solution_strategy = self._create_linear_strategy() + elif analysis_type == "non_linear": + if(self.settings["line_search"].GetBool() == False): + convection_diffusion_solution_strategy = self._create_newton_raphson_strategy() + else: + convection_diffusion_solution_strategy = self._create_line_search_strategy() + else: + err_msg = "The requested analysis type \"" + analysis_type + "\" is not available!\n" + err_msg += "Available options are: \"linear\", \"non_linear\"" + raise Exception(err_msg) + return convection_diffusion_solution_strategy + + def _create_linear_strategy(self): + computing_model_part = self.GetComputingModelPart() + convection_diffusion_scheme = self.get_solution_scheme() + builder_and_solver = self.get_builder_and_solver() + + return KratosMultiphysics.ResidualBasedLinearStrategy(computing_model_part, + convection_diffusion_scheme, + builder_and_solver, + self.settings["compute_reactions"].GetBool(), + self.settings["reform_dofs_at_each_step"].GetBool(), + False, + self.settings["move_mesh_flag"].GetBool()) + + def _create_newton_raphson_strategy(self): + computing_model_part = self.GetComputingModelPart() + convection_diffusion_scheme = self.get_solution_scheme() + convection_diffusion_convergence_criterion = self.get_convergence_criterion() + builder_and_solver = self.get_builder_and_solver() + + return KratosMultiphysics.ResidualBasedNewtonRaphsonStrategy(computing_model_part, + convection_diffusion_scheme, + convection_diffusion_convergence_criterion, + builder_and_solver, + self.settings["max_iteration"].GetInt(), + self.settings["compute_reactions"].GetBool(), + self.settings["reform_dofs_at_each_step"].GetBool(), + self.settings["move_mesh_flag"].GetBool()) + + def _create_line_search_strategy(self): + computing_model_part = self.GetComputingModelPart() + convection_diffusion_scheme = self.get_solution_scheme() + convection_diffusion_convergence_criterion = self.get_convergence_criterion() + builder_and_solver = self.get_builder_and_solver() + + return KratosMultiphysics.LineSearchStrategy(computing_model_part, + convection_diffusion_scheme, + convection_diffusion_convergence_criterion, + builder_and_solver, + self.settings["max_iteration"].GetInt(), + self.settings["compute_reactions"].GetBool(), + self.settings["reform_dofs_at_each_step"].GetBool(), + self.settings["move_mesh_flag"].GetBool()) + + def _ConvectionDiffusionVariablesCheck(self, custom_settings): + default_settings = self.GetDefaultParameters() + default_conv_diff_variables = default_settings["convection_diffusion_variables"] + if not custom_settings.Has("convection_diffusion_variables"): + KratosMultiphysics.Logger.PrintInfo(self.__class__.__name__, "\'convection_diffusion_variables\' not defined, taking default ", default_conv_diff_variables) + else: + custom_conv_diff_variables = custom_settings["convection_diffusion_variables"] + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "density_variable", default_conv_diff_variables["density_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "diffusion_variable", default_conv_diff_variables["diffusion_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "unknown_variable", default_conv_diff_variables["unknown_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "volume_source_variable", default_conv_diff_variables["volume_source_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "surface_source_variable", default_conv_diff_variables["surface_source_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "projection_variable", default_conv_diff_variables["projection_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "convection_variable", default_conv_diff_variables["convection_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "mesh_velocity_variable", default_conv_diff_variables["mesh_velocity_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "transfer_coefficient_variable", default_conv_diff_variables["transfer_coefficient_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "velocity_variable", default_conv_diff_variables["velocity_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "specific_heat_variable", default_conv_diff_variables["specific_heat_variable"].GetString()) + self._ConvectionDiffusionSingleVariableCheck(custom_conv_diff_variables, "reaction_variable", default_conv_diff_variables["reaction_variable"].GetString()) + + def _ConvectionDiffusionSingleVariableCheck(self, custom_conv_diff_variables, variable_entry, variable_name): + if not custom_conv_diff_variables.Has(variable_entry): + custom_conv_diff_variables.AddEmptyValue(variable_entry).SetString(variable_name) + KratosMultiphysics.Logger.PrintInfo(self.__class__.__name__, "\'{0}\' in \'convection_diffusion_variables\' not defined, taking default \'{1}\'.".format(variable_entry, variable_name)) diff --git a/applications/PfemMeltingApplication/python_scripts/python_solvers_wrapper_pfem_melting.py b/applications/PfemMeltingApplication/python_scripts/python_solvers_wrapper_pfem_melting.py new file mode 100644 index 000000000000..975c2edb2e27 --- /dev/null +++ b/applications/PfemMeltingApplication/python_scripts/python_solvers_wrapper_pfem_melting.py @@ -0,0 +1,68 @@ +from __future__ import print_function, absolute_import, division #makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +import KratosMultiphysics +from importlib import import_module + +def CreateSolverByParameters(model, solver_settings, parallelism): + + if (type(model) != KratosMultiphysics.Model): + raise Exception("input is expected to be provided as a Kratos Model object") + + if (type(solver_settings) != KratosMultiphysics.Parameters): + raise Exception("input is expected to be provided as a Kratos Parameters object") + + solver_type = solver_settings["solver_type"].GetString() + + # Solvers for OpenMP parallelism + if (parallelism == "OpenMP"): + # Coupled CFD-thermal solvers (volume coupling by Boussinesq approximation) + if (solver_type == "thermally_coupledpfem2" or solver_type == "ThermallyCoupledPfem2"): + + solver_module_name = "coupled_fluid_thermal_pfem2solver" + + elif (solver_type == "Withoutmesh"): + + solver_module_name = "coupled_fluid_thermal_solverwithoutmeshgeneration" + + elif (solver_type == "WithoutmeshSolid"): + + solver_module_name = "coupled_solid_thermal_solverwithoutmeshgeneration" + + elif (solver_type == "WithmeshSolid"): + + solver_module_name = "coupled_solid_thermal_solverwithmeshgeneration" + + # Coupled mechanical-thermal solver + # Wrong solver check + else: + err_msg = "The requested solver type {} is not in the python solvers wrapper\n".format(solver_type) + err_msg += "Available options are: \"transient\", \"stationary\", \"thermally_coupled\", \"thermo_mechanically_coupled\", \"conjugate_heat_transfer\" and \"adjoint_stationary\"" + raise Exception(err_msg) + + # Solvers for MPI parallelism + elif (parallelism == "MPI"): + err_msg = "The requested parallel type MPI is not yet available!\n" + raise Exception(err_msg) + + else: + err_msg = "The requested parallel type \"" + parallelism + "\" is not available!\n" + err_msg += "Available options are: \"OpenMP\", \"MPI\"" + raise Exception(err_msg) + + module_full = 'KratosMultiphysics.PfemMeltingApplication.' + solver_module_name + solver = import_module(module_full).CreateSolver(model, solver_settings) + + return solver + +def CreateSolver(model, custom_settings): + + if (type(model) != KratosMultiphysics.Model): + raise Exception("input is expected to be provided as a Kratos Model object") + + if (type(custom_settings) != KratosMultiphysics.Parameters): + raise Exception("input is expected to be provided as a Kratos Parameters object") + lllllllllllllllllllllllllllll + parallelism = custom_settings["problem_data"]["parallel_type"].GetString() + solver_settings = custom_settings["solver_settings"] + + return CreateSolverByParameters(model, solver_settings, parallelism) diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/LaserSettings.json b/applications/PfemMeltingApplication/test_examples/borrar.gid/LaserSettings.json new file mode 100644 index 000000000000..4c73d0d08f03 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/LaserSettings.json @@ -0,0 +1,53 @@ +{ + "laser_settings": { + "laser_profile": { + "shape": "flat", + "radius": 3.0, + "power": 10000000.0 + }, + "direction": [ + 0.0, + 0.0, + -1.0 + ], + "path": [ + { + "time": 0.0, + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + { + "time": 25.0, + "x": 3.0, + "y": 3.0, + "z": 0.0 + }, + { + "time": 50.0, + "x": -2.5, + "y": -2.5, + "z": 0.0 + }, + { + "time": 75.0, + "x": -3.0, + "y": -0.5, + "z": 0.0 + }, + { + "time": 100.0, + "x": 0.1, + "y": 0.25, + "z": 0.0 + } + + + + + + + + ] + } +} diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/MainKratos.py b/applications/PfemMeltingApplication/test_examples/borrar.gid/MainKratos.py new file mode 100644 index 000000000000..ad9d2658f425 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/MainKratos.py @@ -0,0 +1,36 @@ +from __future__ import print_function, absolute_import, division #makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +import KratosMultiphysics +import KratosMultiphysics.PfemMeltingApplication + + +from KratosMultiphysics.PfemMeltingApplication.pfem_melting_analysis import PfemMeltingAnalysis +import sys +import time + +class PfemMeltingAnalysisWithFlush(PfemMeltingAnalysis): + + def __init__(self,model,project_parameters,flush_frequency=10.0): + super(PfemMeltingAnalysisWithFlush,self).__init__(model,project_parameters) + + self.flush_frequency = flush_frequency + self.last_flush = time.time() + + def FinalizeSolutionStep(self): + super(PfemMeltingAnalysisWithFlush,self).FinalizeSolutionStep() + + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + +if __name__ == "__main__": + + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = PfemMeltingAnalysisWithFlush(model,parameters) + simulation.Run() + \ No newline at end of file diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/ProjectParameters.json b/applications/PfemMeltingApplication/test_examples/borrar.gid/ProjectParameters.json new file mode 100644 index 000000000000..59eededd1dac --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/ProjectParameters.json @@ -0,0 +1,160 @@ +{ + "problem_data" : { + "problem_name" : "borrar", + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 100, + "domain_size" : 3, + "material_settings" : { + "material_filename" : "materials.json" + }, + "environment_settings" : { + "gravity" : [0.0,0.0,-9.81], + "ambient_temperature" : 298.0 + }, + "mesh_element_size" : 1.0 + }, + "output_processes" : { + "gid_output" : [{ + "python_module" : "gid_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "GiDOutputProcess", + "help" : "This process writes postprocessing files for GiD", + "Parameters" : { + "model_part_name" : "ModelPart", + "output_name" : "borrar", + "postprocess_parameters" : { + "result_file_configuration" : { + "gidpost_flags" : { + "GiDPostMode" : "GiD_PostBinary", + "WriteDeformedMeshFlag" : "WriteDeformed", + "WriteConditionsFlag" : "WriteConditions", + "MultiFileFlag" : "MultipleFiles" + }, + "file_label" : "step", + "output_control_type" : "step", + "output_interval" : 100.0, + "body_output" : true, + "node_output" : false, + "skin_output" : false, + "plane_output" : [], + "nodal_results" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT", "VISCOSITY", "CONDUCTIVITY", "SPECIFIC_HEAT", "IS_STRUCTURE","IS_FREE_SURFACE"], + "gauss_point_results" : [], + "nodal_nonhistorical_results" : [] + }, + "point_data_configuration" : [] + } + } + }], + "vtk_output" : [{ + "python_module" : "vtk_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "VtkOutputProcess", + "help" : "This process writes postprocessing files for Paraview", + "Parameters" : { + "model_part_name" : "ModelPart", + "output_control_type" : "step", + "output_interval" : 1, + "file_format" : "ascii", + "output_precision" : 7, + "output_sub_model_parts" : false, + "output_path" : "vtk_output", + "save_output_files_in_folder" : true, + "nodal_solution_step_data_variables" : [], + "nodal_data_value_variables" : [], + "element_data_value_variables" : [], + "condition_data_value_variables" : [], + "gauss_point_variables_extrapolated_to_nodes" : [] + } + }] + }, + "restart_options" : { + "SaveRestart" : false, + "RestartFrequency" : 0, + "LoadRestart" : false, + "Restart_Step" : 0 + }, + "solver_settings" : { + "solver_type" : "ThermallyCoupledPfem2", + "domain_size" : 3, + "echo_level" : 0, + "fluid_solver_settings" : { + "model_part_name" : "ModelPart", + "domain_size" : 3, + "solver_type" : "Monolithic", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "borrar" + }, + "echo_level" : 0, + "compute_reactions" : false, + "relative_velocity_tolerance" : 0.001, + "absolute_velocity_tolerance" : 1e-5, + "relative_pressure_tolerance" : 0.001, + "absolute_pressure_tolerance" : 1e-5, + "skin_parts" : ["VelocityConstraints3D_floor"], + "volume_model_part_name" : "ModelPart", + "time_stepping" : { + "time_step" : 0.01, + "automatic_time_step" : false + }, + "formulation" : { + "element_type" : "vms", + "use_orthogonal_subscales" : false, + "dynamic_tau" : 0.0 + } + }, + "thermal_solver_settings" : { + "model_part_name" : "Thermal", + "domain_size" : 3, + "solver_type" : "transient", + "analysis_type" : "non_linear", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "borrar" + }, + "material_import_settings" : { + "materials_filename" : "materials.json" + }, + "time_integration_method" : "implicit", + "echo_level" : 0, + "compute_reactions" : false, + "max_iteration" : 10, + "line_search" : false, + "convergence_criterion" : "residual_criterion", + "solution_relative_tolerance" : 1e-5, + "solution_absolute_tolerance" : 1e-7, + "residual_relative_tolerance" : 1e-5, + "residual_absolute_tolerance" : 1e-7, + "problem_domain_sub_model_part_list" : ["ModelPart"], + "time_stepping" : { + "time_step" : 0.01 + }, + "transient_parameters" : { + "theta" : 0.5, + "dynamic_tau" : 1.0 + } + } + }, + "processes" : { + "constraints_process_list" : [{ + "python_module" : "assign_vector_variable_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "AssignVectorVariableProcess", + "Parameters" : { + "model_part_name" : "ModelPart.VelocityConstraints3D_floor", + "variable_name" : "VELOCITY", + "constrained" : [true,true,true], + "value" : [0.0,0.0,0.0] + } + },{ + "python_module" : "apply_laser_process", + "kratos_module" : "KratosMultiphysics.PfemMeltingApplication", + "Parameters" : { + "model_part_name" : "ModelPart", + "filename" : "LaserSettings.json" + } + }] + } +} diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.cnd b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.cnd new file mode 100644 index 000000000000..983cc10fdeb8 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.cnd @@ -0,0 +1,35 @@ +NUMBER: 1 CONDITION: point_Local_axes +CONDTYPE: over points +CONDMESHTYPE: over nodes +QUESTION: Local_Axes#LA#(-GLOBAL-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 2 CONDITION: line_Local_axes +CONDTYPE: over lines +QUESTION: Local_Axes#LA#(-GLOBAL-,-Automatic-,-Automatic_alt-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 3 CONDITION: surface_Local_axes +CONDTYPE: over surfaces +QUESTION: Local_Axes#LA#(-GLOBAL-,-Automatic-,-Automatic_alt-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 4 CONDITION: volume_Local_axes +CONDTYPE: over volumes +CONDMESHTYPE: over body elements +QUESTION: Local_Axes#LA#(-GLOBAL-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 5 CONDITION: element_pairs +CONDTYPE: over volumes +CONDMESHTYPE: over body elements +CANREPEAT: yes +QUESTION: pair_name +VALUE: - +END CONDITION +NUMBER: 6 CONDITION: relation_line_geo_mesh +CONDTYPE: over lines +CONDMESHTYPE: over body elements +QUESTION: id#FUNC#(NumEntity) +VALUE: 0 +END CONDITION diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.err b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.err new file mode 100644 index 000000000000..6291b27da750 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.err @@ -0,0 +1,22 @@ +Traceback (most recent call last): + File "MainKratos.py", line 34, in + simulation = PfemMeltingAnalysisWithFlush(model,parameters) + File "MainKratos.py", line 14, in __init__ + super(PfemMeltingAnalysisWithFlush,self).__init__(model,project_parameters) + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/pfem_melting_analysis.py", line 28, in __init__ + super(PfemMeltingAnalysis, self).__init__(model, project_parameters) + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/analysis_stage.py", line 41, in __init__ + self._GetSolver().AddVariables() # this creates the solver and adds the variables + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/analysis_stage.py", line 206, in _GetSolver + self._solver = self._CreateSolver() + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/pfem_melting_analysis.py", line 35, in _CreateSolver + return solver_wrapper.CreateSolverByParameters(self.model, self.project_parameters["solver_settings"],self.project_parameters["problem_data"]["parallel_type"].GetString()) + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/python_solvers_wrapper_pfem_melting.py", line 40, in CreateSolverByParameters + solver = import_module(module_full).CreateSolver(model, solver_settings) + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/coupled_fluid_thermal_pfem2solver.py", line 21, in CreateSolver + return PfemCoupledFluidThermalSolver(main_model_part, custom_settings) + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/coupled_fluid_thermal_pfem2solver.py", line 85, in __init__ + self.readMaterialCharacterization() + File "/home/maceli/GiDx64/gid15.1.3d-x64/problemtypes/kratos.gid/exec/Kratos/KratosMultiphysics/PfemMeltingApplication/coupled_fluid_thermal_pfem2solver.py", line 165, in readMaterialCharacterization + with open(materials_filename, 'r') as parameter_file: +FileNotFoundError: [Errno 2] No such file or directory: 'file_name_to_be_defined.json' diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.geo b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.geo new file mode 100644 index 000000000000..e06a644c02d8 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.geo differ diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.info b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.info new file mode 100644 index 000000000000..347107fe932c --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.info @@ -0,0 +1,30 @@ + | / | + ' / __| _` | __| _ \ __| + . \ | ( | | ( |\__ \ +_|\_\_| \__,_|\__|\___/ ____/ + Multi-Physics 9.0."Dev"-0a3d18113e-Release +Compiled with threading support. +Maximum number of threads: 1. +Importing KratosPfemMeltingApplication + KRATOS + _____ __ __ __ _ _ _ +| __ \ / _| | \/ | | | | (_) +| |__) | |_ ___ _ __ ___ | \ / | ___| | |_ _ _ __ __ _ +| ___/| _/ _ \ '_ ` _ \| |\/| |/ _ \ | __| | '_ \ / _` | +| | | || __/ | | | | | | | | __/ | |_| | | | | (_| | +|_| |_| \___|_| |_| |_|_| |_|\___|_|\__|_|_| |_|\__, | + __/ | + |___/ APPLICATION +Importing KratosFluidDynamicsApplication +Initializing KratosFluidDynamicsApplication... +Importing KratosConvectionDiffusionApplication + KRATOS ___ ___ _ ___ __ ___ ___ ___ ___ + / __/ _ || || | | / /__| |_ _| __| __| + | (_| (_) | .` || V /___| |) | || _|| _| + |___|___/|_||_| |_/ |___/___|_| |_| APPLICATION +Importing KratosMeshingApplication +Initializing KratosMeshingApplication... +NavierStokesSolverMonolithic: Construction of NavierStokesSolverMonolithic finished. +::[ConvectionDiffusionSolver]:: : Construction finished +ConvectionDiffusionTransientSolver: Construction finished +KRATOS TERMINATED WITH ERROR diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.lin b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.lin new file mode 100644 index 000000000000..5e780cbdcb47 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.lin differ diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.mdpa b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.mdpa new file mode 100644 index 000000000000..24ba95cbca22 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.mdpa @@ -0,0 +1,1213 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties + +Begin Nodes + 1 5.0000000000 5.0000000000 0.0000000000 + 2 5.0000000000 4.0000000000 0.0000000000 + 3 4.0000000000 5.0000000000 0.0000000000 + 4 5.0000000000 5.0000000000 1.0000000000 + 5 4.1818331185 4.5079273153 0.3333333333 + 6 5.0000000000 4.0000000000 1.0000000000 + 7 4.0000000000 5.0000000000 1.0000000000 + 8 4.1345444764 3.7040136062 0.0000000000 + 9 4.1345444764 3.7040136062 1.0000000000 + 10 3.0000000000 5.0000000000 0.0000000000 + 11 5.0000000000 3.0000000000 0.0000000000 + 12 3.2499005822 3.9475763523 0.0000000000 + 13 3.0000000000 5.0000000000 1.0000000000 + 14 5.0000000000 3.0000000000 1.0000000000 + 15 3.2499005822 3.9475763523 1.0000000000 + 16 3.6396151855 2.9284435060 0.0000000000 + 17 3.6396151855 2.9284435060 1.0000000000 + 18 4.1707453978 2.5320162093 0.6635028943 + 19 2.4116129623 4.1245512569 0.0000000000 + 20 2.4116129623 4.1245512569 1.0000000000 + 21 2.0000000000 5.0000000000 0.0000000000 + 22 5.0000000000 2.0000000000 0.0000000000 + 23 3.5465383952 2.2616166555 0.2546440076 + 24 2.0000000000 5.0000000000 1.0000000000 + 25 5.0000000000 2.0000000000 1.0000000000 + 26 2.4532460546 3.0626646168 0.0000000000 + 27 4.0000000000 1.9282032303 0.0000000000 + 28 2.7940072572 2.6756411978 0.4182146692 + 29 2.4532460546 3.0626646168 1.0000000000 + 30 4.0000000000 1.9282032303 1.0000000000 + 31 3.0000000000 1.9282032303 0.0000000000 + 32 1.4320963751 3.8342522708 0.0000000000 + 33 3.0000000000 1.9282032303 1.0000000000 + 34 1.4320963751 3.8342522708 1.0000000000 + 35 1.0000000000 5.0000000000 0.0000000000 + 36 5.0000000000 1.0000000000 0.0000000000 + 37 1.0247785896 4.3708176355 0.4407407407 + 38 1.0000000000 5.0000000000 1.0000000000 + 39 5.0000000000 1.0000000000 1.0000000000 + 40 1.5000000000 2.7942286341 0.0000000000 + 41 3.5000000000 1.0621778265 0.0000000000 + 42 1.5000000000 2.7942286341 1.0000000000 + 43 2.0000000000 1.9282032303 0.0000000000 + 44 3.5000000000 1.0621778265 1.0000000000 + 45 2.0000000000 1.9282032303 1.0000000000 + 46 0.7116049876 3.8044701456 0.6222222222 + 47 2.5000000000 1.0621778265 0.0000000000 + 48 2.5000000000 1.0621778265 1.0000000000 + 49 4.0000000000 0.1961524227 0.0000000000 + 50 0.0000000000 5.0000000000 0.0000000000 + 51 5.0000000000 -0.0000000000 0.0000000000 + 52 4.0000000000 0.1961524227 1.0000000000 + 53 0.5000000000 2.7942286341 0.0000000000 + 54 1.0000000000 1.9282032303 0.0000000000 + 55 0.0396192101 4.0438009037 0.0000000000 + 56 0.0000000000 5.0000000000 1.0000000000 + 57 5.0000000000 -0.0000000000 1.0000000000 + 58 0.5000000000 2.7942286341 1.0000000000 + 59 1.0000000000 1.9282032303 1.0000000000 + 60 0.0396192101 4.0438009037 1.0000000000 + 61 3.0000000000 0.1961524227 0.0000000000 + 62 1.5000000000 1.0621778265 0.0000000000 + 63 3.0000000000 0.1961524227 1.0000000000 + 64 1.5000000000 1.0621778265 1.0000000000 + 65 -0.1666666667 3.5395846265 0.6666666667 + 66 2.0000000000 0.1961524227 0.0000000000 + 67 2.0000000000 0.1961524227 1.0000000000 + 68 3.0277777778 -0.3995382364 0.2546440076 + 69 4.2642597024 -0.7639688448 0.5817853308 + 70 -0.0000000000 1.9282032303 0.0000000000 + 71 3.5833333333 -0.7248941509 0.0000000000 + 72 -0.5000000000 2.7942286341 0.0000000000 + 73 -0.0000000000 1.9282032303 1.0000000000 + 74 0.5000000000 1.0621778265 0.0000000000 + 75 3.5833333333 -0.7248941509 1.0000000000 + 76 -1.0000000000 5.0000000000 0.0000000000 + 77 5.0000000000 -1.0000000000 0.0000000000 + 78 -0.5000000000 2.7942286341 1.0000000000 + 79 0.5000000000 1.0621778265 1.0000000000 + 80 -1.0000000000 5.0000000000 1.0000000000 + 81 5.0000000000 -1.0000000000 1.0000000000 + 82 2.5000000000 -0.6698729811 0.0000000000 + 83 1.0000000000 0.1961524227 0.0000000000 + 84 -1.1547619048 3.8838967868 0.0000000000 + 85 2.5000000000 -0.6698729811 1.0000000000 + 86 1.0000000000 0.1961524227 1.0000000000 + 87 -1.1547619048 3.8838967868 1.0000000000 + 88 4.6666666667 -1.5119661283 0.7453559924 + 89 4.0000000000 -1.5358983849 0.0000000000 + 90 1.5000000000 -0.6698729811 0.0000000000 + 91 4.0000000000 -1.5358983849 1.0000000000 + 92 1.5000000000 -0.6698729811 1.0000000000 + 93 -1.0000000000 1.9282032303 0.0000000000 + 94 -0.5000000000 1.0621778265 0.0000000000 + 95 -1.0000000000 1.9282032303 1.0000000000 + 96 3.0000000000 -1.5358983849 0.0000000000 + 97 -0.5000000000 1.0621778265 1.0000000000 + 98 -1.5000000000 2.7942286341 0.0000000000 + 99 3.0000000000 -1.5358983849 1.0000000000 + 100 -0.0000000000 0.1961524227 0.0000000000 + 101 -1.5000000000 2.7942286341 1.0000000000 + 102 -2.0000000000 5.0000000000 0.0000000000 + 103 5.0000000000 -2.0000000000 0.0000000000 + 104 -0.0000000000 0.1961524227 1.0000000000 + 105 -1.0000000000 1.3508529611 0.5962847939 + 106 -2.0000000000 5.0000000000 1.0000000000 + 107 5.0000000000 -2.0000000000 1.0000000000 + 108 -2.0000000000 3.6602540378 0.0000000000 + 109 -2.0913470974 4.4166183094 0.4764708333 + 110 2.0000000000 -1.5358983849 0.0000000000 + 111 -2.0000000000 3.6602540378 1.0000000000 + 112 0.5000000000 -0.6698729811 0.0000000000 + 113 2.0000000000 -1.5358983849 1.0000000000 + 114 4.4504146466 -2.2504221544 0.4432607902 + 115 0.5000000000 -0.6698729811 1.0000000000 + 116 3.5833333333 -2.3349364905 0.0000000000 + 117 3.5833333333 -2.3349364905 1.0000000000 + 118 -1.5000000000 1.0621778265 0.0000000000 + 119 -2.0000000000 1.9282032303 0.0000000000 + 120 1.0000000000 -1.5358983849 0.0000000000 + 121 -1.5000000000 1.0621778265 1.0000000000 + 122 1.5250000000 -1.8101397627 0.5664705542 + 123 -1.0000000000 0.1961524227 0.0000000000 + 124 -2.0000000000 1.9282032303 1.0000000000 + 125 1.0000000000 -1.5358983849 1.0000000000 + 126 -1.0000000000 0.1961524227 1.0000000000 + 127 2.5000000000 -2.4019237886 0.0000000000 + 128 -2.5000000000 2.7942286341 0.0000000000 + 129 2.5000000000 -2.4019237886 1.0000000000 + 130 -2.5000000000 2.7942286341 1.0000000000 + 131 -0.5000000000 -0.6698729811 0.0000000000 + 132 -2.7029235861 3.1873549705 0.5350069252 + 133 -2.8430283232 3.9494447786 0.5986111111 + 134 -0.5000000000 -0.6698729811 1.0000000000 + 135 -3.0000000000 5.0000000000 0.0000000000 + 136 5.0000000000 -3.0000000000 0.0000000000 + 137 -3.0000000000 5.0000000000 1.0000000000 + 138 5.0000000000 -3.0000000000 1.0000000000 + 139 1.5000000000 -2.4019237886 0.0000000000 + 140 -0.0000000000 -1.5358983849 0.0000000000 + 141 -1.4750000000 -0.0780889552 0.5664705542 + 142 1.5000000000 -2.4019237886 1.0000000000 + 143 -3.1889957660 3.7914518843 0.0000000000 + 144 -0.0000000000 -1.5358983849 1.0000000000 + 145 4.0000000000 -3.2679491924 0.0000000000 + 146 -3.1889957660 3.7914518843 1.0000000000 + 147 -3.3390036053 4.5423471134 0.4814814815 + 148 4.0000000000 -3.2679491924 1.0000000000 + 149 -2.5000000000 1.0621778265 0.0000000000 + 150 -2.0000000000 0.1961524227 0.0000000000 + 151 3.0000000000 -3.2679491924 0.0000000000 + 152 -2.5000000000 1.0621778265 1.0000000000 + 153 -2.0000000000 0.1961524227 1.0000000000 + 154 3.0000000000 -3.2679491924 1.0000000000 + 155 -3.0000000000 1.9282032303 0.0000000000 + 156 -1.5000000000 -0.6698729811 0.0000000000 + 157 -3.0000000000 1.9282032303 1.0000000000 + 158 0.5000000000 -2.4019237886 0.0000000000 + 159 -1.5000000000 -0.6698729811 1.0000000000 + 160 0.5000000000 -2.4019237886 1.0000000000 + 161 -3.5000000000 2.7942286341 0.0000000000 + 162 2.0000000000 -3.2679491924 0.0000000000 + 163 -3.5000000000 2.7942286341 1.0000000000 + 164 2.0000000000 -3.2679491924 1.0000000000 + 165 -1.0000000000 -1.5358983849 0.0000000000 + 166 -1.0000000000 -1.5358983849 1.0000000000 + 167 5.0000000000 -4.0000000000 0.0000000000 + 168 -4.0000000000 5.0000000000 0.0000000000 + 169 -3.9699120924 3.8957342021 0.4938271605 + 170 5.0000000000 -4.0000000000 1.0000000000 + 171 -4.0000000000 5.0000000000 1.0000000000 + 172 1.0000000000 -3.2679491924 0.0000000000 + 173 -0.0000000000 -2.6905989232 0.5962847939 + 174 3.5833333333 -4.1116454968 0.0000000000 + 175 -0.5000000000 -2.4019237886 0.0000000000 + 176 1.0000000000 -3.2679491924 1.0000000000 + 177 -4.1339745962 3.5000000000 0.0000000000 + 178 3.5833333333 -4.1116454968 1.0000000000 + 179 -0.5000000000 -2.4019237886 1.0000000000 + 180 -4.1339745962 3.5000000000 1.0000000000 + 181 -3.0000000000 0.1961524227 0.0000000000 + 182 -3.5000000000 1.0621778265 0.0000000000 + 183 -3.0000000000 0.1961524227 1.0000000000 + 184 -2.5000000000 -0.6698729811 0.0000000000 + 185 -3.5000000000 1.0621778265 1.0000000000 + 186 4.5359272105 -4.3873715048 0.6666666667 + 187 -2.5000000000 -0.6698729811 1.0000000000 + 188 2.5000000000 -4.1339745962 0.0000000000 + 189 -4.0000000000 1.9282032303 0.0000000000 + 190 2.5000000000 -4.1339745962 1.0000000000 + 191 -4.0000000000 1.9282032303 1.0000000000 + 192 -2.0000000000 -1.5358983849 0.0000000000 + 193 -4.5815757573 4.7068115284 0.4979423868 + 194 -2.0000000000 -1.5358983849 1.0000000000 + 195 -0.0000000000 -3.2679491924 0.0000000000 + 196 -0.0000000000 -3.2679491924 1.0000000000 + 197 1.5000000000 -4.1339745962 0.0000000000 + 198 1.5000000000 -4.1339745962 1.0000000000 + 199 -1.5000000000 -2.4019237886 0.0000000000 + 200 -1.5000000000 -2.4019237886 1.0000000000 + 201 -2.0000000000 -2.1132486541 0.5962847939 + 202 -5.0000000000 5.0000000000 0.0000000000 + 203 5.0000000000 -5.0000000000 0.0000000000 + 204 -5.0000000000 4.0000000000 0.0000000000 + 205 4.0000000000 -5.0000000000 0.0000000000 + 206 -5.0000000000 5.0000000000 1.0000000000 + 207 5.0000000000 -5.0000000000 1.0000000000 + 208 -5.0000000000 4.0000000000 1.0000000000 + 209 4.0000000000 -5.0000000000 1.0000000000 + 210 -0.0000000000 -3.8452994616 0.4037152061 + 211 0.5000000000 -4.1339745962 0.0000000000 + 212 -5.0000000000 3.0000000000 0.0000000000 + 213 3.0000000000 -5.0000000000 0.0000000000 + 214 -4.0000000000 0.1961524227 0.0000000000 + 215 -1.0000000000 -3.2679491924 0.0000000000 + 216 0.5000000000 -4.1339745962 1.0000000000 + 217 -5.0000000000 3.0000000000 1.0000000000 + 218 3.0000000000 -5.0000000000 1.0000000000 + 219 -4.0000000000 0.1961524227 1.0000000000 + 220 -1.0000000000 -3.2679491924 1.0000000000 + 221 -3.5833333333 -0.7248941509 0.0000000000 + 222 -3.0000000000 -1.5358983849 0.0000000000 + 223 -3.5833333333 -0.7248941509 1.0000000000 + 224 -3.0000000000 -1.5358983849 1.0000000000 + 225 -5.0000000000 2.0000000000 0.0000000000 + 226 2.0000000000 -5.0000000000 0.0000000000 + 227 -5.0000000000 2.0000000000 1.0000000000 + 228 2.0000000000 -5.0000000000 1.0000000000 + 229 -2.5000000000 -2.4019237886 0.0000000000 + 230 -2.5000000000 -2.4019237886 1.0000000000 + 231 -0.5000000000 -4.1339745962 0.0000000000 + 232 -0.5000000000 -4.1339745962 1.0000000000 + 233 -5.0000000000 1.0000000000 0.0000000000 + 234 1.0000000000 -5.0000000000 0.0000000000 + 235 -5.0000000000 1.0000000000 1.0000000000 + 236 1.0000000000 -5.0000000000 1.0000000000 + 237 -2.0000000000 -3.2679491924 0.0000000000 + 238 -2.0000000000 -3.2679491924 1.0000000000 + 239 -4.2642597024 -0.7639688448 0.5817853308 + 240 -4.0000000000 -1.5358983849 0.0000000000 + 241 -4.0000000000 -1.5358983849 1.0000000000 + 242 -5.0000000000 0.0000000000 0.0000000000 + 243 -0.0000000000 -5.0000000000 0.0000000000 + 244 -1.5000000000 -4.1339745962 0.0000000000 + 245 -5.0000000000 0.0000000000 1.0000000000 + 246 -0.0000000000 -5.0000000000 1.0000000000 + 247 -1.5000000000 -4.1339745962 1.0000000000 + 248 -3.0000000000 -3.2679491924 0.0000000000 + 249 -3.7857142857 -2.4299455633 0.0000000000 + 250 -3.0000000000 -3.2679491924 1.0000000000 + 251 -3.7857142857 -2.4299455633 1.0000000000 + 252 -5.0000000000 -1.0000000000 0.0000000000 + 253 -1.0000000000 -5.0000000000 0.0000000000 + 254 -4.6666666667 -1.5119661283 0.7453559924 + 255 -5.0000000000 -1.0000000000 1.0000000000 + 256 -1.0000000000 -5.0000000000 1.0000000000 + 257 -4.3534289960 -2.1181437111 0.3450126944 + 258 -2.5000000000 -4.1339745962 0.0000000000 + 259 -2.5000000000 -4.1339745962 1.0000000000 + 260 -5.0000000000 -2.0000000000 0.0000000000 + 261 -2.0000000000 -5.0000000000 0.0000000000 + 262 -4.0000000000 -3.2679491924 0.0000000000 + 263 -5.0000000000 -2.0000000000 1.0000000000 + 264 -2.0000000000 -5.0000000000 1.0000000000 + 265 -4.0000000000 -3.2679491924 1.0000000000 + 266 -3.0277777778 -4.4152066977 0.7453559924 + 267 -3.5833333333 -4.1116454968 0.0000000000 + 268 -3.5833333333 -4.1116454968 1.0000000000 + 269 -5.0000000000 -3.0000000000 0.0000000000 + 270 -3.0000000000 -5.0000000000 0.0000000000 + 271 -5.0000000000 -3.0000000000 1.0000000000 + 272 -3.0000000000 -5.0000000000 1.0000000000 + 273 -4.5359272105 -4.3873715048 0.3333333333 + 274 -5.0000000000 -4.0000000000 0.0000000000 + 275 -4.0000000000 -5.0000000000 0.0000000000 + 276 -5.0000000000 -4.0000000000 1.0000000000 + 277 -4.0000000000 -5.0000000000 1.0000000000 + 278 -5.0000000000 -5.0000000000 0.0000000000 + 279 -5.0000000000 -5.0000000000 1.0000000000 +End Nodes + + +Begin Elements Element3D4N// GUI group identifier: body + 1 0 89 96 116 117 + 2 0 91 117 99 89 + 3 0 71 96 89 75 + 4 0 75 91 99 89 + 5 0 240 222 221 223 + 6 0 241 223 224 240 + 7 0 16 8 12 9 + 8 0 17 15 9 12 + 9 0 268 265 250 262 + 10 0 267 248 262 268 + 11 0 151 174 145 148 + 12 0 154 148 178 174 + 13 0 163 180 146 177 + 14 0 161 143 177 163 + 15 0 19 12 10 20 + 16 0 20 13 15 12 + 17 0 234 226 197 236 + 18 0 64 67 86 62 + 19 0 199 237 215 200 + 20 0 264 259 247 244 + 21 0 131 112 100 134 + 22 0 176 164 198 197 + 23 0 183 219 185 182 + 24 0 195 172 158 196 + 25 0 165 199 175 166 + 26 0 149 118 119 152 + 27 0 115 92 125 90 + 28 0 231 253 243 232 + 29 0 211 197 172 216 + 30 0 124 152 157 119 + 31 0 142 129 164 139 + 32 0 74 83 62 79 + 33 0 179 220 200 215 + 34 0 198 190 228 226 + 35 0 90 110 82 92 + 36 0 238 220 247 244 + 37 0 104 86 115 83 + 38 0 192 222 229 230 + 39 0 231 244 253 232 + 40 0 234 197 211 236 + 41 0 45 59 42 40 + 42 0 216 236 246 211 + 43 0 176 142 164 139 + 44 0 66 90 82 67 + 45 0 204 212 177 208 + 46 0 238 247 259 244 + 47 0 158 120 140 160 + 48 0 115 86 92 90 + 49 0 192 184 222 224 + 50 0 261 258 270 272 + 51 0 152 183 185 182 + 52 0 211 172 195 216 + 53 0 31 41 27 30 + 54 0 125 92 113 110 + 55 0 256 264 247 244 + 56 0 190 218 228 226 + 57 0 140 112 131 134 + 58 0 237 248 258 259 + 59 0 104 79 86 83 + 60 0 197 226 188 198 + 61 0 237 244 215 238 + 62 0 33 30 44 31 + 63 0 264 272 259 258 + 64 0 100 112 83 104 + 65 0 216 196 176 172 + 66 0 139 162 127 164 + 67 0 238 259 250 237 + 68 0 175 199 215 179 + 69 0 119 155 149 152 + 70 0 144 134 115 140 + 71 0 261 244 258 264 + 72 0 172 197 162 176 + 73 0 194 224 187 184 + 74 0 208 180 217 212 + 75 0 62 83 66 86 + 76 0 160 144 125 120 + 77 0 232 256 247 244 + 78 0 236 216 198 197 + 79 0 112 120 90 115 + 80 0 181 182 214 183 + 81 0 67 85 92 82 + 82 0 253 244 261 256 + 83 0 188 226 213 218 + 84 0 152 124 121 119 + 85 0 100 83 74 104 + 86 0 196 160 176 158 + 87 0 166 179 200 199 + 88 0 236 198 228 226 + 89 0 120 110 90 125 + 90 0 200 220 238 215 + 91 0 149 182 181 183 + 92 0 134 104 115 112 + 93 0 211 243 234 246 + 94 0 172 162 139 176 + 95 0 194 230 224 192 + 96 0 92 85 113 82 + 97 0 43 40 54 45 + 98 0 232 246 256 253 + 99 0 216 176 198 197 + 100 0 112 90 83 115 + 101 0 237 258 244 259 + 102 0 79 64 86 62 + 103 0 94 100 74 104 + 104 0 97 104 126 94 + 105 0 162 197 188 164 + 106 0 98 108 128 130 + 107 0 121 124 95 119 + 108 0 229 237 199 200 + 109 0 191 163 157 155 + 110 0 47 41 31 44 + 111 0 63 48 44 61 + 112 0 113 129 142 139 + 113 0 110 127 96 99 + 114 0 155 128 161 163 + 115 0 124 157 130 119 + 116 0 194 166 200 199 + 117 0 64 79 59 62 + 118 0 54 70 74 59 + 119 0 165 175 140 166 + 120 0 158 139 120 160 + 121 0 150 118 149 153 + 122 0 126 153 121 118 + 123 0 160 142 176 139 + 124 0 43 54 62 45 + 125 0 48 45 33 47 + 126 0 211 231 243 232 + 127 0 220 196 232 231 + 128 0 61 49 41 52 + 129 0 86 67 92 90 + 130 0 159 194 187 184 + 131 0 181 150 149 183 + 132 0 94 70 93 73 + 133 0 79 97 73 94 + 134 0 131 165 140 134 + 135 0 179 196 220 215 + 136 0 158 172 139 176 + 137 0 97 79 104 94 + 138 0 164 190 198 188 + 139 0 123 118 150 153 + 140 0 101 130 111 98 + 141 0 230 200 238 237 + 142 0 47 31 43 33 + 143 0 48 33 44 47 + 144 0 215 231 195 196 + 145 0 83 90 66 86 + 146 0 156 184 192 194 + 147 0 113 99 129 127 + 148 0 157 163 130 155 + 149 0 59 79 73 70 + 150 0 74 70 94 79 + 151 0 166 144 179 175 + 152 0 175 215 195 179 + 153 0 160 125 142 120 + 154 0 153 152 121 118 + 155 0 110 139 127 113 + 156 0 119 128 155 130 + 157 0 192 199 165 166 + 158 0 62 54 74 59 + 159 0 45 64 59 62 + 160 0 216 246 232 211 + 161 0 63 44 52 61 + 162 0 183 152 153 149 + 163 0 189 155 161 163 + 164 0 61 41 47 44 + 165 0 118 93 119 95 + 166 0 97 95 73 93 + 167 0 94 123 100 126 + 168 0 134 144 166 140 + 169 0 104 134 126 100 + 170 0 131 123 156 126 + 171 0 162 188 151 154 + 172 0 97 126 121 94 + 173 0 119 93 98 95 + 174 0 62 47 43 45 + 175 0 215 244 231 220 + 176 0 64 48 67 62 + 177 0 230 238 250 237 + 178 0 144 115 125 120 + 179 0 82 110 96 99 + 180 0 159 187 153 150 + 181 0 184 150 181 183 + 182 0 194 159 166 156 + 183 0 73 78 58 72 + 184 0 70 72 93 73 + 185 0 156 165 131 134 + 186 0 120 139 110 122 + 187 0 120 139 122 142 + 188 0 139 122 142 113 + 189 0 122 142 113 125 + 190 0 122 142 125 120 + 191 0 113 122 125 110 + 192 0 125 122 120 110 + 193 0 113 122 110 139 + 194 0 123 150 156 141 + 195 0 156 123 141 126 + 196 0 123 141 126 153 + 197 0 141 126 153 159 + 198 0 141 126 159 156 + 199 0 153 141 159 150 + 200 0 159 141 156 150 + 201 0 153 141 150 123 + 202 0 101 124 130 98 + 203 0 129 154 164 127 + 204 0 229 199 192 201 + 205 0 192 229 201 230 + 206 0 229 201 230 200 + 207 0 201 230 200 194 + 208 0 201 230 194 192 + 209 0 200 201 194 199 + 210 0 194 201 192 199 + 211 0 200 201 199 229 + 212 0 54 53 70 59 + 213 0 59 58 42 40 + 214 0 196 216 232 210 + 215 0 196 216 210 195 + 216 0 210 196 195 231 + 217 0 195 210 231 211 + 218 0 195 210 211 216 + 219 0 210 231 211 232 + 220 0 210 211 216 232 + 221 0 210 231 232 196 + 222 0 182 155 189 191 + 223 0 67 63 85 82 + 224 0 152 185 157 182 + 225 0 66 61 47 48 + 226 0 95 101 78 98 + 227 0 94 93 118 105 + 228 0 93 118 105 95 + 229 0 105 93 95 97 + 230 0 95 105 97 121 + 231 0 95 105 121 118 + 232 0 105 97 121 94 + 233 0 105 121 118 94 + 234 0 105 97 94 93 + 235 0 144 160 179 175 + 236 0 158 175 195 173 + 237 0 195 158 173 196 + 238 0 173 195 196 179 + 239 0 196 173 179 160 + 240 0 196 173 160 158 + 241 0 173 179 160 175 + 242 0 173 160 158 175 + 243 0 173 179 175 195 + 244 0 134 159 126 156 + 245 0 127 162 151 154 + 246 0 164 154 190 188 + 247 0 124 101 95 98 + 248 0 98 128 119 130 + 249 0 64 45 48 62 + 250 0 220 232 247 244 + 251 0 54 40 53 59 + 252 0 66 82 61 67 + 253 0 85 99 113 82 + 254 0 149 155 182 152 + 255 0 187 183 153 150 + 256 0 93 72 98 78 + 257 0 73 95 78 93 + 258 0 159 134 166 156 + 259 0 140 175 158 160 + 260 0 140 120 112 115 + 261 0 156 150 184 159 + 262 0 192 165 156 166 + 263 0 70 53 72 58 + 264 0 59 73 58 70 + 265 0 229 248 237 250 + 266 0 185 191 157 182 + 267 0 62 66 47 48 + 268 0 67 48 63 61 + 269 0 94 118 123 126 + 270 0 100 123 131 126 + 271 0 248 249 262 251 + 272 0 250 265 251 262 + 273 0 98 84 108 111 + 274 0 101 111 87 84 + 275 0 10 21 19 20 + 276 0 13 20 24 21 + 277 0 11 2 8 9 + 278 0 14 9 6 2 + 279 0 270 267 275 277 + 280 0 272 277 268 267 + 281 0 218 178 209 205 + 282 0 213 205 174 178 + 283 0 96 127 116 117 + 284 0 99 117 129 127 + 285 0 222 184 221 223 + 286 0 224 223 187 184 + 287 0 82 96 71 75 + 288 0 85 75 99 82 + 289 0 181 214 221 183 + 290 0 183 223 219 214 + 291 0 61 71 49 52 + 292 0 63 52 75 61 + 293 0 258 248 267 259 + 294 0 259 268 250 248 + 295 0 151 188 174 154 + 296 0 154 178 190 188 + 297 0 249 222 240 251 + 298 0 251 241 224 240 + 299 0 26 12 19 20 + 300 0 29 20 15 12 + 301 0 151 145 116 148 + 302 0 154 117 148 151 + 303 0 270 258 267 266 + 304 0 270 258 266 272 + 305 0 266 270 272 267 + 306 0 258 266 272 259 + 307 0 266 272 259 268 + 308 0 266 272 268 267 + 309 0 259 266 268 267 + 310 0 258 266 259 267 + 311 0 174 188 213 178 + 312 0 178 218 190 188 + 313 0 221 184 181 183 + 314 0 223 183 187 184 + 315 0 85 63 75 68 + 316 0 85 63 68 82 + 317 0 68 85 82 75 + 318 0 63 68 82 61 + 319 0 68 82 61 71 + 320 0 68 82 71 75 + 321 0 61 68 71 75 + 322 0 63 68 61 75 + 323 0 116 127 151 117 + 324 0 117 154 129 127 + 325 0 249 262 251 269 + 326 0 265 251 262 271 + 327 0 84 108 111 109 + 328 0 84 108 109 102 + 329 0 108 109 102 135 + 330 0 108 111 109 133 + 331 0 109 108 133 143 + 332 0 108 133 143 132 + 333 0 133 143 132 146 + 334 0 133 143 146 147 + 335 0 133 143 147 135 + 336 0 132 133 146 111 + 337 0 146 133 147 137 + 338 0 147 133 135 137 + 339 0 135 147 137 168 + 340 0 135 147 168 143 + 341 0 108 133 132 111 + 342 0 143 146 147 169 + 343 0 147 143 169 168 + 344 0 146 147 169 171 + 345 0 143 132 146 163 + 346 0 143 146 169 177 + 347 0 169 143 177 168 + 348 0 109 102 135 137 + 349 0 147 146 137 171 + 350 0 137 147 171 168 + 351 0 147 171 168 169 + 352 0 133 146 111 137 + 353 0 111 109 133 137 + 354 0 132 146 163 130 + 355 0 163 132 130 128 + 356 0 132 130 128 108 + 357 0 128 132 108 143 + 358 0 132 146 130 111 + 359 0 130 132 111 108 + 360 0 128 132 143 161 + 361 0 128 132 161 163 + 362 0 146 169 177 180 + 363 0 169 177 180 208 + 364 0 146 169 180 171 + 365 0 180 169 208 171 + 366 0 132 143 161 163 + 367 0 133 143 135 109 + 368 0 109 84 102 76 + 369 0 102 109 76 80 + 370 0 111 87 84 109 + 371 0 111 87 109 106 + 372 0 87 84 109 76 + 373 0 43 26 40 29 + 374 0 45 42 29 40 + 375 0 169 177 208 204 + 376 0 169 177 204 168 + 377 0 252 260 240 254 + 378 0 252 260 254 255 + 379 0 254 252 255 239 + 380 0 255 254 239 241 + 381 0 254 239 241 240 + 382 0 255 254 241 263 + 383 0 255 254 263 260 + 384 0 254 241 263 257 + 385 0 263 254 257 260 + 386 0 254 241 257 240 + 387 0 254 257 260 240 + 388 0 257 260 240 249 + 389 0 240 257 249 251 + 390 0 257 249 251 269 + 391 0 257 263 260 271 + 392 0 241 257 240 251 + 393 0 257 260 249 269 + 394 0 241 257 251 263 + 395 0 254 252 239 240 + 396 0 252 255 239 219 + 397 0 257 260 269 271 + 398 0 239 241 240 223 + 399 0 239 241 223 255 + 400 0 252 239 240 221 + 401 0 239 240 221 223 + 402 0 221 239 223 214 + 403 0 221 239 214 252 + 404 0 223 239 255 219 + 405 0 223 239 219 214 + 406 0 257 251 263 271 + 407 0 239 219 214 252 + 408 0 103 77 89 88 + 409 0 103 77 88 81 + 410 0 77 88 81 69 + 411 0 88 81 69 91 + 412 0 69 88 91 89 + 413 0 88 81 91 107 + 414 0 88 81 107 103 + 415 0 91 88 107 114 + 416 0 88 107 114 103 + 417 0 91 88 114 89 + 418 0 114 88 103 89 + 419 0 103 114 89 116 + 420 0 114 89 116 117 + 421 0 107 114 103 138 + 422 0 114 91 89 117 + 423 0 77 88 69 89 + 424 0 81 77 69 52 + 425 0 114 91 117 107 + 426 0 116 114 117 148 + 427 0 91 69 89 75 + 428 0 91 69 75 81 + 429 0 103 114 116 145 + 430 0 69 77 89 71 + 431 0 89 69 71 75 + 432 0 69 71 75 52 + 433 0 75 69 52 81 + 434 0 114 116 145 148 + 435 0 107 114 138 148 + 436 0 109 111 106 137 + 437 0 33 17 30 23 + 438 0 30 33 23 31 + 439 0 33 23 31 28 + 440 0 23 31 28 16 + 441 0 28 23 16 17 + 442 0 23 31 16 27 + 443 0 23 31 27 30 + 444 0 16 23 27 18 + 445 0 23 27 18 30 + 446 0 18 23 30 17 + 447 0 16 23 18 17 + 448 0 30 18 17 14 + 449 0 27 18 30 22 + 450 0 18 16 17 14 + 451 0 33 23 28 17 + 452 0 31 33 28 43 + 453 0 27 16 18 11 + 454 0 16 28 17 12 + 455 0 31 28 16 26 + 456 0 31 28 26 43 + 457 0 28 16 26 12 + 458 0 28 26 43 29 + 459 0 28 26 29 12 + 460 0 27 18 22 11 + 461 0 30 18 14 25 + 462 0 30 18 25 22 + 463 0 18 14 25 22 + 464 0 28 33 17 29 + 465 0 28 33 29 45 + 466 0 17 28 29 15 + 467 0 28 33 45 43 + 468 0 29 28 45 43 + 469 0 106 109 137 102 + 470 0 106 109 102 80 + 471 0 106 109 80 87 + 472 0 2 8 9 5 + 473 0 2 8 5 3 + 474 0 8 5 3 12 + 475 0 8 9 5 12 + 476 0 5 3 12 7 + 477 0 5 3 7 4 + 478 0 7 5 4 6 + 479 0 5 2 3 1 + 480 0 3 5 1 4 + 481 0 5 2 1 6 + 482 0 5 1 4 6 + 483 0 5 2 6 9 + 484 0 6 5 9 7 + 485 0 5 9 7 15 + 486 0 5 9 15 12 + 487 0 269 274 262 271 + 488 0 271 265 276 274 + 489 0 167 136 145 170 + 490 0 170 148 138 136 + 491 0 16 8 9 11 + 492 0 19 21 32 20 + 493 0 20 34 24 21 + 494 0 133 135 137 109 + 495 0 208 169 204 193 + 496 0 204 208 193 206 + 497 0 208 193 206 171 + 498 0 193 206 171 202 + 499 0 193 206 202 204 + 500 0 202 193 204 168 + 501 0 202 193 168 171 + 502 0 193 168 171 169 + 503 0 193 168 169 204 + 504 0 171 193 169 208 + 505 0 233 242 214 245 + 506 0 235 219 245 233 + 507 0 51 36 49 57 + 508 0 57 52 39 36 + 509 0 69 77 71 49 + 510 0 71 69 49 52 + 511 0 69 49 52 77 + 512 0 35 50 55 56 + 513 0 38 60 56 55 + 514 0 40 26 32 29 + 515 0 42 34 29 40 + 516 0 174 145 148 170 + 517 0 148 178 174 170 + 518 0 268 265 262 274 + 519 0 262 267 268 274 + 520 0 177 161 163 189 + 521 0 50 55 56 76 + 522 0 60 56 55 80 + 523 0 18 22 11 14 + 524 0 11 18 14 16 + 525 0 109 76 80 87 + 526 0 19 32 26 20 + 527 0 20 29 34 32 + 528 0 36 22 27 39 + 529 0 39 30 25 22 + 530 0 3 10 12 7 + 531 0 7 15 13 12 + 532 0 267 275 277 273 + 533 0 267 275 273 274 + 534 0 275 277 273 279 + 535 0 275 273 274 278 + 536 0 273 274 278 276 + 537 0 273 274 276 268 + 538 0 275 273 278 279 + 539 0 273 278 279 276 + 540 0 279 273 276 277 + 541 0 273 267 274 268 + 542 0 273 267 268 277 + 543 0 268 273 277 276 + 544 0 178 209 205 186 + 545 0 178 209 186 170 + 546 0 209 205 186 203 + 547 0 209 186 170 207 + 548 0 186 170 207 167 + 549 0 186 170 167 174 + 550 0 209 186 207 203 + 551 0 186 207 203 167 + 552 0 203 186 167 205 + 553 0 186 178 170 174 + 554 0 186 178 174 205 + 555 0 174 186 205 167 + 556 0 143 146 177 163 + 557 0 14 17 9 16 + 558 0 17 9 16 12 + 559 0 15 5 12 7 + 560 0 82 90 92 67 + 561 0 126 104 100 94 + 562 0 224 194 192 184 + 563 0 162 127 164 154 + 564 0 164 162 154 188 + 565 0 215 199 200 179 + 566 0 97 73 94 93 + 567 0 24 38 21 34 + 568 0 164 129 127 139 + 569 0 129 127 139 113 + 570 0 92 125 90 110 + 571 0 94 74 79 104 + 572 0 74 79 104 83 + 573 0 180 177 212 208 + 574 0 157 191 155 182 + 575 0 155 157 182 152 + 576 0 155 157 152 119 + 577 0 155 157 119 130 + 578 0 264 256 261 244 + 579 0 101 78 98 84 + 580 0 195 215 196 179 + 581 0 258 261 264 272 + 582 0 44 33 31 47 + 583 0 44 48 47 61 + 584 0 136 138 103 114 + 585 0 103 136 114 145 + 586 0 248 237 250 259 + 587 0 66 90 67 86 + 588 0 67 66 86 62 + 589 0 67 66 62 48 + 590 0 67 66 48 61 + 591 0 152 153 149 118 + 592 0 86 115 83 90 + 593 0 130 163 128 155 + 594 0 100 131 134 126 + 595 0 131 134 126 156 + 596 0 41 27 30 39 + 597 0 115 125 120 90 + 598 0 151 127 154 117 + 599 0 188 197 198 164 + 600 0 149 150 153 183 + 601 0 83 112 115 104 + 602 0 127 110 113 99 + 603 0 110 113 99 82 + 604 0 110 113 82 92 + 605 0 63 67 61 82 + 606 0 10 13 21 20 + 607 0 72 98 78 84 + 608 0 258 244 259 264 + 609 0 187 159 184 150 + 610 0 184 187 150 183 + 611 0 140 165 166 134 + 612 0 165 166 134 156 + 613 0 213 188 218 178 + 614 0 190 198 188 226 + 615 0 188 190 226 218 + 616 0 49 41 52 36 + 617 0 220 238 215 244 + 618 0 95 78 93 98 + 619 0 47 62 48 45 + 620 0 111 101 98 84 + 621 0 184 156 159 194 + 622 0 96 82 99 75 + 623 0 99 96 75 89 + 624 0 99 96 89 117 + 625 0 99 96 117 127 + 626 0 76 56 80 55 + 627 0 126 123 153 118 + 628 0 77 57 51 49 + 629 0 198 236 197 226 + 630 0 179 166 175 199 + 631 0 155 189 191 163 + 632 0 78 58 72 65 + 633 0 78 58 65 60 + 634 0 65 78 60 87 + 635 0 72 78 65 84 + 636 0 60 65 87 55 + 637 0 60 65 55 46 + 638 0 60 65 46 58 + 639 0 65 55 46 53 + 640 0 65 46 58 53 + 641 0 55 60 46 38 + 642 0 46 58 53 40 + 643 0 46 60 58 34 + 644 0 46 60 34 38 + 645 0 58 46 34 40 + 646 0 65 78 87 84 + 647 0 58 65 53 72 + 648 0 65 53 72 55 + 649 0 55 46 53 32 + 650 0 53 46 40 32 + 651 0 72 65 55 84 + 652 0 65 55 84 87 + 653 0 46 40 32 34 + 654 0 32 46 34 37 + 655 0 46 34 37 38 + 656 0 32 46 37 55 + 657 0 34 32 37 21 + 658 0 34 37 38 21 + 659 0 46 37 55 38 + 660 0 58 53 40 59 + 661 0 58 53 59 70 + 662 0 41 31 44 30 + 663 0 44 41 30 39 + 664 0 234 246 236 211 + 665 0 182 149 152 183 + 666 0 192 156 194 166 + 667 0 194 192 166 199 + 668 0 213 218 205 178 + 669 0 232 220 231 244 + 670 0 62 74 79 59 + 671 0 74 79 59 70 + 672 0 160 176 158 139 + 673 0 230 229 200 237 + 674 0 230 229 237 250 + 675 0 230 229 250 251 + 676 0 231 215 220 196 + 677 0 115 144 140 120 + 678 0 144 140 120 160 + 679 0 144 140 160 175 + 680 0 144 140 175 166 + 681 0 252 245 255 219 + 682 0 215 237 238 200 + 683 0 121 126 118 94 + 684 0 78 101 87 84 + 685 0 130 124 119 98 + 686 0 124 119 98 95 + 687 0 222 192 224 230 + 688 0 224 222 230 251 + 689 0 11 14 2 9 + 690 0 73 58 70 72 + 691 0 253 246 243 232 + 692 0 246 243 232 211 + 693 0 176 216 172 197 + 694 0 115 134 112 140 + 695 0 185 191 182 235 + 696 0 43 40 45 29 + 697 0 238 259 237 244 + 698 0 120 139 142 160 + 699 0 62 83 86 79 + 700 0 58 42 40 34 + 701 0 196 216 195 172 + 702 0 216 236 211 197 + 703 0 73 78 72 93 + 704 0 121 95 118 119 + 705 0 118 121 119 152 + 706 0 61 41 44 52 + 707 0 41 44 52 39 + 708 0 253 244 256 232 + 709 0 47 43 45 33 + 710 0 222 229 230 251 + 711 0 35 21 38 37 + 712 0 38 35 37 55 + 713 0 35 21 37 32 + 714 0 37 35 32 55 + 715 0 270 277 272 267 + 716 0 111 130 108 98 + 717 0 94 70 73 79 + 718 0 10 7 13 12 + 719 0 248 249 251 229 + 720 0 114 138 148 136 + 721 0 251 257 269 271 + 722 0 84 55 76 87 + 723 0 87 80 60 55 + 724 0 249 222 251 229 + 725 0 224 222 251 240 + 726 0 15 29 12 28 + 727 0 26 29 12 20 + 728 0 76 80 87 55 + 729 0 145 114 148 136 + 730 0 163 180 177 212 + 731 0 225 233 189 235 + 732 0 227 191 235 225 + 733 0 189 182 191 235 + 734 0 189 191 163 212 + 735 0 212 217 225 191 + 736 0 180 217 212 191 + 737 0 224 222 240 223 + 738 0 224 222 223 184 + 739 0 196 176 172 158 + 740 0 56 35 38 55 + 741 0 162 197 164 176 + 742 0 164 162 176 139 + 743 0 148 154 151 174 + 744 0 227 225 217 191 + 745 0 245 252 242 214 + 746 0 219 183 214 182 + 747 0 214 219 182 233 + 748 0 100 112 104 134 + 749 0 219 185 182 235 + 750 0 54 40 59 45 + 751 0 59 54 45 62 + 752 0 57 77 81 52 + 753 0 229 248 250 251 + 754 0 117 114 107 148 + 755 0 30 27 22 39 + 756 0 223 221 214 183 + 757 0 71 75 52 61 + 758 0 34 20 32 21 + 759 0 117 116 148 151 + 760 0 267 248 268 259 + 761 0 268 250 248 262 + 762 0 250 248 262 251 + 763 0 178 154 174 188 + 764 0 212 225 189 191 + 765 0 225 189 191 235 + 766 0 262 265 271 274 + 767 0 262 269 271 251 + 768 0 148 145 136 170 + 769 0 40 32 34 29 + 770 0 10 13 20 12 + 771 0 26 29 20 32 + 772 0 163 191 180 212 + 773 0 109 108 143 135 + 774 0 184 221 223 183 + 775 0 17 15 12 28 + 776 0 268 276 265 274 + 777 0 145 174 167 170 + 778 0 11 14 9 16 + 779 0 182 189 233 235 + 780 0 27 41 36 39 + 781 0 235 219 233 182 + 782 0 214 219 233 245 + 783 0 214 219 245 252 + 784 0 52 39 36 41 + 785 0 52 49 36 57 + 786 0 52 49 57 77 + 787 0 177 212 189 163 +End Elements + +Begin SubModelPart VelocityConstraints3D_floor // Group floor // Subtree VelocityConstraints3D + Begin SubModelPartNodes + 1 + 2 + 3 + 8 + 10 + 11 + 12 + 16 + 19 + 21 + 22 + 26 + 27 + 31 + 32 + 35 + 36 + 40 + 41 + 43 + 47 + 49 + 50 + 51 + 53 + 54 + 55 + 61 + 62 + 66 + 70 + 71 + 72 + 74 + 76 + 77 + 82 + 83 + 84 + 89 + 90 + 93 + 94 + 96 + 98 + 100 + 102 + 103 + 108 + 110 + 112 + 116 + 118 + 119 + 120 + 123 + 127 + 128 + 131 + 135 + 136 + 139 + 140 + 143 + 145 + 149 + 150 + 151 + 155 + 156 + 158 + 161 + 162 + 165 + 167 + 168 + 172 + 174 + 175 + 177 + 181 + 182 + 184 + 188 + 189 + 192 + 195 + 197 + 199 + 202 + 203 + 204 + 205 + 211 + 212 + 213 + 214 + 215 + 221 + 222 + 225 + 226 + 229 + 231 + 233 + 234 + 237 + 240 + 242 + 243 + 244 + 248 + 249 + 252 + 253 + 258 + 260 + 261 + 262 + 267 + 269 + 270 + 274 + 275 + 278 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.msh b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.msh new file mode 100644 index 000000000000..fbd308b0fe90 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.msh differ diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.png b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.png new file mode 100644 index 000000000000..8739b3c73996 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.png differ diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.prj b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.prj new file mode 100644 index 000000000000..6f8cf9cf1b2a --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.prj @@ -0,0 +1,40 @@ + + +
+    
+    
+      
+      
+      
+    
+    
+      
+        1 6
+        1 1
+        2 3
+      
+      
+        1
+        1
+        1
+      
+      
+        1:279
+        2x4 1 2x12 1 2x4 1 2x4 1 2x8 1 2x8 1 2x18 1 2 2 1 1 2x18 1 2x16 1 2x3 1 2x4 1 2x7 1 2x9 1 1 2x7 1 2x5 1 2x21 1 2x3 1 2x12 1 2x6 1 2x7 1 2x8 1 2x28 1 2x14 1 2 2 1 2x8 1 2x6 1 2x6
+        2 1 2 1 2 1 3 1 1 3 1 3 1 2 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 2 1 3 1 1 2 1 3 1 2 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 2 1 1 3 1 3 1 2 1 2 1 3 1 2 1 3 1 3 1 1 2 1 3 1 2 1 2 1 2 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 3 1 3 1 2 1 2 1 3 1 3 1 1 2 1 3 1x3 2 1 2 1 2 1 3 1 2 1 3 1 2 1 2 1 3 1 3 1 3 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 1 2 1 2 1 3 1 3 1 2 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 2 1 2 1 3 1 1 3 1 3 1 2 1 1 2 1 3 1 2 1 3 1 1 3 1 2 1 3 1 2 1 2 1 2 1 3 1 1 2 1 3 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1x3 3 1 2 1 2 1 3 1 3 1 2 1 2 1 1 3 1 2 1 3 1 2 1 3 1 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 2 1 2 1 3 1 2 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 3 1 2 1 2 1 1 3 1 3 1 2 1 1 2 1 2 1 3 1 2 1 3 1 3 1 3 1 2 1 2 1 3 1 2 1 3 1 1 3 1 2 1 2 1 3 1 3 1 2 1 1 3 1 2 1 3 1 2 1 3 1 2 1 3 1 1 2 1 2 1 2 1 2 1 3 1 3 1 3 1 3 1 1 2 1 2 1 2 1 2 1 2 1 3 1 3 1 3 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 3 1 2 1 3 1 2 1 2 1 3 1 3 1 2 1 3 1 1 2 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 2 1 2 1 3 1 3 1 2 1 2 1 1 3 1 3 1 1 2 1 3 1 2 1 2 1 2 1 3 1 3 1 3 1 1 2 1 3 1 2 1 2 1 3 1 3 1 1 2 1 2 1 3 1 3 1 2 1 3 1
+      
+      
+        1:995
+        1x995
+        1x787 2x208
+      
+      
+        2 4 6 8 9 12 13 16 18 20 22 23 27 30 31 33 34 36 37 41:43 46 48 51 54:56 59 62 63 65 67 70 73 74 76:78 81 84 86:88 90 92 95 96 98 99 102 104 107 109 111 112 115:117 122 123 125 127 129 130 133 135 137 138 140 141 143 147:149 151 153 154 159:162 166 168 169 172 176:178 180 182 183 189 197 202 203 207 213 214 223 224 226 230 235 239 244 246 247 249 250 253 255 257 258 264 266 268 272 274 276 278 280 281 284 286 288 290 292 294 296 298 300 302 307 312 314 315 324 326 349 352 354 358 364 365 371 374 382 394 399 404 406 413 425 428 433 435:437 448 461 464:466 471 478 484 485 488 490 493 497 506 508 513 515 517 522 527 529 531 540 543 545 547 557 567 633 634 643 644 663 675 681 684 688 695 700 707 723 732 736 744 749 752 754 772 776
+        1x208
+        1x92 2 2 1 1 2 1x5 3 1 3 1x28 2 1x4 4 2x4 3 3 4 1 3 3 2 3 2x3 3x3 2 1 3 3 2 2 3x4 2 1x3 3 1x4 4 4 1x3 3 3 4 3 1 4 4 2x3 3 3 2 1 3 4 4 2 1 1 4 3 4 3 3 1 1
+        1x208
+        3x208
+      
+    
+  
+
diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.spd b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.spd new file mode 100644 index 000000000000..b2ba0fca7699 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.spd differ diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.tree b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.tree new file mode 100644 index 000000000000..d384111098c9 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.tree @@ -0,0 +1,9 @@ + + +
+    
+    
+    
+    
+  
+
diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.vv b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.vv new file mode 100644 index 000000000000..75e197f34079 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/borrar.vv @@ -0,0 +1,33 @@ +BeginZE + x -16.4319667816162109 16.4319667816162109 + y 7.26483154296875 -7.26483154296875 + z -22.29449462890625 21.29449462890625 + e 7.26483154296875 + v 0.551354760799850685 -0.0463592187316092183 -0.0527975448703197001 + r 0.831306904721475948 + m 0.990126490592956543 0.0366611741483211517 -0.135297834873199463 0 -0.138902679085731506 0.386440694332122803 -0.911794722080230713 0 0.018857121467590332 0.921585321426391602 0.387717515230178833 0 0 0 0 1 + c 0 0 0.5 + pd 0 + pno 0 + pfo 0 + pf 4 + pv 0 + NowUse 0 + DrawingType 0 + LightVector 135.283004760742188 -93.4916000366210938 47.7550010681152344 0 + OGLShadow(UseShadows) 0 + OGLShadow(RenderMode) RenderNice + OGLShadow(ShadowBias) -0.002 + OGLShadow(AmbientShadows) 1 + OGLShadow(UseFBO) 1 + OGLShadow(FBOSize) 2048 + OGLShadow(DimmedLightFactor) 0.02 + OGLStereo(UseStereo) 0 + OGLStereo(RelativeEyeDistance) 1 + OGLStereo(FlipEyes) 0 + OGLStereo(StereoMode) AnaglyphColors + OGLStereo(EyeDistance) 0.075 + OGLStereo(LeftEyeDistance) 1 0 0 1 + OGLStereo(RightEyeDistance) 0 1 1 1 +EndZE + diff --git a/applications/PfemMeltingApplication/test_examples/borrar.gid/materials.json b/applications/PfemMeltingApplication/test_examples/borrar.gid/materials.json new file mode 100644 index 000000000000..b1038984a30d --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/borrar.gid/materials.json @@ -0,0 +1,35 @@ +{ + "properties" : [{ + "model_part_name" : "ModelPart", + "properties_id" : 1, + "Material" : { + "Variables" : { + "DENSITY" : 1130.0, + "CONDUCTIVITY" : 0.15, + "SPECIFIC_HEAT" : 1740.0, + "ARRHENIUS_COEFFICIENT" : 0.0, + "ACTIVATION_ENERGY" : 0.0, + "HEAT_OF_VAPORIZATION" : 0.0, + "EMISSIVITY" : 1.0, + "CONVECTION_COEFFICIENT" : 0.0, + "DYNAMIC_VISCOSITY" : 1000000.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "DYNAMIC_VISCOSITY", + "data": [ + [298.0, 1000000.0], + [374.0, 1000000.0], + [473.0, 500000.0], + [553.0, 8706.0], + [613.0, 3716.0], + [723.0, 500.0], + [798.0, 500.0], + [1373.0, 500.3] + ] + } + } + } + }] +} diff --git a/applications/PfemMeltingApplication/test_examples/square/.~lock.polimero_prueba_q_mdpa_new.docx# b/applications/PfemMeltingApplication/test_examples/square/.~lock.polimero_prueba_q_mdpa_new.docx# new file mode 100644 index 000000000000..195ab0211e1d --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/.~lock.polimero_prueba_q_mdpa_new.docx# @@ -0,0 +1 @@ +,julio,julio-Precision-Tower-3620,11.03.2021 15:29,file:///home/julio/.config/libreoffice/4; \ No newline at end of file diff --git a/applications/PfemMeltingApplication/test_examples/square/BuoyancyMaterials.json b/applications/PfemMeltingApplication/test_examples/square/BuoyancyMaterials.json new file mode 100644 index 000000000000..5a92b73f6e4a --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/BuoyancyMaterials.json @@ -0,0 +1,15 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.Parts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "DENSITY" : 900.0, + "DYNAMIC_VISCOSITY" : 100000000.0, + "CONDUCTIVITY" : 10.0, + "SPECIFIC_HEAT" : 1.76 + }, + "Tables" : {} + } + }] +} diff --git a/applications/PfemMeltingApplication/test_examples/square/LaserSettings.json b/applications/PfemMeltingApplication/test_examples/square/LaserSettings.json new file mode 100644 index 000000000000..51373663621b --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/LaserSettings.json @@ -0,0 +1,30 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.Parts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "INITIAL_POSITION_X" : 0.57102, + "INITIAL_POSITION_Y" : 0.99997, + "INITIAL_POSITION_Z" : 0.5299, + "RADIOUS" : 0.8, + "FACE_HEAT_FLUX" : 100000.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "YOUNG_MODULUS", + "data": [ + [0.0, 2.0], + [1.0, 10.0], + [2.0, 12.0], + [3.5, 15.0] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square/MainKratos.py b/applications/PfemMeltingApplication/test_examples/square/MainKratos.py new file mode 100644 index 000000000000..274aa39f8643 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/MainKratos.py @@ -0,0 +1,36 @@ +from __future__ import print_function, absolute_import, division #makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +import KratosMultiphysics +import KratosMultiphysics.PfemMeltingApplication + + +#from convection_diffusion_analysis import ConvectionDiffusionAnalysis +from KratosMultiphysics.PfemMeltingApplication.pfem_melting_analysis import PfemMeltingAnalysis +import sys +import time + +class PfemMeltingAnalysisWithFlush(PfemMeltingAnalysis): + + def __init__(self,model,project_parameters,flush_frequency=10.0): + super(PfemMeltingAnalysisWithFlush,self).__init__(model,project_parameters) + + self.flush_frequency = flush_frequency + self.last_flush = time.time() + + def FinalizeSolutionStep(self): + super(PfemMeltingAnalysisWithFlush,self).FinalizeSolutionStep() + + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + +if __name__ == "__main__": + + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = PfemMeltingAnalysisWithFlush(model,parameters) + simulation.Run() diff --git a/applications/PfemMeltingApplication/test_examples/square/MateralCharacterization.json b/applications/PfemMeltingApplication/test_examples/square/MateralCharacterization.json new file mode 100644 index 000000000000..19e51a3c2c99 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/MateralCharacterization.json @@ -0,0 +1,32 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.Parts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "ACTIVATION_ENERGY" : 200000.0, + "ARRHENIUS_COEFFICIENT" : 1000000000.0, + "HEAT_OF_VAPORIZATION" : 0.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "DYNAMIC_VISCOSITY", + "data": [ + [298.0, 1000000.0], + [374.0, 1000000.0], + [473.0, 500000.0], + [553.0, 8706.0], + [613.0, 3716.0], + [723.0, 57.0], + [798.0, 0.13], + [1373.0, 0.13] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square/ProjectParameters.json b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters.json new file mode 100644 index 000000000000..2920c8d30fa7 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters.json @@ -0,0 +1,198 @@ +{ + "problem_data" : { + "problem_name" : "polimero_prueba_q", + "domain_size" : 3, + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 1000.0, + "laser_import_settings" : { + "laser_filename": "LaserSettings.json" + }, + "material_settings" : { + "material_filename": "MateralCharacterization.json" + } + }, + "output_processes" : { + "gid_output" : [{ + "python_module" : "gid_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "GiDOutputProcess", + "help" : "This process writes postprocessing files for GiD", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_name" : "polimero_prueba_q", + "postprocess_parameters" : { + "result_file_configuration" : { + "gidpost_flags" : { + "GiDPostMode" : "GiD_PostBinary", + "WriteDeformedMeshFlag" : "WriteDeformed", + "WriteConditionsFlag" : "WriteConditions", + "MultiFileFlag" : "MultipleFiles" + }, + "file_label" : "time", + "output_control_type" : "time", + "output_frequency" : 5.0, + "body_output" : true, + "node_output" : false, + "skin_output" : false, + "plane_output" : [], + "nodal_results" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT", "VISCOSITY"], + "gauss_point_results" : [] + }, + "point_data_configuration" : [] + } + } + }], + "vtk_output" : [{ + "python_module" : "vtk_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "VtkOutputProcess", + "help" : "This process writes postprocessing files for Paraview", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_control_type" : "step", + "output_frequency" : 1, + "file_format" : "ascii", + "output_precision" : 7, + "output_sub_model_parts" : true, + "folder_name" : "vtk_output", + "save_output_files_in_folder" : true, + "nodal_solution_step_data_variables" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT"], + "nodal_data_value_variables" : [], + "element_data_value_variables" : [], + "condition_data_value_variables" : [] + } + }] + }, + "restart_options" : { + "SaveRestart" : "False", + "RestartFrequency" : 0, + "LoadRestart" : "False", + "Restart_Step" : 0 + }, + "solver_settings" : { + "solver_type" : "ThermallyCoupledPfem2", + "domain_size" : 3, + "echo_level" : 0, + "fluid_solver_settings" : { + "model_part_name" : "FluidModelPart", + "domain_size" : 3, + "solver_type" : "Monolithic", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "echo_level" : 0, + "compute_reactions" : true, + "maximum_iterations" : 10, + "reform_dofs_at_each_step": true, + "relative_velocity_tolerance" : 0.001, + "absolute_velocity_tolerance" : 1e-5, + "relative_pressure_tolerance" : 0.001, + "absolute_pressure_tolerance" : 1e-5, + "volume_model_part_name" : "Parts_Parts_Auto1", + "skin_parts" : ["NoSlip3D_No_Slip_Auto1"], + "no_skin_parts" : [], + "time_stepping" : { + "automatic_time_step" : false, + "time_step" : 0.01 + }, + "alpha":0.0, + "move_mesh_strategy": 2, + "formulation" : { + "element_type" : "vms", + "use_orthogonal_subscales" : false, + "dynamic_tau" : 1.0 + } + }, + "thermal_solver_settings" : { + "solver_type" : "transient", + "analysis_type" : "non_linear", + "model_part_name" : "ThermalModelPart", + "domain_size" : 3, + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "material_import_settings" : { + "materials_filename" : "BuoyancyMaterials.json" + }, + "reform_dofs_at_each_step": true, + "line_search" : false, + "echo_level" : 0, + "compute_reactions" : false, + "max_iteration" : 10, + "convergence_criterion" : "residual_criterion", + "solution_relative_tolerance" : 1e-5, + "solution_absolute_tolerance" : 1e-7, + "residual_relative_tolerance" : 1e-5, + "residual_absolute_tolerance" : 1e-7, + "problem_domain_sub_model_part_list" : ["Parts_Parts_Auto1"], + "processes_sub_model_part_list" : ["TEMPERATURE_Parts_Auto1","HeatFlux3D_Thermal_face_conditions_Auto3","ImposedTemperature3D_Imposed_temperature_Auto1","ThermalFace3D_Thermal_face_conditions_Auto3"], + "time_stepping" : { + "time_step" : 0.01 + } + } + }, + "processes" : { + "constraints_process_list" : [{ + "python_module" : "apply_noslip_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "Parameters" : { + "model_part_name" : "FluidModelPart.NoSlip3D_No_Slip_Auto1" + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.TEMPERATURE_Parts_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : false, + "value" : 298.0, + "interval" : [0.0,0.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.HeatFlux3D_Thermal_face_conditions_Auto3", + "variable_name" : "FACE_HEAT_FLUX", + "constrained" : false, + "value" : 1000000.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ImposedTemperature3D_Imposed_temperature_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : true, + "value" : 298.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "apply_thermal_face_process", + "kratos_module" : "KratosMultiphysics.ConvectionDiffusionApplication", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ThermalFace3D_Thermal_face_conditions_Auto3", + "ambient_temperature" : 273.15, + "add_ambient_radiation" : true, + "emissivity" : 0.9, + "add_ambient_convection" : true, + "convection_coefficient" : 4.0, + "interval" : [0.0,100.0] + } + },{ + "python_module" : "apply_boussinesq_force_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "process_name" : "ApplyBoussinesqForceProcess", + "Parameters" : { + "model_part_name" : "ThermalModelPart.Boussinesq__Boussinesq_hidden_", + "gravity" : [0.0,-9.81,0.0], + "ambient_temperature" : 293.15 + } + }] + } +} diff --git a/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_new.docx b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_new.docx new file mode 100644 index 000000000000..23249f0cb352 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_new.docx differ diff --git a/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_o.json b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_o.json new file mode 100644 index 000000000000..e1360cc5138e --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/ProjectParameters_o.json @@ -0,0 +1,203 @@ +{ + "problem_data" : { + "problem_name" : "polimero_prueba_q", + "domain_size" : 3, + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 10.0, + "laser_import_settings" : { + "laser_filename": "LaserSettings.json" + }, + "material_settings" : { + "material_filename": "MateralCharacterization.json" + }, + "environment_settings" :{ + "gravity": [0,-10, 0], + "ambient_temperature" : 293.15 + } + + }, + "output_processes" : { + "gid_output" : [{ + "python_module" : "gid_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "GiDOutputProcess", + "help" : "This process writes postprocessing files for GiD", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_name" : "polimero_prueba_q", + "postprocess_parameters" : { + "result_file_configuration" : { + "gidpost_flags" : { + "GiDPostMode" : "GiD_PostBinary", + "WriteDeformedMeshFlag" : "WriteDeformed", + "WriteConditionsFlag" : "WriteConditions", + "MultiFileFlag" : "MultipleFiles" + }, + "file_label" : "time", + "output_control_type" : "time", + "output_frequency" : 0.00000001, + "body_output" : true, + "node_output" : false, + "skin_output" : false, + "plane_output" : [], + "nodal_results" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT"], + "gauss_point_results" : [] + }, + "point_data_configuration" : [] + } + } + }], + "vtk_output" : [{ + "python_module" : "vtk_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "VtkOutputProcess", + "help" : "This process writes postprocessing files for Paraview", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_control_type" : "step", + "output_frequency" : 1, + "file_format" : "ascii", + "output_precision" : 7, + "output_sub_model_parts" : true, + "folder_name" : "vtk_output", + "save_output_files_in_folder" : true, + "nodal_solution_step_data_variables" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT"], + "nodal_data_value_variables" : [], + "element_data_value_variables" : [], + "condition_data_value_variables" : [] + } + }] + }, + "restart_options" : { + "SaveRestart" : "False", + "RestartFrequency" : 0, + "LoadRestart" : "False", + "Restart_Step" : 0 + }, + "solver_settings" : { + "solver_type" : "ThermallyCoupledPfem2", + "domain_size" : 3, + "echo_level" : 0, + "fluid_solver_settings" : { + "model_part_name" : "FluidModelPart", + "domain_size" : 3, + "solver_type" : "Monolithic", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "echo_level" : 0, + "compute_reactions" : true, + "maximum_iterations" : 10, + "reform_dofs_at_each_step": true, + "relative_velocity_tolerance" : 0.001, + "absolute_velocity_tolerance" : 1e-5, + "relative_pressure_tolerance" : 0.001, + "absolute_pressure_tolerance" : 1e-5, + "volume_model_part_name" : "Parts_Parts_Auto1", + "skin_parts" : ["NoSlip3D_No_Slip_Auto1"], + "no_skin_parts" : [], + "time_stepping" : { + "automatic_time_step" : false, + "time_step" : 0.01 + }, + "alpha":0.0, + "move_mesh_strategy": 2, + "formulation" : { + "element_type" : "vms", + "use_orthogonal_subscales" : false, + "dynamic_tau" : 1.0 + } + }, + "thermal_solver_settings" : { + "solver_type" : "transient", + "analysis_type" : "non_linear", + "model_part_name" : "ThermalModelPart", + "domain_size" : 3, + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "material_import_settings" : { + "materials_filename" : "BuoyancyMaterials.json" + }, + "reform_dofs_at_each_step": true, + "line_search" : false, + "echo_level" : 0, + "compute_reactions" : false, + "max_iteration" : 10, + "convergence_criterion" : "residual_criterion", + "solution_relative_tolerance" : 1e-5, + "solution_absolute_tolerance" : 1e-7, + "residual_relative_tolerance" : 1e-5, + "residual_absolute_tolerance" : 1e-7, + "problem_domain_sub_model_part_list" : ["Parts_Parts_Auto1"], + "processes_sub_model_part_list" : ["TEMPERATURE_Parts_Auto1","HeatFlux3D_Thermal_face_conditions_Auto3","ImposedTemperature3D_Imposed_temperature_Auto1","ThermalFace3D_Thermal_face_conditions_Auto3"], + "time_stepping" : { + "time_step" : 0.01 + } + } + }, + "processes" : { + "constraints_process_list" : [{ + "python_module" : "apply_noslip_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "Parameters" : { + "model_part_name" : "FluidModelPart.NoSlip3D_No_Slip_Auto1" + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.TEMPERATURE_Parts_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : false, + "value" : 298.0, + "interval" : [0.0,0.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.HeatFlux3D_Thermal_face_conditions_Auto3", + "variable_name" : "FACE_HEAT_FLUX", + "constrained" : false, + "value" : 1000000.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ImposedTemperature3D_Imposed_temperature_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : true, + "value" : 298.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "apply_thermal_face_process", + "kratos_module" : "KratosMultiphysics.ConvectionDiffusionApplication", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ThermalFace3D_Thermal_face_conditions_Auto3", + "ambient_temperature" : 273.15, + "add_ambient_radiation" : true, + "emissivity" : 0.9, + "add_ambient_convection" : true, + "convection_coefficient" : 4.0, + "interval" : [0.0,100.0] + } + },{ + "python_module" : "apply_boussinesq_force_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "process_name" : "ApplyBoussinesqForceProcess", + "Parameters" : { + "model_part_name" : "ThermalModelPart.Boussinesq__Boussinesq_hidden_", + "gravity" : [0.0,-9.81,0.0], + "ambient_temperature" : 293.15 + } + }] + } +} diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.cnd b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.cnd new file mode 100644 index 000000000000..983cc10fdeb8 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.cnd @@ -0,0 +1,35 @@ +NUMBER: 1 CONDITION: point_Local_axes +CONDTYPE: over points +CONDMESHTYPE: over nodes +QUESTION: Local_Axes#LA#(-GLOBAL-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 2 CONDITION: line_Local_axes +CONDTYPE: over lines +QUESTION: Local_Axes#LA#(-GLOBAL-,-Automatic-,-Automatic_alt-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 3 CONDITION: surface_Local_axes +CONDTYPE: over surfaces +QUESTION: Local_Axes#LA#(-GLOBAL-,-Automatic-,-Automatic_alt-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 4 CONDITION: volume_Local_axes +CONDTYPE: over volumes +CONDMESHTYPE: over body elements +QUESTION: Local_Axes#LA#(-GLOBAL-) +VALUE: -GLOBAL- +END CONDITION +NUMBER: 5 CONDITION: element_pairs +CONDTYPE: over volumes +CONDMESHTYPE: over body elements +CANREPEAT: yes +QUESTION: pair_name +VALUE: - +END CONDITION +NUMBER: 6 CONDITION: relation_line_geo_mesh +CONDTYPE: over lines +CONDMESHTYPE: over body elements +QUESTION: id#FUNC#(NumEntity) +VALUE: 0 +END CONDITION diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.err b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.err new file mode 100644 index 000000000000..74c5236f95d7 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.err @@ -0,0 +1,24 @@ +Traceback (most recent call last): + File "MainKratos.py", line 37, in + simulation.Run() + File "/home/julio/GiDx64/14.0.5/problemtypes/kratos.gid/exec/Kratos/kratos/python_scripts/analysis_stage.py", line 47, in Run + self.Initialize() + File "/home/julio/GiDx64/14.0.5/problemtypes/kratos.gid/exec/Kratos/kratos/python_scripts/analysis_stage.py", line 68, in Initialize + self._GetSolver().ImportModelPart() + File "/home/julio/GiDx64/14.0.5/problemtypes/kratos.gid/exec/Kratos/applications/convection_diffusion_application/python_scripts/coupled_fluid_thermal_solver.py", line 68, in ImportModelPart + self.fluid_solver.ImportModelPart() + File "/home/julio/GiDx64/14.0.5/problemtypes/kratos.gid/exec/Kratos/applications/FluidDynamicsApplication/python_scripts/fluid_solver.py", line 61, in ImportModelPart + self._ImportModelPart(self.main_model_part,self.settings["model_import_settings"]) + File "/home/julio/GiDx64/14.0.5/problemtypes/kratos.gid/exec/Kratos/kratos/python_scripts/python_solver.py", line 160, in _ImportModelPart + KratosMultiphysics.ModelPartIO(input_filename, import_flags).ReadModelPart(model_part) +RuntimeError: Error: the condition with Id 0 does not exist in the root model part + + + + +in kratos/sources/model_part.cpp:1261:void ModelPart::AddConditions(const vector&, ModelPart::IndexType) + kratos/sources/model_part.cpp:1275:void ModelPart::AddConditions(const vector&, ModelPart::IndexType) + kratos/sources/model_part_io.cpp:3239:void ModelPartIO::ReadSubModelPartConditionsBlock(ModelPart&, ModelPart&) + kratos/sources/model_part_io.cpp:3058:void ModelPartIO::ReadSubModelPartBlock(ModelPart&, ModelPart&) + kratos/sources/model_part_io.cpp:526:virtual void ModelPartIO::ReadModelPart(ModelPart&) + diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.geo b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.geo new file mode 100644 index 000000000000..0a4ecf41a1ba Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.geo differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.info b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.info new file mode 100644 index 000000000000..15aedcb525f6 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.info @@ -0,0 +1,43 @@ + | / | + ' / __| _` | __| _ \ __| + . \ | ( | | ( |\__ \ +_|\_\_| \__,_|\__|\___/ ____/ + Multi-Physics 7.0.0-df4a914 +Importing KratosFluidDynamicsApplication +Initializing KratosFluidDynamicsApplication... +Importing KratosConvectionDiffusionApplication + KRATOS ___ ___ _ ___ __ ___ ___ ___ ___ + / __/ _ || || | | / /__| |_ _| __| __| + | (_| (_) | .` || V /___| |) | || _|| _| + |___|___/|_||_| |_/ |___/___|_| |_| APPLICATION +Importing KratosExternalSolversApplication +Initializing KratosExternalSolversApplication... +Importing KratosEigenSolversApplication +Initializing KratosEigenSolversApplication... +Linear-Solver-Factory: Constructing a regular (non-complex) linear-solver +NavierStokesSolverMonolithic: Construction of NavierStokesSolverMonolithic finished. +::[ConvectionDiffusionBaseSolver]:: W-A-R-N-I-N-G: CONVECTION DIFFUSION VARIABLES NOT DEFINED, TAKING DEFAULT Parameters Object { + "convection_variable": "CONVECTION_VELOCITY", + "density_variable": "DENSITY", + "diffusion_variable": "CONDUCTIVITY", + "mesh_velocity_variable": "MESH_VELOCITY", + "projection_variable": "PROJECTED_SCALAR1", + "reaction_variable": "REACTION_FLUX", + "specific_heat_variable": "SPECIFIC_HEAT", + "surface_source_variable": "FACE_HEAT_FLUX", + "transfer_coefficient_variable": "TRANSFER_COEFFICIENT", + "unknown_variable": "TEMPERATURE", + "velocity_variable": "VELOCITY", + "volume_source_variable": "HEAT_FLUX" +} +: +::[ConvectionDiffusionBaseSolver]:: Construction finished: +::[ConvectionDiffusionTransientSolver]:: Construction finished: +NavierStokesSolverMonolithic: Fluid solver variables added correctly. +::[ConvectionDiffusionBaseSolver]:: Variables ADDED: +::[PythonSolver]:: Reading model part.: +::[PythonSolver]:: Reading model part from file: /home/julio/B_KRATOS/Kratos/applications/ConvectionDiffusionApplication/test_examples/polimero_prueba_q.gid/polimero_prueba_q.mdpa: +ModelPartIO: [Reading Nodes : 671 nodes read] +ModelPartIO: [Reading Elements : 2954 elements read] [Type: Element3D4N] +ModelPartIO: [Reading Conditions : 98 conditions read] [Type: WallCondition3D3N] +KRATOS TERMINATED WITH ERROR diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.lin b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.lin new file mode 100644 index 000000000000..5e780cbdcb47 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.lin differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.mdpa b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.mdpa new file mode 100644 index 000000000000..552665da7049 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.mdpa @@ -0,0 +1,9223 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties + +Begin Properties 1 + DENSITY 900.0 + DYNAMIC_VISCOSITY 1000000.0 + CONDUCTIVITY 2000.0 + SPECIFIC_HEAT 1.76 + EMISSIVITY 1.0 + AMBIENT_TEMPERATURE 298.0 + CONVECTION_COEFFICIENT 0.0 +End Properties + + + +Begin Nodes + 1 0.0000000000 1.0000000000 1.0000000000 + 2 0.1428571429 1.0000000000 1.0000000000 + 3 0.0000000000 1.0000000000 0.8571428571 + 4 0.0000000000 0.8571428571 1.0000000000 + 5 0.0918312382 0.8977829983 0.9081687618 + 6 0.0000000000 0.7857142857 0.8700961894 + 7 0.1299038106 1.0000000000 0.7857142857 + 8 0.1299038106 0.7857142857 1.0000000000 + 9 0.0000000000 0.8796728280 0.7610710800 + 10 0.2402664764 1.0000000000 0.8792005708 + 11 0.2402664764 0.8792005708 1.0000000000 + 12 0.2857142857 1.0000000000 1.0000000000 + 13 0.0000000000 1.0000000000 0.7142857143 + 14 0.0000000000 0.7142857143 1.0000000000 + 15 0.1608404886 0.8216039701 0.8321262122 + 16 0.1118033989 0.9165896725 0.7060713124 + 17 0.1202269179 0.6951396157 0.8654024038 + 18 0.0000000000 0.7432260441 0.7462161530 + 19 0.2544826993 0.7431520015 1.0000000000 + 20 0.3148384622 0.8881966011 0.8294925583 + 21 0.1423525250 1.0000000000 0.6508229884 + 22 0.3571428571 1.0000000000 0.8700961894 + 23 0.0000000000 0.8700961894 0.6428571429 + 24 0.0000000000 0.6428571429 0.8700961894 + 25 0.1299038106 0.6428571429 1.0000000000 + 26 0.3571428571 0.8700961894 1.0000000000 + 27 0.2857142857 1.0000000000 0.7401923789 + 28 0.1302490828 0.7314095989 0.7337435852 + 29 0.3625443322 0.8112247873 0.9247177002 + 30 0.2434367607 0.7148639933 0.8090084010 + 31 0.2414803888 0.8068748947 0.7076172444 + 32 0.4285714286 1.0000000000 1.0000000000 + 33 0.0000000000 1.0000000000 0.5714285714 + 34 0.0000000000 0.5714285714 1.0000000000 + 35 0.2641065112 0.8978450333 0.6681982371 + 36 0.1483675190 0.8630817082 0.6024168980 + 37 0.1118033989 0.9133974596 0.5714285714 + 38 0.2244831600 0.6125960305 0.8980703166 + 39 0.0986597483 0.5609629943 0.8821801112 + 40 0.4308006892 0.8881966011 0.8275820146 + 41 0.3332474118 0.6641866373 0.9329203997 + 42 0.0401521754 0.8040192414 0.5591250126 + 43 0.1684346856 0.6060048352 0.7733100479 + 44 0.0000000000 0.5781163534 0.7425536650 + 45 0.2574463350 0.5781163534 1.0000000000 + 46 0.1610578152 0.7435501318 0.6042723356 + 47 0.3814272016 0.9083694779 0.6894370587 + 48 0.3581023656 0.6948379371 0.8246441040 + 49 0.4352592105 1.0000000000 0.7425536650 + 50 0.0000000000 0.7028994652 0.5906226515 + 51 0.2096362978 0.9279945446 0.5450819545 + 52 0.4122329062 0.7029274666 1.0000000000 + 53 0.3085932432 1.0000000000 0.5933169800 + 54 0.4161788811 0.8174378438 0.7580960863 + 55 0.4526992579 0.7771013607 0.8936484006 + 56 0.5000000000 0.8700961894 1.0000000000 + 57 0.1299038106 1.0000000000 0.5000000000 + 58 0.0000000000 0.5000000000 0.8700961894 + 59 0.0000000000 0.8700961894 0.5000000000 + 60 0.5000000000 1.0000000000 0.8700961894 + 61 0.1299038106 0.5000000000 1.0000000000 + 62 0.2411867682 0.6730460025 0.6786389522 + 63 0.1164769303 0.6254429644 0.6481199892 + 64 0.2971185674 0.5496574680 0.8867533212 + 65 0.3705302124 0.6960105757 0.7172770396 + 66 0.1826058134 0.4751246223 0.9100737663 + 67 0.3035928210 0.5860928846 0.7640476159 + 68 0.3366682592 0.8985449485 0.5572756393 + 69 0.5714285714 1.0000000000 1.0000000000 + 70 0.0000000000 1.0000000000 0.4285714286 + 71 0.0000000000 0.4285714286 1.0000000000 + 72 0.1497434089 0.8262454996 0.4712203478 + 73 0.0957430913 0.5067544878 0.7131826776 + 74 0.0983897244 0.4588541658 0.8033269031 + 75 0.4757598692 0.7206713031 0.8074380590 + 76 0.4079909077 0.8035934732 0.6254467266 + 77 0.5575928444 0.9153315388 0.8086200022 + 78 0.3320454923 0.7214490877 0.5883514470 + 79 0.0798581784 0.8923881345 0.4161402244 + 80 0.5643883815 0.8234712246 0.8880606516 + 81 0.4679285218 1.0000000000 0.6140426985 + 82 0.2204831733 0.5382529359 0.6663024076 + 83 0.2852453101 0.8423036320 0.4826820730 + 84 0.0653321511 0.6804437154 0.4804014154 + 85 0.2316596541 0.4715444765 0.7853615010 + 86 0.4627745622 0.6040705565 0.9052835634 + 87 0.5283775967 0.8489553622 0.7133767894 + 88 0.5647407895 0.7425536650 1.0000000000 + 89 0.0785421295 0.3862224345 0.9174520853 + 90 0.2296883572 0.7290888606 0.4862186241 + 91 0.0000000000 0.5053947920 0.6114854020 + 92 0.0000000000 0.7425536650 0.4218836466 + 93 0.4289820831 0.5298954759 1.0000000000 + 94 0.3417404894 0.5922563802 0.6326826027 + 95 0.4727503219 0.9095655802 0.5677741092 + 96 0.2801902718 1.0000000000 0.4151972535 + 97 0.2150289585 0.9162287681 0.3912778159 + 98 0.0000000000 0.8700961894 0.3571428571 + 99 0.0000000000 0.3571428571 0.8700961894 + 100 0.1299038106 0.3571428571 1.0000000000 + 101 0.6428571429 0.8700961894 1.0000000000 + 102 0.1299038106 1.0000000000 0.3571428571 + 103 0.6428571429 1.0000000000 0.8700961894 + 104 0.2914511191 0.4279991273 0.8638797512 + 105 0.0000000000 0.4141502988 0.7031170417 + 106 0.5320714782 0.6140426985 1.0000000000 + 107 0.5877670938 1.0000000000 0.7029274666 + 108 0.1200341110 0.5076287569 0.5784266684 + 109 0.2971005348 0.4093773485 1.0000000000 + 110 0.4195639639 1.0000000000 0.4863943903 + 111 0.5736782513 0.6745739495 0.9235859254 + 112 0.2416075575 0.5999099981 0.5225143091 + 113 0.0983144447 0.5657881727 0.4965974642 + 114 0.0000000000 0.5710179169 0.4701045241 + 115 0.0949008109 0.7395780955 0.3760872381 + 116 0.4178395941 0.8118495555 0.4891204985 + 117 0.1854030710 0.3595557819 0.8363352453 + 118 0.5291681909 0.6957499291 0.6838400158 + 119 0.4420613958 0.5552795535 0.7182304254 + 120 0.4126368344 0.4741770081 0.8245627926 + 121 0.3360242209 0.4713554646 0.6967161319 + 122 0.6118571829 0.7514445299 0.7639650247 + 123 0.1682869744 0.6334362955 0.4242253341 + 124 0.6637659248 0.8573121501 0.8149971816 + 125 0.2326126656 0.7818563400 0.3716598697 + 126 0.5637855365 0.6171607713 0.7904954594 + 127 0.7142857143 1.0000000000 1.0000000000 + 128 0.0000000000 1.0000000000 0.2857142857 + 129 0.0000000000 0.2857142857 1.0000000000 + 130 0.5290522900 0.7847941242 0.5642852502 + 131 0.0848490054 0.8881966011 0.2924900097 + 132 0.1547442855 0.3540941482 0.7152087626 + 133 0.2260905078 0.4020271996 0.6536096319 + 134 0.7142857143 0.9133974596 0.8881966011 + 135 0.4674360458 0.6228528396 0.5877996019 + 136 0.0660067933 0.6154879006 0.3835611728 + 137 0.6599837487 0.8935345708 0.6991894201 + 138 0.6912854347 0.7720352465 0.8892763932 + 139 0.5103162719 0.4746445208 0.9205237686 + 140 0.1118033989 0.2916994270 0.8307742275 + 141 0.3388478806 0.8673469938 0.3591928247 + 142 0.2952391016 0.4818169692 0.5664198126 + 143 0.5710179169 1.0000000000 0.5298954759 + 144 0.3820689833 0.7613750639 0.4127521058 + 145 0.6078926684 0.8949480383 0.5842929967 + 146 0.4030052426 0.3787088081 0.9064756846 + 147 0.1640952756 0.4646445118 0.4976538405 + 148 0.1248289012 0.3765766192 0.5928197359 + 149 0.6332281519 0.7792309039 0.6529782053 + 150 0.0000000000 0.4195639639 0.5136056097 + 151 0.0000000000 0.2790265038 0.7425536650 + 152 0.6174516033 0.5564014450 0.9008506022 + 153 0.5431049532 0.4962652552 0.7893466127 + 154 0.0000000000 0.2389289200 0.8796728280 + 155 0.1203271720 0.2389289200 1.0000000000 + 156 0.5804360361 0.4863943903 1.0000000000 + 157 0.1246432057 1.0000000000 0.2346128863 + 158 0.4281860325 0.4920329401 0.5975766228 + 159 0.7381390670 0.7473058372 1.0000000000 + 160 0.2533860264 1.0000000000 0.2606072627 + 161 0.3758757013 0.3478506371 0.7866119419 + 162 0.0000000000 0.7455173007 0.2568479985 + 163 0.4946052080 0.3885145980 1.0000000000 + 164 0.2567739559 0.2537838470 1.0000000000 + 165 0.4024001403 0.5673366526 0.4750353905 + 166 0.1622587241 0.5464078430 0.3730192933 + 167 0.3149904891 0.2789262430 0.9171839663 + 168 0.3086689264 0.6119479922 0.3832700661 + 169 0.5053947920 1.0000000000 0.3885145980 + 170 0.6909237277 0.6482489745 0.8307372778 + 171 0.7505012691 1.0000000000 0.7381680330 + 172 0.4750966725 0.6972212996 0.4382510052 + 173 0.7857142857 0.8700961894 1.0000000000 + 174 0.7857142857 1.0000000000 0.8700961894 + 175 0.0000000000 0.8700961894 0.2142857143 + 176 0.4624406108 0.4201889250 0.7089995167 + 177 0.3514095478 0.7297719478 0.3340668111 + 178 0.6914067568 0.5933169800 1.0000000000 + 179 0.6582665059 0.6522965320 0.6978195472 + 180 0.2779867090 0.5035133640 0.4323242686 + 181 0.1506199474 0.6475560752 0.2926383499 + 182 0.2263332095 0.2542990165 0.7785937620 + 183 0.6056893971 0.6716438577 0.5728742449 + 184 0.2049414743 0.7347652737 0.2607479809 + 185 0.4338662279 0.6460207443 0.4120361941 + 186 0.0000000000 0.4679285218 0.3859573015 + 187 0.4734934183 0.9213897714 0.3416049778 + 188 0.1856086811 0.2122473683 0.9049671110 + 189 0.0000000000 0.5877670938 0.2970725334 + 190 0.2058304721 0.9049671110 0.2162095446 + 191 0.4141502988 1.0000000000 0.2968829583 + 192 0.5524344721 0.5069788144 0.6531549106 + 193 0.7582585398 0.8573978346 0.7133046360 + 194 0.2544120991 0.6459854226 0.3003366254 + 195 0.0000000000 0.2801902718 0.5848027465 + 196 0.7992908635 0.7941056277 0.8881966011 + 197 0.0882717643 0.8087571834 0.1910566375 + 198 0.7629675743 0.7639630524 0.7495646413 + 199 0.2401548315 0.2734783307 0.6514261273 + 200 0.8184548252 0.9062641435 0.8245217490 + 201 0.6580926537 0.7858628135 0.5184874129 + 202 0.3899068740 0.5962844614 0.3705241786 + 203 0.1240643770 0.2217603840 0.6951650193 + 204 0.7370900264 0.8552337130 0.6062204917 + 205 0.5733718032 0.7075399539 0.4447452563 + 206 0.2680201506 0.3766962800 0.4830005741 + 207 0.7425536650 1.0000000000 0.5781163534 + 208 0.4218836466 0.2574463350 1.0000000000 + 209 0.5663474479 0.8600848434 0.3757621146 + 210 0.3631126111 0.3495756490 0.5777206388 + 211 0.8571428571 1.0000000000 1.0000000000 + 212 0.0000000000 1.0000000000 0.1428571429 + 213 0.0000000000 0.1428571429 1.0000000000 + 214 0.5334119498 0.3368159105 0.8870709588 + 215 0.3899337148 0.4387871753 0.4773616238 + 216 0.4651991484 0.7630905101 0.3149144033 + 217 0.1389028238 0.3327328617 0.4709207741 + 218 0.4993311016 0.5710559125 0.4319793980 + 219 0.7328344454 0.5967099407 0.7511673921 + 220 0.7021554142 0.9114654714 0.4863557254 + 221 0.0571090190 0.4090181672 0.3568832999 + 222 0.6196206372 0.3944527186 0.8628832923 + 223 0.1932189164 0.4130285371 0.3742132116 + 224 0.6732876247 0.5071029905 0.7175327023 + 225 0.3424231519 0.2090554015 0.7972486544 + 226 0.0984275637 0.9265545962 0.1221654702 + 227 0.1089777116 0.6803657167 0.1795864989 + 228 0.4785461946 0.2602078500 0.8934349987 + 229 0.7374143074 0.6973568063 0.6027284979 + 230 0.2663848754 0.5212958027 0.2968967135 + 231 0.0833873539 0.5555634987 0.2297876512 + 232 0.1443979439 0.1404717281 0.7968285055 + 233 0.0000000000 0.1299038106 0.7857142857 + 234 0.2142857143 0.1299038106 1.0000000000 + 235 0.2142857143 1.0000000000 0.1299038106 + 236 0.6015557307 0.3895544685 0.7349210011 + 237 0.4083628975 0.8603664097 0.2130235245 + 238 0.8259966467 0.7053733146 0.7841148252 + 239 0.8153521368 0.6348165111 0.8565635035 + 240 0.8740192379 1.0000000000 0.7649148565 + 241 0.8740192379 0.7649148565 1.0000000000 + 242 0.1019286424 0.1045153339 0.9058246626 + 243 0.4051802292 0.6473592335 0.2699846546 + 244 0.5312064098 0.3842970885 0.5961587397 + 245 0.4109775955 0.5142997548 0.3498344785 + 246 0.5970492987 0.5736404988 0.4608794307 + 247 0.0000000000 0.3085932432 0.4066830200 + 248 0.0000000000 0.7597335236 0.1207994292 + 249 0.9006446193 0.8776837457 0.9263611454 + 250 0.5189817150 0.4799725700 0.4573522613 + 251 0.5128207032 0.8825169652 0.2516695133 + 252 0.5858497012 0.2968829583 1.0000000000 + 253 0.7134653334 0.5840279930 0.6046691755 + 254 0.2122879818 0.5902908712 0.2084632057 + 255 0.7028994652 1.0000000000 0.4093773485 + 256 0.4974089063 0.5441452940 0.3710596662 + 257 0.2966223492 0.8213145692 0.1424875243 + 258 0.2832192827 0.2552220495 0.5269877177 + 259 0.7198097282 0.4151972535 1.0000000000 + 260 0.7925318502 0.6424344930 0.6752601582 + 261 0.5084323535 0.6349987124 0.3118909049 + 262 0.1591775161 0.1902149014 0.5703995675 + 263 0.2574220686 0.1264792590 0.8007984464 + 264 0.1414811963 0.4572234497 0.2553859875 + 265 0.0000000000 0.4352592105 0.2574463350 + 266 0.3010620513 0.6885122027 0.1735098857 + 267 0.2706029869 0.9277920737 0.1081791955 + 268 0.5200118318 0.2889756007 0.6839674543 + 269 0.7804359159 0.5024872208 0.8609994101 + 270 0.3287209267 0.3975145845 0.3620381087 + 271 0.6997072897 0.6633497872 0.4736682384 + 272 0.5687082086 0.2561130512 0.9324802593 + 273 0.2943745398 0.1118033989 0.9164322534 + 274 0.8881966011 0.9164322534 0.7056254602 + 275 0.0000000000 0.1299038106 0.6428571429 + 276 0.3571428571 1.0000000000 0.1299038106 + 277 0.0000000000 0.6428571429 0.1299038106 + 278 0.8700961894 0.6428571429 1.0000000000 + 279 0.3571428571 0.1299038106 1.0000000000 + 280 0.8700961894 1.0000000000 0.6428571429 + 281 0.1810232132 0.8245758961 0.0938613819 + 282 0.5758001119 0.7459362140 0.3007238740 + 283 0.5781163534 1.0000000000 0.2574463350 + 284 0.7186037175 0.8977932075 0.3936212074 + 285 0.6817585737 0.7661910170 0.3850597820 + 286 0.9088772695 0.8074112153 0.8090959939 + 287 0.4039105443 0.7773066524 0.1702833700 + 288 0.4939531800 0.3546266382 0.5064640707 + 289 0.6577146182 0.4364455278 0.6012786510 + 290 0.6363886613 0.2986307000 0.8730275839 + 291 0.9013988681 0.7070556827 0.8725843347 + 292 0.3940217778 0.1405878164 0.8558807498 + 293 0.6850910304 0.3332136618 0.9561387544 + 294 0.8689857661 0.7447453223 0.6757170759 + 295 0.1118033989 0.0866025404 0.7142857143 + 296 0.3797966787 0.3051518304 0.4492754654 + 297 0.8326073373 0.9113015541 0.5210676136 + 298 0.3469590538 0.5591755481 0.2140065840 + 299 0.4685509906 0.1859564102 0.7629093756 + 300 0.1118033989 0.7056254602 0.0835677466 + 301 0.3040356524 0.1567058801 0.6190180408 + 302 0.4880843385 0.7265004696 0.1973885227 + 303 0.5922080045 0.2311441758 0.8527370916 + 304 0.1968038414 0.0977127553 0.6640884781 + 305 0.6451325779 0.6388575469 0.3504950331 + 306 0.4231337062 0.1790077432 0.6594407524 + 307 0.2472399409 0.2875162580 0.3653677135 + 308 0.6621397462 0.8498565702 0.2784522075 + 309 0.4642806981 0.3842727850 0.3761158921 + 310 0.4066196862 0.8975320181 0.1003029371 + 311 0.4630038792 0.2363622307 0.5571228021 + 312 0.6172916484 0.2581980228 0.7462873239 + 313 0.7590800951 0.3684652807 0.8428754672 + 314 0.0000000000 0.0000000000 1.0000000000 + 315 0.0000000000 1.0000000000 0.0000000000 + 316 1.0000000000 1.0000000000 1.0000000000 + 317 0.1326201078 0.3037999851 0.2924614044 + 318 0.0000000000 0.5000000000 0.1299038106 + 319 0.0000000000 0.1299038106 0.5000000000 + 320 0.8700961894 0.5000000000 1.0000000000 + 321 0.5000000000 1.0000000000 0.1299038106 + 322 0.8700961894 1.0000000000 0.5000000000 + 323 0.5000000000 0.1299038106 1.0000000000 + 324 0.2376416141 0.1873354832 0.4582162634 + 325 0.2468211141 0.3697422278 0.2558817100 + 326 0.7983181020 0.4463925404 0.7373753203 + 327 0.7443884476 0.5021471867 0.5332896758 + 328 0.1428571429 0.0000000000 1.0000000000 + 329 0.0000000000 0.0000000000 0.8571428571 + 330 0.1428571429 1.0000000000 0.0000000000 + 331 1.0000000000 1.0000000000 0.8571428571 + 332 0.0000000000 0.8571428571 0.0000000000 + 333 1.0000000000 0.8571428571 1.0000000000 + 334 0.6116719747 0.2926927649 0.6127266417 + 335 0.3723071459 0.0894922104 0.7508510762 + 336 0.8545452726 0.6390648610 0.5785242361 + 337 0.3482277766 0.7754299424 0.0686769988 + 338 0.9074020863 0.6431290356 0.6988578098 + 339 0.3673186209 0.4313693917 0.2350987079 + 340 0.0907819701 0.0720916742 0.5813060987 + 341 0.8451578033 0.5413242304 0.6505192122 + 342 0.8329741319 0.7470603444 0.4612461137 + 343 0.2575449412 0.4694501611 0.1626449758 + 344 0.1526375824 0.5314296278 0.1001711000 + 345 0.6212937377 0.3552415996 0.4972140485 + 346 1.0000000000 0.7857142857 0.8700961894 + 347 0.2142857143 0.8700961894 0.0000000000 + 348 0.1299038106 0.0000000000 0.7857142857 + 349 0.4988546850 0.5152073116 0.2388461922 + 350 0.9017055166 0.5367643820 0.7949630459 + 351 0.1246432057 0.7653871137 0.0000000000 + 352 0.7209734962 0.2574463350 1.0000000000 + 353 0.1152846814 0.1258652893 0.4577827840 + 354 1.0000000000 0.8792005708 0.7597335236 + 355 0.2402664764 0.0000000000 0.8792005708 + 356 0.2790228551 0.5829529553 0.0891207990 + 357 0.2857142857 0.0000000000 1.0000000000 + 358 1.0000000000 1.0000000000 0.7142857143 + 359 1.0000000000 0.7142857143 1.0000000000 + 360 0.0000000000 0.0000000000 0.7142857143 + 361 0.2857142857 1.0000000000 0.0000000000 + 362 0.0000000000 0.7142857143 0.0000000000 + 363 0.4912634559 0.8276383189 0.0955786189 + 364 0.8041160820 0.9254167870 0.3375521024 + 365 0.5847916710 0.4440869215 0.3354604904 + 366 0.7332642628 0.5495466815 0.4053148603 + 367 0.4055016857 0.6331523070 0.1043893772 + 368 0.6274048324 0.9140246909 0.1625818576 + 369 0.0000000000 0.2618609330 0.2526941628 + 370 0.5978677424 0.1453629298 0.8619161247 + 371 0.7626800273 0.3320336612 0.7180383769 + 372 0.5937503536 0.3589457801 0.4128058158 + 373 0.6124345428 0.7783001227 0.1728157206 + 374 0.5989165635 0.6469302810 0.2089989888 + 375 0.7432260441 1.0000000000 0.2537838470 + 376 0.6845086822 0.2044666743 0.8961963550 + 377 0.7855105566 0.8163448941 0.3173878686 + 378 0.7776937327 0.6713922074 0.3614041997 + 379 0.0866025404 0.4285714286 0.1118033989 + 380 0.7033498019 0.7209439446 0.2576372019 + 381 0.2181731911 0.0730605477 0.5311011969 + 382 0.2487998785 0.7382420757 0.0000000000 + 383 1.0000000000 0.7431520015 0.7455173007 + 384 0.1648158382 0.1805999720 0.3424547234 + 385 0.5861923233 0.2541489328 0.5185541941 + 386 0.8389177377 0.6104076051 0.4676230200 + 387 0.1423525250 0.0000000000 0.6508229884 + 388 0.3571428571 0.0000000000 0.8700961894 + 389 1.0000000000 0.8700961894 0.6428571429 + 390 0.1299038106 0.6428571429 0.0000000000 + 391 1.0000000000 0.6428571429 0.8700961894 + 392 0.3571428571 0.8700961894 0.0000000000 + 393 0.3552772555 0.2901669398 0.2813000101 + 394 0.2857142857 0.0000000000 0.7401923789 + 395 0.8863619126 0.4186821327 0.8385207364 + 396 0.5020866704 0.2572469887 0.4105419673 + 397 0.4128222942 0.1169969405 0.5499121223 + 398 0.8723687080 0.8289469964 0.3979679815 + 399 0.5159073379 0.0942850657 0.7408303988 + 400 0.7067139547 0.4180159613 0.4321050682 + 401 0.8163583072 0.3976037392 0.6351276134 + 402 0.5463563693 0.1553633041 0.6046035772 + 403 0.0000000000 0.1299038106 0.3571428571 + 404 0.0000000000 0.3571428571 0.1299038106 + 405 0.6428571429 1.0000000000 0.1299038106 + 406 0.8700961894 1.0000000000 0.3571428571 + 407 0.6428571429 0.1299038106 1.0000000000 + 408 0.8700961894 0.3571428571 1.0000000000 + 409 0.5714285714 0.0866025404 0.8881966011 + 410 0.3959314882 0.1716909197 0.4232398516 + 411 0.4285714286 0.0000000000 1.0000000000 + 412 0.0000000000 0.0000000000 0.5714285714 + 413 0.4285714286 1.0000000000 0.0000000000 + 414 1.0000000000 1.0000000000 0.5714285714 + 415 0.0000000000 0.5714285714 0.0000000000 + 416 1.0000000000 0.5714285714 1.0000000000 + 417 0.9263878407 0.9049671110 0.4285714286 + 418 0.5047641834 0.5809661432 0.1247801815 + 419 0.1643255429 0.3174425177 0.1599887728 + 420 0.7624189129 0.2349400895 0.8140295238 + 421 0.4707987357 0.3934828841 0.2138829257 + 422 0.8823165614 0.5076188401 0.5595731619 + 423 0.3362954051 0.0925937057 0.4646512487 + 424 0.2197272608 0.4285714286 0.0776464423 + 425 0.6865978541 0.2059391318 0.6430842091 + 426 0.3646452810 0.4588228894 0.1028323339 + 427 0.6107458184 0.1064645092 0.7482703712 + 428 0.2142588570 0.2150117661 0.2408713813 + 429 0.6161510675 0.4928408186 0.2229047974 + 430 0.2574463350 0.5781163534 0.0000000000 + 431 1.0000000000 0.5781163534 0.7425536650 + 432 0.8486623384 0.3198713625 0.7515725523 + 433 0.7590379555 0.3295947106 0.5294508690 + 434 0.7376860679 0.5765061112 0.2711519964 + 435 0.4352592105 0.0000000000 0.7425536650 + 436 0.4093773485 0.7028994652 0.0000000000 + 437 1.0000000000 0.7029274666 0.5877670938 + 438 0.5317245845 0.6518843345 0.0753482600 + 439 0.3085932432 0.0000000000 0.5933169800 + 440 0.8643946392 0.2916323905 0.8846246654 + 441 0.8025974428 0.8900792666 0.2214302051 + 442 1.0000000000 0.8700961894 0.5000000000 + 443 0.1299038106 0.0000000000 0.5000000000 + 444 0.1299038106 0.5000000000 0.0000000000 + 445 1.0000000000 0.5000000000 0.8700961894 + 446 0.5000000000 0.8700961894 0.0000000000 + 447 0.5000000000 0.0000000000 0.8700961894 + 448 0.5629394113 0.5394954849 0.1408910361 + 449 0.5461252983 0.3123504018 0.2931783742 + 450 0.2936118042 0.1396483763 0.3271459266 + 451 0.1118033989 0.2007091365 0.2058943723 + 452 0.2215550991 0.0672930010 0.3943340739 + 453 0.7073525712 0.9147051424 0.1118033989 + 454 0.0848490054 0.1118033989 0.2924900097 + 455 0.8352882579 0.4643273308 0.4381505397 + 456 0.0866025404 0.2857142857 0.1118033989 + 457 0.4737142310 0.5591484059 0.0575041756 + 458 0.6898194484 0.1254330646 0.7405604935 + 459 0.5335285841 0.1376889880 0.4694256705 + 460 0.5068368426 0.4787743480 0.1149793985 + 461 0.6986501423 0.2815194385 0.4423245248 + 462 0.9096156500 0.9049671110 0.3034108131 + 463 0.5714285714 0.0000000000 1.0000000000 + 464 1.0000000000 1.0000000000 0.4285714286 + 465 1.0000000000 0.4285714286 1.0000000000 + 466 0.0000000000 0.0000000000 0.4285714286 + 467 0.5714285714 1.0000000000 0.0000000000 + 468 0.0000000000 0.4285714286 0.0000000000 + 469 0.2975237889 0.2985242184 0.1350543951 + 470 0.9137918863 0.6779451662 0.3749816129 + 471 0.0000000000 0.1259807621 0.2350851435 + 472 0.7060713124 0.0834103275 0.8881966011 + 473 0.8796728280 1.0000000000 0.2389289200 + 474 0.7610710800 0.1203271720 1.0000000000 + 475 0.8539609310 0.5594366787 0.3414282554 + 476 0.7722276377 0.4522984169 0.3172424606 + 477 0.6909209670 0.6826871555 0.1140956926 + 478 0.4679285218 0.0000000000 0.6140426985 + 479 0.6067736003 0.2390689477 0.3506860715 + 480 0.6899621484 0.3432824284 0.3202098307 + 481 0.7857142857 1.0000000000 0.1299038106 + 482 0.0000000000 0.2142857143 0.1299038106 + 483 0.8700961894 0.2142857143 1.0000000000 + 484 1.0000000000 0.7425536650 0.4352592105 + 485 0.6355287616 0.0793068216 0.6213893816 + 486 0.3885145980 0.5053947920 0.0000000000 + 487 0.9126226845 0.3275104492 0.6646444956 + 488 0.7531075685 0.1975019910 0.5669170830 + 489 0.8293682459 0.1613970716 0.9079098599 + 490 0.6577745322 0.1377232982 0.5269838428 + 491 0.5781163534 0.7425536650 0.0000000000 + 492 1.0000000000 0.5298954759 0.5710179169 + 493 0.8580470752 0.6621070150 0.2509184965 + 494 0.5044974959 0.1857589299 0.2944278806 + 495 0.2801902718 0.0000000000 0.4151972535 + 496 0.7277281278 0.5504419719 0.1646977452 + 497 1.0000000000 0.3571428571 0.8700961894 + 498 0.1299038106 0.3571428571 0.0000000000 + 499 1.0000000000 0.8700961894 0.3571428571 + 500 0.6428571429 0.8700961894 0.0000000000 + 501 0.1299038106 0.0000000000 0.3571428571 + 502 0.6428571429 0.0000000000 0.8700961894 + 503 0.2968829583 0.4141502988 0.0000000000 + 504 1.0000000000 0.6140426985 0.4679285218 + 505 0.8436883566 0.2623643961 0.5789982525 + 506 0.5877670938 0.0000000000 0.7029274666 + 507 0.1926225362 0.1167497299 0.2144466855 + 508 1.0000000000 0.4093773485 0.7028994652 + 509 0.9166783358 0.3754802490 0.5434377472 + 510 0.4195639639 0.0000000000 0.4863943903 + 511 0.2090512855 0.2070675614 0.1194348452 + 512 0.4886627049 0.2618067491 0.1819717756 + 513 0.7910596930 0.8034115976 0.1118033989 + 514 0.4025467239 0.0679743059 0.3497566185 + 515 0.5933042105 0.3494889839 0.1717616720 + 516 0.5298954759 0.5710179169 0.0000000000 + 517 0.8093886077 0.3401793439 0.3865635056 + 518 0.8128372784 0.1603813244 0.6800094812 + 519 0.7032551756 0.4156573491 0.2048486710 + 520 0.8881966011 0.7941056277 0.2007091365 + 521 0.8034115976 0.1118033989 0.7910596930 + 522 0.8881966011 0.1959095995 0.7912417929 + 523 0.3203812693 0.1584712994 0.1820334376 + 524 0.0824110185 0.1124878906 0.1669249207 + 525 0.4890081970 0.3567063477 0.0833338902 + 526 0.7142857143 0.0000000000 1.0000000000 + 527 1.0000000000 1.0000000000 0.2857142857 + 528 1.0000000000 0.2857142857 1.0000000000 + 529 0.0000000000 0.0000000000 0.2857142857 + 530 0.7142857143 1.0000000000 0.0000000000 + 531 0.0000000000 0.2857142857 0.0000000000 + 532 0.4092623695 0.1462540614 0.2092047263 + 533 0.6860721974 0.1508013948 0.4165753259 + 534 0.5710179169 0.0000000000 0.5298954759 + 535 0.6684200288 0.4423296829 0.1075659661 + 536 0.7739746194 0.6418033684 0.0851291945 + 537 0.7556714954 0.0674329032 0.6441247927 + 538 0.4863943903 0.4195639639 0.0000000000 + 539 0.3331984407 0.0659522273 0.2266505226 + 540 0.9302773492 0.3618011874 0.4436554082 + 541 1.0000000000 0.4863943903 0.4195639639 + 542 0.7649148565 0.8740192379 0.0000000000 + 543 0.1246432057 0.0000000000 0.2346128863 + 544 0.7381680330 0.7505012691 0.0000000000 + 545 1.0000000000 0.7473058372 0.2618609330 + 546 0.7195488763 0.2242700064 0.2999001763 + 547 0.2533860264 0.0000000000 0.2606072627 + 548 0.8287404904 0.2408816236 0.4062296914 + 549 1.0000000000 0.3885145980 0.5053947920 + 550 0.9357203312 0.2058388124 0.6629715181 + 551 0.2606072627 0.2533860264 0.0000000000 + 552 0.5053947920 0.0000000000 0.3885145980 + 553 0.9027395461 0.4108993965 0.3156002036 + 554 0.7505012691 0.0000000000 0.7381680330 + 555 1.0000000000 0.2487998785 0.7382420757 + 556 0.1299038106 0.2142857143 0.0000000000 + 557 1.0000000000 0.2142857143 0.8700961894 + 558 0.7857142857 0.0000000000 0.8700961894 + 559 1.0000000000 0.8700961894 0.2142857143 + 560 0.6233136772 0.2131799834 0.2076398895 + 561 0.8768899949 0.9022821017 0.0726213811 + 562 0.8453220784 0.4608810330 0.2017791220 + 563 1.0000000000 0.5933169800 0.3085932432 + 564 0.9340782375 0.5729295009 0.2276749749 + 565 0.6202521884 0.1152160379 0.3025265270 + 566 0.6140426985 0.4679285218 0.0000000000 + 567 0.7029274666 0.5877670938 0.0000000000 + 568 0.4141502988 0.0000000000 0.2968829583 + 569 0.8610749644 0.1265441373 0.5799225560 + 570 0.8169312078 0.3185976075 0.2560693152 + 571 0.2733196479 0.1064669247 0.0980360066 + 572 0.4151972535 0.2801902718 0.0000000000 + 573 0.1235352417 0.0995451620 0.0662844770 + 574 0.8737480045 0.1998281870 0.4557545900 + 575 0.9036347417 0.0691230399 0.8422688190 + 576 0.8881966011 0.7073525712 0.0852948576 + 577 0.8881966011 0.0848490054 0.7075099903 + 578 0.7425536650 0.0000000000 0.5781163534 + 579 1.0000000000 0.2574463350 0.5781163534 + 580 0.8571428571 0.0000000000 1.0000000000 + 581 1.0000000000 1.0000000000 0.1428571429 + 582 1.0000000000 0.1428571429 1.0000000000 + 583 0.0000000000 0.0000000000 0.1428571429 + 584 0.8571428571 1.0000000000 0.0000000000 + 585 0.0000000000 0.1428571429 0.0000000000 + 586 0.7945863909 0.4876388217 0.0774418200 + 587 0.5866593537 0.2410457687 0.0886884953 + 588 0.8925621662 0.2839718675 0.3276610655 + 589 0.6901663350 0.2852715344 0.1186914084 + 590 0.8916214175 0.5759313597 0.0999372130 + 591 0.8700961894 0.7857142857 0.0000000000 + 592 0.2142857143 0.0000000000 0.1299038106 + 593 0.5604683023 0.1134109320 0.1598502358 + 594 0.4285714286 0.1118033989 0.0866025404 + 595 0.8080257238 0.0819525889 0.4405949847 + 596 1.0000000000 0.7649148565 0.1259807621 + 597 0.8740192379 0.0000000000 0.7649148565 + 598 1.0000000000 0.1246432057 0.7653871137 + 599 0.2346128863 0.1246432057 0.0000000000 + 600 0.5933169800 0.3085932432 0.0000000000 + 601 1.0000000000 0.2968829583 0.4141502988 + 602 0.7028994652 0.0000000000 0.4093773485 + 603 1.0000000000 0.4151972535 0.2801902718 + 604 0.8651164213 0.2249503531 0.2815158422 + 605 0.8196398569 0.3583036636 0.1147862940 + 606 0.7425536650 0.4352592105 0.0000000000 + 607 0.3571428571 0.1299038106 0.0000000000 + 608 0.3571428571 0.0000000000 0.1299038106 + 609 1.0000000000 0.6428571429 0.1299038106 + 610 1.0000000000 0.1299038106 0.6428571429 + 611 0.8700961894 0.6428571429 0.0000000000 + 612 0.8700961894 0.0000000000 0.6428571429 + 613 0.5781163534 0.0000000000 0.2574463350 + 614 0.7661463877 0.0810222879 0.3257376068 + 615 0.7052499282 0.1143362578 0.2099741560 + 616 0.6646381774 0.1617522176 0.1228599815 + 617 0.9311848082 0.3544918128 0.1941155706 + 618 0.9568906009 0.1955350755 0.3913367986 + 619 0.8691472708 0.1366130489 0.3348942898 + 620 0.8785773717 0.2625015694 0.1804773350 + 621 0.9236946706 0.4440107826 0.0907702424 + 622 0.0000000000 0.0000000000 0.0000000000 + 623 1.0000000000 0.0000000000 1.0000000000 + 624 1.0000000000 1.0000000000 0.0000000000 + 625 0.5000000000 0.1299038106 0.0000000000 + 626 1.0000000000 0.1299038106 0.5000000000 + 627 1.0000000000 0.5000000000 0.1299038106 + 628 0.5000000000 0.0000000000 0.1299038106 + 629 0.8700961894 0.0000000000 0.5000000000 + 630 0.8700961894 0.5000000000 0.0000000000 + 631 0.1428571429 0.0000000000 0.0000000000 + 632 1.0000000000 0.0000000000 0.8571428571 + 633 1.0000000000 0.8571428571 0.0000000000 + 634 0.9430500179 0.0832301418 0.4372418225 + 635 1.0000000000 0.2574463350 0.2790265038 + 636 0.2857142857 0.0000000000 0.0000000000 + 637 1.0000000000 0.0000000000 0.7142857143 + 638 1.0000000000 0.7142857143 0.0000000000 + 639 0.8027737366 0.1977844742 0.1039073982 + 640 0.8324403947 0.1130819648 0.2122473683 + 641 0.7473058372 0.2618609330 0.0000000000 + 642 0.7432260441 0.0000000000 0.2537838470 + 643 0.7121236295 0.0909193384 0.1114085988 + 644 0.6428571429 0.1299038106 0.0000000000 + 645 0.8700961894 0.3571428571 0.0000000000 + 646 0.8700961894 0.0000000000 0.3571428571 + 647 0.6428571429 0.0000000000 0.1299038106 + 648 1.0000000000 0.1299038106 0.3571428571 + 649 1.0000000000 0.3571428571 0.1299038106 + 650 0.9187747007 0.1754071846 0.1898600241 + 651 0.4285714286 0.0000000000 0.0000000000 + 652 1.0000000000 0.0000000000 0.5714285714 + 653 1.0000000000 0.5714285714 0.0000000000 + 654 0.9293994114 0.2744055413 0.0576340671 + 655 1.0000000000 0.0000000000 0.4285714286 + 656 0.5714285714 0.0000000000 0.0000000000 + 657 1.0000000000 0.4285714286 0.0000000000 + 658 0.7649148565 0.1259807621 0.0000000000 + 659 0.8796728280 0.0000000000 0.2389289200 + 660 1.0000000000 0.1203271720 0.2389289200 + 661 0.8700961894 0.2142857143 0.0000000000 + 662 0.7857142857 0.0000000000 0.1299038106 + 663 1.0000000000 0.2142857143 0.1299038106 + 664 0.8664618417 0.1012225834 0.0937238553 + 665 1.0000000000 0.0000000000 0.2857142857 + 666 0.7142857143 0.0000000000 0.0000000000 + 667 1.0000000000 0.2857142857 0.0000000000 + 668 0.8571428571 0.0000000000 0.0000000000 + 669 1.0000000000 0.0000000000 0.1428571429 + 670 1.0000000000 0.1428571429 0.0000000000 + 671 1.0000000000 0.0000000000 0.0000000000 +End Nodes + + +Begin Elements Element3D4N// GUI group identifier: Parts Auto1 + 1 1 10 22 12 11 + 2 1 277 362 248 300 + 3 1 248 277 300 162 + 4 1 389 354 358 274 + 5 1 389 354 274 383 + 6 1 355 357 388 273 + 7 1 388 355 273 394 + 8 1 26 11 12 22 + 9 1 407 474 526 472 + 10 1 407 474 472 352 + 11 1 648 660 665 659 + 12 1 99 129 154 155 + 13 1 646 665 659 648 + 14 1 23 13 9 16 + 15 1 9 23 16 18 + 16 1 100 155 129 99 + 17 1 406 473 527 462 + 18 1 406 473 462 375 + 19 1 355 357 273 234 + 20 1 362 248 300 351 + 21 1 300 362 351 390 + 22 1 351 300 390 382 + 23 1 300 362 390 277 + 24 1 351 300 382 281 + 25 1 351 300 281 248 + 26 1 382 351 281 347 + 27 1 351 281 347 332 + 28 1 281 382 347 392 + 29 1 13 9 16 7 + 30 1 354 358 274 240 + 31 1 358 274 240 280 + 32 1 274 240 280 171 + 33 1 274 240 171 200 + 34 1 274 240 200 354 + 35 1 358 274 280 389 + 36 1 240 171 200 174 + 37 1 200 240 174 331 + 38 1 171 200 174 103 + 39 1 474 526 472 558 + 40 1 473 527 462 559 + 41 1 544 591 542 513 + 42 1 542 544 513 500 + 43 1 554 558 597 521 + 44 1 597 554 521 612 + 45 1 555 598 557 522 + 46 1 555 598 522 610 + 47 1 526 472 558 502 + 48 1 472 558 502 554 + 49 1 526 472 502 407 + 50 1 527 462 559 499 + 51 1 462 559 499 545 + 52 1 527 462 499 406 + 53 1 16 13 7 21 + 54 1 7 16 21 27 + 55 1 16 13 21 23 + 56 1 357 273 234 279 + 57 1 273 234 279 164 + 58 1 357 273 279 388 + 59 1 543 529 501 454 + 60 1 501 543 454 547 + 61 1 599 636 607 571 + 62 1 607 599 571 551 + 63 1 551 556 599 511 + 64 1 599 551 511 571 + 65 1 160 157 235 190 + 66 1 160 157 190 102 + 67 1 157 102 128 131 + 68 1 157 102 131 190 + 69 1 598 610 637 577 + 70 1 598 610 577 522 + 71 1 547 592 543 507 + 72 1 543 547 507 454 + 73 1 658 661 641 639 + 74 1 661 641 639 645 + 75 1 471 482 369 451 + 76 1 482 369 451 404 + 77 1 596 545 559 520 + 78 1 545 559 520 462 + 79 1 559 520 462 473 + 80 1 241 159 173 196 + 81 1 159 173 196 101 + 82 1 403 529 471 454 + 83 1 471 403 454 369 + 84 1 529 471 454 543 + 85 1 403 529 454 501 + 86 1 542 530 500 453 + 87 1 500 542 453 513 + 88 1 609 596 638 576 + 89 1 609 596 576 520 + 90 1 577 598 522 575 + 91 1 577 598 575 637 + 92 1 542 453 513 481 + 93 1 278 241 359 291 + 94 1 278 241 291 196 + 95 1 597 637 612 577 + 96 1 612 597 577 521 + 97 1 597 577 521 575 + 98 1 597 577 575 637 + 99 1 521 597 575 558 + 100 1 577 521 575 522 + 101 1 521 575 522 489 + 102 1 577 521 522 518 + 103 1 522 521 489 420 + 104 1 521 522 518 420 + 105 1 597 575 558 632 + 106 1 597 575 632 637 + 107 1 521 575 489 558 + 108 1 577 521 518 612 + 109 1 637 612 577 610 + 110 1 521 489 420 472 + 111 1 518 521 420 458 + 112 1 518 521 458 554 + 113 1 521 420 458 472 + 114 1 489 522 420 440 + 115 1 522 420 440 432 + 116 1 522 420 432 518 + 117 1 644 666 658 643 + 118 1 658 644 643 639 + 119 1 128 157 131 175 + 120 1 131 128 175 98 + 121 1 175 131 98 162 + 122 1 131 128 98 102 + 123 1 599 636 571 592 + 124 1 636 571 592 608 + 125 1 571 592 608 547 + 126 1 636 571 608 607 + 127 1 598 522 575 557 + 128 1 489 522 440 557 + 129 1 575 522 489 557 + 130 1 131 157 190 175 + 131 1 507 543 454 524 + 132 1 543 454 524 471 + 133 1 454 524 471 451 + 134 1 471 454 451 369 + 135 1 524 471 451 482 + 136 1 524 471 482 583 + 137 1 524 471 583 543 + 138 1 454 524 451 507 + 139 1 524 451 507 511 + 140 1 451 507 511 428 + 141 1 451 507 428 454 + 142 1 451 524 482 556 + 143 1 507 511 428 571 + 144 1 511 451 428 419 + 145 1 451 428 419 317 + 146 1 451 428 317 454 + 147 1 511 451 419 556 + 148 1 507 511 571 592 + 149 1 571 507 592 547 + 150 1 511 599 571 592 + 151 1 596 638 576 591 + 152 1 638 576 591 611 + 153 1 576 591 611 544 + 154 1 638 576 611 609 + 155 1 440 522 432 555 + 156 1 557 555 522 440 + 157 1 241 359 291 346 + 158 1 359 291 346 391 + 159 1 291 346 391 383 + 160 1 359 291 391 278 + 161 1 666 658 643 662 + 162 1 643 666 662 647 + 163 1 662 643 647 642 + 164 1 643 666 647 644 + 165 1 542 530 453 481 + 166 1 530 453 481 405 + 167 1 453 481 405 375 + 168 1 530 453 405 500 + 169 1 419 451 317 369 + 170 1 544 591 513 576 + 171 1 591 513 576 520 + 172 1 507 543 524 592 + 173 1 554 558 521 472 + 174 1 558 521 472 489 + 175 1 428 511 419 469 + 176 1 551 556 511 419 + 177 1 428 419 317 325 + 178 1 420 440 432 313 + 179 1 432 420 313 371 + 180 1 432 420 371 518 + 181 1 235 160 190 276 + 182 1 317 428 325 307 + 183 1 317 428 307 384 + 184 1 317 428 384 454 + 185 1 420 489 440 352 + 186 1 419 428 469 325 + 187 1 428 511 469 523 + 188 1 428 511 523 571 + 189 1 511 523 571 551 + 190 1 420 440 313 352 + 191 1 591 542 513 561 + 192 1 542 513 561 481 + 193 1 596 545 520 609 + 194 1 428 325 307 393 + 195 1 428 325 393 469 + 196 1 511 419 469 551 + 197 1 641 658 639 644 + 198 1 511 469 523 551 + 199 1 583 524 543 592 + 200 1 241 159 196 278 + 201 1 428 307 384 450 + 202 1 420 313 371 290 + 203 1 420 313 290 352 + 204 1 371 420 290 458 + 205 1 469 428 523 393 + 206 1 522 577 518 550 + 207 1 518 522 550 432 + 208 1 577 518 550 569 + 209 1 577 518 569 612 + 210 1 569 577 612 610 + 211 1 518 550 569 505 + 212 1 518 550 505 432 + 213 1 569 518 505 488 + 214 1 569 518 488 537 + 215 1 569 518 537 612 + 216 1 518 505 488 371 + 217 1 518 488 537 458 + 218 1 488 569 537 578 + 219 1 569 537 578 612 + 220 1 537 578 612 554 + 221 1 537 578 554 506 + 222 1 612 537 554 518 + 223 1 325 307 393 270 + 224 1 325 307 270 223 + 225 1 325 307 223 317 + 226 1 658 661 639 664 + 227 1 661 639 664 663 + 228 1 384 428 450 547 + 229 1 440 432 313 395 + 230 1 432 313 395 326 + 231 1 313 440 395 408 + 232 1 440 432 395 497 + 233 1 432 313 326 371 + 234 1 395 432 326 508 + 235 1 270 325 223 230 + 236 1 270 325 230 339 + 237 1 325 223 230 264 + 238 1 325 223 264 317 + 239 1 325 230 339 343 + 240 1 325 230 343 264 + 241 1 230 339 343 298 + 242 1 343 230 298 254 + 243 1 343 230 254 264 + 244 1 298 343 254 356 + 245 1 298 343 356 426 + 246 1 298 343 426 339 + 247 1 343 254 356 344 + 248 1 343 254 344 264 + 249 1 230 339 298 245 + 250 1 339 298 245 349 + 251 1 339 298 349 426 + 252 1 254 356 344 300 + 253 1 230 339 245 270 + 254 1 270 325 339 393 + 255 1 223 270 230 180 + 256 1 270 230 180 245 + 257 1 223 270 180 206 + 258 1 223 270 206 307 + 259 1 230 223 180 166 + 260 1 180 223 206 147 + 261 1 223 180 166 147 + 262 1 230 223 166 264 + 263 1 270 180 206 215 + 264 1 270 180 215 245 + 265 1 206 270 215 296 + 266 1 206 270 296 307 + 267 1 180 206 215 142 + 268 1 215 206 296 210 + 269 1 180 206 142 147 + 270 1 206 215 142 210 + 271 1 270 215 296 309 + 272 1 270 215 309 245 + 273 1 296 270 309 393 + 274 1 215 296 309 288 + 275 1 309 215 288 250 + 276 1 309 215 250 245 + 277 1 215 296 288 210 + 278 1 296 309 288 396 + 279 1 309 288 396 372 + 280 1 296 309 396 393 + 281 1 396 309 372 449 + 282 1 309 372 449 365 + 283 1 309 372 365 250 + 284 1 288 296 396 311 + 285 1 296 396 311 410 + 286 1 296 396 410 393 + 287 1 288 296 311 210 + 288 1 309 288 372 250 + 289 1 396 309 449 393 + 290 1 215 180 142 165 + 291 1 215 180 165 245 + 292 1 180 142 165 112 + 293 1 180 142 112 147 + 294 1 165 180 112 168 + 295 1 165 180 168 245 + 296 1 180 112 168 166 + 297 1 142 215 165 158 + 298 1 215 165 158 250 + 299 1 142 215 158 210 + 300 1 165 142 158 94 + 301 1 158 165 94 135 + 302 1 158 165 135 250 + 303 1 165 142 94 112 + 304 1 142 158 94 121 + 305 1 142 158 121 210 + 306 1 158 94 121 119 + 307 1 158 94 119 135 + 308 1 121 158 119 176 + 309 1 121 158 176 210 + 310 1 158 119 176 192 + 311 1 158 119 192 135 + 312 1 119 176 192 153 + 313 1 119 176 153 120 + 314 1 176 192 153 236 + 315 1 119 176 120 121 + 316 1 176 192 236 244 + 317 1 176 192 244 158 + 318 1 192 236 244 289 + 319 1 192 236 289 224 + 320 1 192 236 224 153 + 321 1 236 244 289 334 + 322 1 244 289 334 345 + 323 1 244 289 345 250 + 324 1 236 244 334 268 + 325 1 289 334 345 433 + 326 1 289 334 433 371 + 327 1 236 244 268 176 + 328 1 244 334 268 311 + 329 1 94 142 121 82 + 330 1 142 121 82 133 + 331 1 94 142 82 112 + 332 1 82 142 133 147 + 333 1 121 94 82 67 + 334 1 82 121 67 85 + 335 1 82 121 85 133 + 336 1 121 94 67 119 + 337 1 94 82 67 62 + 338 1 82 67 62 43 + 339 1 82 67 43 85 + 340 1 94 82 62 112 + 341 1 62 82 43 63 + 342 1 62 82 63 112 + 343 1 82 43 63 73 + 344 1 82 43 73 85 + 345 1 43 62 63 28 + 346 1 43 63 73 44 + 347 1 62 63 28 46 + 348 1 62 63 46 112 + 349 1 63 28 46 50 + 350 1 43 62 28 30 + 351 1 62 28 30 31 + 352 1 62 28 31 46 + 353 1 43 62 30 67 + 354 1 28 43 30 17 + 355 1 30 28 17 15 + 356 1 30 28 15 31 + 357 1 28 43 17 44 + 358 1 43 30 17 38 + 359 1 43 30 38 67 + 360 1 30 17 38 19 + 361 1 142 121 133 210 + 362 1 244 192 289 250 + 363 1 67 94 62 65 + 364 1 62 67 65 30 + 365 1 94 62 65 78 + 366 1 67 94 65 119 + 367 1 62 65 78 31 + 368 1 94 62 78 112 + 369 1 65 94 78 135 + 370 1 17 30 15 19 + 371 1 298 230 245 168 + 372 1 396 288 311 385 + 373 1 396 288 385 372 + 374 1 311 396 385 459 + 375 1 311 396 459 410 + 376 1 288 311 385 244 + 377 1 385 288 244 345 + 378 1 288 244 345 250 + 379 1 385 288 345 372 + 380 1 345 385 372 461 + 381 1 372 345 461 400 + 382 1 372 345 400 250 + 383 1 288 345 372 250 + 384 1 345 385 461 334 + 385 1 345 385 334 244 + 386 1 345 461 400 433 + 387 1 345 461 433 334 + 388 1 461 372 400 480 + 389 1 372 400 480 365 + 390 1 461 372 480 479 + 391 1 461 372 479 385 + 392 1 400 345 433 289 + 393 1 372 480 479 449 + 394 1 479 372 449 396 + 395 1 449 479 396 494 + 396 1 449 479 494 560 + 397 1 449 479 560 480 + 398 1 479 396 494 459 + 399 1 479 372 396 385 + 400 1 479 494 560 565 + 401 1 479 494 565 459 + 402 1 560 479 565 546 + 403 1 560 479 546 480 + 404 1 494 449 560 512 + 405 1 449 560 512 515 + 406 1 449 560 515 480 + 407 1 494 449 512 393 + 408 1 479 565 546 533 + 409 1 479 565 533 459 + 410 1 396 449 494 393 + 411 1 546 479 533 461 + 412 1 479 533 461 385 + 413 1 512 449 515 421 + 414 1 288 244 250 158 + 415 1 512 449 421 393 + 416 1 449 515 421 365 + 417 1 565 560 546 615 + 418 1 560 546 615 639 + 419 1 560 512 515 587 + 420 1 494 560 565 593 + 421 1 565 494 593 613 + 422 1 593 565 613 615 + 423 1 515 560 587 589 + 424 1 515 560 589 480 + 425 1 560 512 587 593 + 426 1 560 494 512 593 + 427 1 565 560 615 593 + 428 1 400 461 480 517 + 429 1 480 400 517 476 + 430 1 480 400 476 365 + 431 1 560 587 589 616 + 432 1 565 546 533 614 + 433 1 533 565 614 602 + 434 1 614 533 602 595 + 435 1 602 614 595 646 + 436 1 614 595 646 619 + 437 1 614 595 619 533 + 438 1 595 646 619 634 + 439 1 595 646 634 629 + 440 1 634 595 629 569 + 441 1 595 646 629 602 + 442 1 619 595 634 574 + 443 1 619 595 574 533 + 444 1 646 634 629 655 + 445 1 634 629 655 652 + 446 1 646 634 655 648 + 447 1 634 655 648 626 + 448 1 634 655 626 652 + 449 1 648 634 626 574 + 450 1 634 626 574 569 + 451 1 595 634 574 569 + 452 1 587 515 589 600 + 453 1 480 461 479 546 + 454 1 546 533 614 619 + 455 1 560 587 616 593 + 456 1 546 565 615 614 + 457 1 517 480 476 570 + 458 1 480 476 570 519 + 459 1 480 476 519 365 + 460 1 517 480 570 546 + 461 1 515 512 421 525 + 462 1 512 421 525 469 + 463 1 634 619 574 648 + 464 1 634 619 648 646 + 465 1 400 517 476 455 + 466 1 476 400 455 366 + 467 1 400 517 455 433 + 468 1 476 400 366 365 + 469 1 589 560 616 639 + 470 1 616 589 639 644 + 471 1 512 515 587 525 + 472 1 455 476 366 475 + 473 1 476 366 475 434 + 474 1 476 366 434 365 + 475 1 476 517 570 553 + 476 1 517 570 553 588 + 477 1 517 570 588 546 + 478 1 385 311 459 402 + 479 1 311 459 402 397 + 480 1 311 459 397 410 + 481 1 385 311 402 334 + 482 1 476 517 553 455 + 483 1 587 589 616 644 + 484 1 455 476 475 553 + 485 1 570 476 553 562 + 486 1 570 476 562 519 + 487 1 553 570 562 617 + 488 1 570 562 617 605 + 489 1 570 562 605 519 + 490 1 476 553 562 475 + 491 1 562 617 605 621 + 492 1 605 562 621 586 + 493 1 605 562 586 519 + 494 1 562 617 621 627 + 495 1 617 605 621 649 + 496 1 621 617 649 627 + 497 1 649 621 627 657 + 498 1 621 627 657 653 + 499 1 649 621 657 645 + 500 1 621 657 645 630 + 501 1 621 657 630 653 + 502 1 645 621 630 586 + 503 1 621 630 586 590 + 504 1 630 586 590 611 + 505 1 621 630 590 653 + 506 1 590 630 611 653 + 507 1 586 621 590 562 + 508 1 617 649 627 603 + 509 1 617 649 603 635 + 510 1 553 570 617 588 + 511 1 562 553 617 603 + 512 1 553 617 603 588 + 513 1 396 385 459 479 + 514 1 366 475 434 378 + 515 1 434 366 378 305 + 516 1 366 475 378 386 + 517 1 366 475 386 455 + 518 1 366 378 305 271 + 519 1 366 378 271 386 + 520 1 475 378 386 470 + 521 1 475 378 470 493 + 522 1 475 378 493 434 + 523 1 378 305 271 285 + 524 1 378 386 470 342 + 525 1 386 470 342 504 + 526 1 305 271 285 205 + 527 1 305 271 205 246 + 528 1 305 271 246 366 + 529 1 271 285 205 201 + 530 1 271 285 201 342 + 531 1 205 271 201 183 + 532 1 205 271 183 246 + 533 1 271 201 183 229 + 534 1 271 201 229 342 + 535 1 201 183 229 149 + 536 1 201 183 149 130 + 537 1 201 183 130 205 + 538 1 183 229 149 179 + 539 1 183 229 179 253 + 540 1 183 229 253 271 + 541 1 149 183 179 118 + 542 1 179 149 118 122 + 543 1 179 149 122 198 + 544 1 179 149 198 229 + 545 1 149 183 118 130 + 546 1 378 386 342 271 + 547 1 378 305 285 380 + 548 1 378 305 380 434 + 549 1 305 285 380 282 + 550 1 285 380 282 308 + 551 1 285 380 308 377 + 552 1 285 380 377 378 + 553 1 380 282 308 373 + 554 1 380 282 373 374 + 555 1 380 282 374 305 + 556 1 282 308 373 251 + 557 1 308 373 251 368 + 558 1 308 373 368 453 + 559 1 373 368 453 500 + 560 1 368 453 500 405 + 561 1 368 453 405 375 + 562 1 282 308 251 209 + 563 1 308 251 209 283 + 564 1 282 308 209 285 + 565 1 305 285 282 205 + 566 1 282 373 374 302 + 567 1 374 282 302 261 + 568 1 282 373 302 251 + 569 1 373 374 302 438 + 570 1 373 374 438 477 + 571 1 373 374 477 380 + 572 1 302 373 438 363 + 573 1 302 373 363 251 + 574 1 373 438 363 491 + 575 1 438 363 491 436 + 576 1 374 282 261 305 + 577 1 374 302 438 418 + 578 1 374 302 418 261 + 579 1 438 374 418 448 + 580 1 302 438 418 436 + 581 1 374 418 448 349 + 582 1 374 438 477 448 + 583 1 418 438 448 516 + 584 1 434 366 305 365 + 585 1 386 475 470 504 + 586 1 149 201 130 145 + 587 1 149 201 145 204 + 588 1 201 130 145 209 + 589 1 201 145 204 220 + 590 1 201 145 220 209 + 591 1 204 201 220 342 + 592 1 130 149 145 87 + 593 1 130 149 87 118 + 594 1 145 130 87 95 + 595 1 145 130 95 209 + 596 1 130 87 95 76 + 597 1 87 95 76 47 + 598 1 87 95 47 81 + 599 1 95 47 81 53 + 600 1 87 95 81 145 + 601 1 130 87 76 118 + 602 1 149 145 87 137 + 603 1 149 145 137 204 + 604 1 145 87 137 107 + 605 1 145 204 220 207 + 606 1 95 130 76 116 + 607 1 95 130 116 209 + 608 1 130 76 116 135 + 609 1 76 95 116 68 + 610 1 76 95 68 47 + 611 1 95 116 68 110 + 612 1 116 76 68 78 + 613 1 149 201 204 229 + 614 1 87 149 137 122 + 615 1 271 378 285 342 + 616 1 380 308 377 513 + 617 1 621 605 586 645 + 618 1 621 605 645 649 + 619 1 205 305 246 261 + 620 1 165 94 135 78 + 621 1 617 570 605 620 + 622 1 617 570 620 588 + 623 1 570 605 620 589 + 624 1 605 617 620 649 + 625 1 378 470 493 377 + 626 1 251 282 209 216 + 627 1 251 282 216 302 + 628 1 209 251 216 187 + 629 1 209 251 187 283 + 630 1 216 209 187 116 + 631 1 282 209 216 205 + 632 1 251 216 187 237 + 633 1 251 216 237 302 + 634 1 216 187 237 141 + 635 1 237 216 141 177 + 636 1 237 216 177 302 + 637 1 216 187 141 116 + 638 1 187 251 237 191 + 639 1 237 187 191 141 + 640 1 187 191 141 110 + 641 1 216 141 177 144 + 642 1 216 141 144 116 + 643 1 141 177 144 125 + 644 1 144 141 125 83 + 645 1 144 141 83 116 + 646 1 83 144 116 78 + 647 1 125 144 83 90 + 648 1 125 144 90 168 + 649 1 144 90 168 165 + 650 1 144 83 90 78 + 651 1 141 177 125 190 + 652 1 177 216 144 261 + 653 1 177 144 125 168 + 654 1 141 125 83 97 + 655 1 141 125 97 190 + 656 1 125 83 97 72 + 657 1 125 83 72 90 + 658 1 97 125 72 131 + 659 1 83 141 97 96 + 660 1 141 97 96 160 + 661 1 83 97 72 57 + 662 1 141 237 177 190 + 663 1 223 206 147 217 + 664 1 223 206 217 307 + 665 1 147 223 217 186 + 666 1 206 147 217 133 + 667 1 118 179 122 126 + 668 1 118 179 126 192 + 669 1 179 122 126 170 + 670 1 179 122 170 198 + 671 1 122 126 170 111 + 672 1 170 122 111 138 + 673 1 122 118 126 75 + 674 1 122 126 111 75 + 675 1 122 118 75 87 + 676 1 170 122 138 198 + 677 1 111 170 138 178 + 678 1 126 170 111 152 + 679 1 170 111 152 178 + 680 1 126 170 152 224 + 681 1 111 126 152 86 + 682 1 111 126 86 75 + 683 1 126 152 86 153 + 684 1 126 152 153 224 + 685 1 152 111 86 106 + 686 1 111 86 106 52 + 687 1 86 152 106 156 + 688 1 152 106 156 178 + 689 1 156 152 178 259 + 690 1 126 179 170 224 + 691 1 118 126 75 119 + 692 1 122 111 138 80 + 693 1 122 111 80 75 + 694 1 138 122 80 124 + 695 1 138 122 124 198 + 696 1 122 80 124 87 + 697 1 111 138 80 88 + 698 1 80 111 88 55 + 699 1 111 88 55 52 + 700 1 88 55 52 56 + 701 1 80 111 55 75 + 702 1 111 55 75 86 + 703 1 88 80 55 56 + 704 1 80 138 124 101 + 705 1 289 236 334 371 + 706 1 236 334 371 268 + 707 1 215 288 250 158 + 708 1 553 517 588 601 + 709 1 282 302 261 216 + 710 1 372 449 365 480 + 711 1 173 241 196 249 + 712 1 196 173 249 200 + 713 1 249 196 200 286 + 714 1 196 200 286 198 + 715 1 200 249 286 354 + 716 1 249 196 286 291 + 717 1 196 286 291 238 + 718 1 286 291 238 383 + 719 1 196 286 238 198 + 720 1 343 356 426 503 + 721 1 373 251 368 363 + 722 1 428 307 450 393 + 723 1 179 183 253 192 + 724 1 176 153 120 214 + 725 1 120 176 214 161 + 726 1 176 214 161 268 + 727 1 176 153 214 236 + 728 1 120 176 161 121 + 729 1 153 120 214 139 + 730 1 153 120 139 86 + 731 1 120 214 139 146 + 732 1 214 153 139 222 + 733 1 153 139 222 152 + 734 1 214 153 222 236 + 735 1 214 139 146 163 + 736 1 139 146 163 93 + 737 1 163 139 93 156 + 738 1 163 139 156 222 + 739 1 139 93 156 86 + 740 1 139 93 86 120 + 741 1 139 156 222 152 + 742 1 139 156 152 86 + 743 1 152 139 86 153 + 744 1 214 120 161 146 + 745 1 139 120 146 93 + 746 1 139 214 222 163 + 747 1 206 296 210 258 + 748 1 206 296 258 307 + 749 1 210 206 258 133 + 750 1 296 210 258 311 + 751 1 30 62 31 65 + 752 1 550 569 505 579 + 753 1 311 296 410 258 + 754 1 339 325 343 469 + 755 1 76 87 47 54 + 756 1 76 87 54 118 + 757 1 87 47 54 49 + 758 1 47 76 54 31 + 759 1 63 82 73 108 + 760 1 63 82 108 112 + 761 1 82 73 108 133 + 762 1 73 63 108 91 + 763 1 108 73 91 105 + 764 1 73 91 105 44 + 765 1 313 395 326 269 + 766 1 313 395 269 408 + 767 1 326 313 269 224 + 768 1 395 326 269 350 + 769 1 269 395 350 320 + 770 1 326 269 350 219 + 771 1 326 269 219 224 + 772 1 219 326 224 253 + 773 1 269 350 219 239 + 774 1 269 350 239 320 + 775 1 219 269 239 170 + 776 1 239 219 170 238 + 777 1 170 239 238 196 + 778 1 239 219 238 350 + 779 1 239 238 196 291 + 780 1 239 238 291 350 + 781 1 395 326 350 508 + 782 1 350 326 219 341 + 783 1 326 219 341 253 + 784 1 350 326 341 508 + 785 1 219 350 341 238 + 786 1 236 289 224 371 + 787 1 245 339 349 309 + 788 1 459 402 397 534 + 789 1 570 480 519 589 + 790 1 470 378 342 377 + 791 1 559 596 520 561 + 792 1 475 476 434 562 + 793 1 307 393 270 296 + 794 1 438 302 363 436 + 795 1 229 179 253 219 + 796 1 192 119 153 126 + 797 1 254 298 356 266 + 798 1 298 356 266 367 + 799 1 356 254 266 300 + 800 1 356 266 367 382 + 801 1 254 298 266 194 + 802 1 298 266 194 243 + 803 1 298 266 243 367 + 804 1 254 298 194 230 + 805 1 266 194 243 177 + 806 1 194 243 177 168 + 807 1 266 194 177 184 + 808 1 194 177 184 125 + 809 1 243 266 177 302 + 810 1 177 194 168 125 + 811 1 177 184 125 190 + 812 1 177 266 184 257 + 813 1 177 243 302 216 + 814 1 177 266 257 287 + 815 1 184 177 257 190 + 816 1 177 266 287 302 + 817 1 257 184 190 281 + 818 1 190 257 281 267 + 819 1 190 257 267 237 + 820 1 257 281 267 392 + 821 1 281 190 267 235 + 822 1 190 267 235 276 + 823 1 267 235 276 361 + 824 1 267 235 361 347 + 825 1 276 267 361 392 + 826 1 257 177 287 237 + 827 1 177 287 237 302 + 828 1 287 257 237 310 + 829 1 237 287 310 363 + 830 1 287 237 302 363 + 831 1 302 287 363 436 + 832 1 257 237 310 267 + 833 1 310 257 267 392 + 834 1 267 310 392 276 + 835 1 267 310 276 237 + 836 1 257 177 237 190 + 837 1 287 257 310 337 + 838 1 310 287 337 363 + 839 1 266 194 184 254 + 840 1 310 392 276 413 + 841 1 266 257 287 337 + 842 1 287 266 337 367 + 843 1 177 243 216 261 + 844 1 266 184 257 281 + 845 1 298 356 367 426 + 846 1 194 298 243 168 + 847 1 17 43 38 39 + 848 1 17 43 39 44 + 849 1 43 38 39 85 + 850 1 38 17 39 25 + 851 1 313 371 290 222 + 852 1 121 67 85 120 + 853 1 400 455 366 327 + 854 1 400 455 327 433 + 855 1 366 400 327 246 + 856 1 455 366 327 386 + 857 1 298 245 349 243 + 858 1 438 373 477 491 + 859 1 356 343 344 503 + 860 1 149 122 198 137 + 861 1 112 165 168 90 + 862 1 168 112 90 123 + 863 1 112 90 123 46 + 864 1 90 168 123 125 + 865 1 168 112 123 166 + 866 1 123 168 166 194 + 867 1 459 385 402 490 + 868 1 459 385 490 533 + 869 1 402 459 490 534 + 870 1 385 402 490 334 + 871 1 419 317 325 264 + 872 1 449 309 365 421 + 873 1 183 179 118 192 + 874 1 421 515 525 460 + 875 1 421 515 460 365 + 876 1 525 421 460 426 + 877 1 515 525 460 566 + 878 1 251 308 368 283 + 879 1 307 384 450 324 + 880 1 450 307 324 296 + 881 1 384 450 324 452 + 882 1 384 450 452 547 + 883 1 307 384 324 217 + 884 1 324 384 452 353 + 885 1 324 384 353 217 + 886 1 452 324 353 381 + 887 1 452 324 381 423 + 888 1 452 324 423 450 + 889 1 324 353 381 262 + 890 1 353 381 262 340 + 891 1 324 381 423 258 + 892 1 381 262 340 304 + 893 1 381 262 304 301 + 894 1 381 262 301 258 + 895 1 262 301 258 199 + 896 1 301 258 199 210 + 897 1 262 301 199 304 + 898 1 304 381 301 439 + 899 1 262 340 304 275 + 900 1 353 381 340 443 + 901 1 381 340 443 387 + 902 1 340 443 387 412 + 903 1 340 443 412 319 + 904 1 340 353 443 319 + 905 1 353 381 443 452 + 906 1 387 340 412 275 + 907 1 340 412 275 319 + 908 1 340 353 319 262 + 909 1 275 340 319 262 + 910 1 381 340 387 304 + 911 1 340 387 304 275 + 912 1 387 381 304 439 + 913 1 381 443 452 495 + 914 1 452 381 495 423 + 915 1 495 452 423 450 + 916 1 381 495 423 439 + 917 1 324 353 262 217 + 918 1 384 452 353 454 + 919 1 381 324 262 258 + 920 1 324 262 258 217 + 921 1 149 118 122 87 + 922 1 153 119 120 86 + 923 1 180 230 166 168 + 924 1 285 205 201 209 + 925 1 307 317 384 217 + 926 1 308 380 373 513 + 927 1 63 43 28 44 + 928 1 28 17 15 6 + 929 1 505 569 488 574 + 930 1 308 285 377 284 + 931 1 308 285 284 209 + 932 1 285 377 284 342 + 933 1 377 308 284 375 + 934 1 402 311 397 306 + 935 1 311 397 306 301 + 936 1 402 311 306 268 + 937 1 397 402 306 478 + 938 1 470 475 493 563 + 939 1 289 192 224 253 + 940 1 495 452 450 547 + 941 1 495 452 547 501 + 942 1 495 452 501 443 + 943 1 400 461 517 433 + 944 1 99 154 151 140 + 945 1 99 154 140 155 + 946 1 152 111 106 178 + 947 1 461 480 517 546 + 948 1 648 635 660 619 + 949 1 55 80 75 54 + 950 1 658 661 664 668 + 951 1 556 599 511 573 + 952 1 599 511 573 592 + 953 1 266 257 337 281 + 954 1 591 542 561 584 + 955 1 173 241 249 333 + 956 1 112 123 166 113 + 957 1 123 166 113 136 + 958 1 123 166 136 181 + 959 1 123 166 181 194 + 960 1 113 123 136 84 + 961 1 113 123 84 112 + 962 1 136 123 181 115 + 963 1 123 136 84 115 + 964 1 84 123 115 72 + 965 1 136 84 115 92 + 966 1 84 115 92 72 + 967 1 136 84 92 114 + 968 1 115 136 92 162 + 969 1 136 84 114 113 + 970 1 114 136 113 186 + 971 1 84 114 113 50 + 972 1 123 181 115 125 + 973 1 114 136 186 189 + 974 1 114 136 189 92 + 975 1 136 186 189 166 + 976 1 166 136 181 189 + 977 1 136 181 189 162 + 978 1 181 136 115 162 + 979 1 166 113 136 186 + 980 1 477 438 491 567 + 981 1 157 235 190 226 + 982 1 190 157 226 175 + 983 1 144 216 116 172 + 984 1 116 144 172 78 + 985 1 144 216 172 261 + 986 1 550 577 569 610 + 987 1 550 577 610 522 + 988 1 569 550 610 579 + 989 1 550 610 579 555 + 990 1 550 610 555 522 + 991 1 555 550 522 432 + 992 1 579 550 555 487 + 993 1 550 555 487 432 + 994 1 579 550 487 505 + 995 1 550 487 505 432 + 996 1 639 658 664 643 + 997 1 10 27 22 20 + 998 1 22 10 20 11 + 999 1 511 556 573 524 + 1000 1 241 196 249 291 + 1001 1 235 190 226 281 + 1002 1 190 226 281 197 + 1003 1 281 190 197 184 + 1004 1 226 281 197 248 + 1005 1 190 226 197 175 + 1006 1 226 197 175 248 + 1007 1 197 175 248 162 + 1008 1 197 175 162 131 + 1009 1 197 175 131 190 + 1010 1 248 197 162 300 + 1011 1 248 197 300 281 + 1012 1 131 197 190 184 + 1013 1 537 488 578 485 + 1014 1 578 537 485 506 + 1015 1 537 488 485 458 + 1016 1 157 235 226 212 + 1017 1 18 9 6 16 + 1018 1 513 591 561 520 + 1019 1 438 448 516 567 + 1020 1 375 481 473 441 + 1021 1 375 481 441 453 + 1022 1 481 441 453 513 + 1023 1 441 453 513 308 + 1024 1 473 375 441 462 + 1025 1 441 473 462 520 + 1026 1 462 441 520 377 + 1027 1 441 520 377 513 + 1028 1 441 520 513 561 + 1029 1 556 599 573 631 + 1030 1 75 55 54 48 + 1031 1 75 55 48 86 + 1032 1 54 75 48 65 + 1033 1 75 48 65 119 + 1034 1 48 54 65 31 + 1035 1 54 75 65 118 + 1036 1 642 659 662 640 + 1037 1 662 642 640 643 + 1038 1 640 662 643 664 + 1039 1 642 659 640 614 + 1040 1 640 642 614 615 + 1041 1 640 642 615 643 + 1042 1 615 640 643 639 + 1043 1 643 615 639 616 + 1044 1 643 615 616 593 + 1045 1 639 643 616 644 + 1046 1 643 616 644 593 + 1047 1 615 639 616 560 + 1048 1 616 615 560 593 + 1049 1 615 640 639 546 + 1050 1 615 640 546 614 + 1051 1 642 614 615 565 + 1052 1 642 615 643 647 + 1053 1 615 643 647 593 + 1054 1 642 659 614 646 + 1055 1 614 642 646 602 + 1056 1 614 642 602 565 + 1057 1 164 234 155 188 + 1058 1 164 234 188 273 + 1059 1 234 188 273 355 + 1060 1 155 164 188 100 + 1061 1 290 313 222 293 + 1062 1 222 290 293 252 + 1063 1 290 313 293 352 + 1064 1 111 55 86 52 + 1065 1 55 86 52 48 + 1066 1 573 511 524 507 + 1067 1 524 573 507 592 + 1068 1 113 114 186 150 + 1069 1 73 91 44 63 + 1070 1 123 168 194 125 + 1071 1 137 145 107 207 + 1072 1 383 346 354 286 + 1073 1 383 346 286 291 + 1074 1 346 286 291 249 + 1075 1 346 354 286 249 + 1076 1 354 383 286 274 + 1077 1 286 354 274 200 + 1078 1 267 235 347 281 + 1079 1 347 267 281 392 + 1080 1 626 634 652 569 + 1081 1 19 8 11 15 + 1082 1 640 643 639 664 + 1083 1 603 553 588 601 + 1084 1 243 302 216 261 + 1085 1 243 302 261 418 + 1086 1 243 302 418 367 + 1087 1 418 243 367 298 + 1088 1 367 418 298 426 + 1089 1 261 243 418 349 + 1090 1 302 418 367 436 + 1091 1 418 261 349 374 + 1092 1 243 302 367 266 + 1093 1 367 418 426 457 + 1094 1 367 418 457 436 + 1095 1 457 367 436 486 + 1096 1 457 367 486 426 + 1097 1 486 457 426 460 + 1098 1 490 459 533 602 + 1099 1 257 310 337 392 + 1100 1 310 337 392 363 + 1101 1 119 153 126 86 + 1102 1 596 576 520 591 + 1103 1 116 76 78 135 + 1104 1 361 267 347 392 + 1105 1 187 251 191 283 + 1106 1 243 418 349 298 + 1107 1 418 349 298 426 + 1108 1 621 562 627 590 + 1109 1 627 621 590 653 + 1110 1 367 486 426 356 + 1111 1 486 426 356 503 + 1112 1 486 426 503 538 + 1113 1 486 426 538 460 + 1114 1 660 648 619 659 + 1115 1 555 487 432 508 + 1116 1 87 47 49 81 + 1117 1 47 49 81 53 + 1118 1 485 537 458 506 + 1119 1 87 137 107 77 + 1120 1 137 107 77 103 + 1121 1 87 137 77 124 + 1122 1 137 77 124 103 + 1123 1 77 124 103 80 + 1124 1 77 124 80 87 + 1125 1 87 137 124 122 + 1126 1 137 124 122 198 + 1127 1 513 576 520 493 + 1128 1 542 561 584 481 + 1129 1 420 518 458 371 + 1130 1 95 81 145 143 + 1131 1 95 81 143 110 + 1132 1 95 81 110 53 + 1133 1 145 95 143 209 + 1134 1 599 573 631 592 + 1135 1 368 308 453 375 + 1136 1 226 157 212 175 + 1137 1 487 432 508 326 + 1138 1 451 317 369 454 + 1139 1 191 187 283 169 + 1140 1 191 187 169 110 + 1141 1 187 169 110 209 + 1142 1 187 169 209 283 + 1143 1 561 584 481 581 + 1144 1 238 196 198 170 + 1145 1 198 238 170 219 + 1146 1 293 290 352 252 + 1147 1 352 293 252 259 + 1148 1 352 293 259 313 + 1149 1 293 252 259 222 + 1150 1 259 293 222 313 + 1151 1 137 124 198 200 + 1152 1 26 19 11 20 + 1153 1 97 83 96 57 + 1154 1 258 262 199 217 + 1155 1 452 501 443 353 + 1156 1 611 590 653 609 + 1157 1 487 505 432 401 + 1158 1 432 487 401 326 + 1159 1 401 432 326 371 + 1160 1 487 505 401 509 + 1161 1 401 487 509 508 + 1162 1 487 505 509 579 + 1163 1 326 401 371 289 + 1164 1 487 401 326 508 + 1165 1 111 138 88 178 + 1166 1 617 620 649 635 + 1167 1 204 220 207 297 + 1168 1 220 207 297 255 + 1169 1 204 220 297 342 + 1170 1 452 501 353 454 + 1171 1 88 80 56 101 + 1172 1 68 95 110 53 + 1173 1 110 68 53 96 + 1174 1 241 249 333 346 + 1175 1 154 151 140 233 + 1176 1 573 631 592 583 + 1177 1 423 324 258 410 + 1178 1 423 324 410 450 + 1179 1 410 423 450 514 + 1180 1 410 423 514 510 + 1181 1 450 410 514 494 + 1182 1 423 514 510 495 + 1183 1 510 423 495 439 + 1184 1 423 514 495 450 + 1185 1 410 423 510 397 + 1186 1 423 510 397 439 + 1187 1 410 423 397 258 + 1188 1 664 658 668 662 + 1189 1 537 518 458 554 + 1190 1 212 226 175 332 + 1191 1 156 222 152 259 + 1192 1 513 441 561 481 + 1193 1 562 553 603 475 + 1194 1 249 333 346 331 + 1195 1 224 219 253 179 + 1196 1 224 219 179 170 + 1197 1 219 179 170 198 + 1198 1 659 662 640 664 + 1199 1 668 664 662 669 + 1200 1 481 473 441 561 + 1201 1 234 155 188 242 + 1202 1 188 234 242 355 + 1203 1 155 188 242 154 + 1204 1 310 276 237 321 + 1205 1 509 487 579 508 + 1206 1 418 448 349 460 + 1207 1 349 418 460 426 + 1208 1 418 448 460 457 + 1209 1 448 349 460 429 + 1210 1 460 448 429 535 + 1211 1 460 448 535 566 + 1212 1 429 460 535 515 + 1213 1 349 460 429 365 + 1214 1 460 448 566 516 + 1215 1 448 535 566 567 + 1216 1 535 460 566 515 + 1217 1 448 566 516 567 + 1218 1 429 349 365 261 + 1219 1 460 448 516 457 + 1220 1 448 516 457 418 + 1221 1 516 457 418 438 + 1222 1 516 457 438 436 + 1223 1 516 460 457 538 + 1224 1 457 516 538 486 + 1225 1 457 516 486 436 + 1226 1 538 457 486 460 + 1227 1 429 460 515 365 + 1228 1 448 429 535 496 + 1229 1 535 448 496 567 + 1230 1 429 535 496 519 + 1231 1 429 535 519 515 + 1232 1 535 519 515 589 + 1233 1 535 496 519 586 + 1234 1 496 429 519 434 + 1235 1 535 496 586 567 + 1236 1 519 429 515 365 + 1237 1 519 429 365 476 + 1238 1 496 429 434 374 + 1239 1 519 535 586 605 + 1240 1 519 515 589 480 + 1241 1 146 214 163 208 + 1242 1 163 146 208 109 + 1243 1 524 573 592 583 + 1244 1 524 573 583 585 + 1245 1 224 219 170 269 + 1246 1 257 337 281 392 + 1247 1 368 251 283 321 + 1248 1 124 137 103 200 + 1249 1 630 645 586 606 + 1250 1 586 630 606 567 + 1251 1 606 586 567 535 + 1252 1 606 586 535 605 + 1253 1 606 586 605 645 + 1254 1 234 155 242 213 + 1255 1 155 242 213 154 + 1256 1 395 440 497 408 + 1257 1 573 511 507 592 + 1258 1 184 194 125 181 + 1259 1 184 194 181 254 + 1260 1 181 184 254 227 + 1261 1 181 184 227 162 + 1262 1 254 181 227 231 + 1263 1 254 181 231 166 + 1264 1 181 227 231 189 + 1265 1 194 181 254 166 + 1266 1 231 181 189 166 + 1267 1 125 184 181 115 + 1268 1 184 181 115 162 + 1269 1 227 254 231 344 + 1270 1 254 231 344 264 + 1271 1 254 231 264 166 + 1272 1 639 640 664 650 + 1273 1 639 640 650 620 + 1274 1 650 639 620 663 + 1275 1 620 650 663 635 + 1276 1 640 650 620 604 + 1277 1 650 620 604 635 + 1278 1 639 640 620 546 + 1279 1 650 663 635 660 + 1280 1 650 663 660 664 + 1281 1 640 650 604 660 + 1282 1 664 639 650 663 + 1283 1 604 650 635 660 + 1284 1 620 640 604 546 + 1285 1 84 92 114 50 + 1286 1 84 92 50 59 + 1287 1 646 614 619 659 + 1288 1 640 546 614 619 + 1289 1 614 640 619 659 + 1290 1 448 429 496 374 + 1291 1 310 392 413 446 + 1292 1 310 392 446 363 + 1293 1 261 243 349 245 + 1294 1 300 390 382 356 + 1295 1 353 384 454 403 + 1296 1 384 454 403 317 + 1297 1 450 428 393 523 + 1298 1 106 86 156 93 + 1299 1 106 86 93 52 + 1300 1 469 419 325 343 + 1301 1 28 31 46 16 + 1302 1 130 201 205 209 + 1303 1 298 194 230 168 + 1304 1 142 206 210 133 + 1305 1 339 270 393 309 + 1306 1 271 366 386 327 + 1307 1 68 76 47 31 + 1308 1 380 377 378 493 + 1309 1 236 224 153 222 + 1310 1 343 325 264 419 + 1311 1 438 477 448 567 + 1312 1 28 15 31 16 + 1313 1 198 179 229 219 + 1314 1 120 161 146 104 + 1315 1 120 161 104 85 + 1316 1 146 120 104 93 + 1317 1 246 305 366 365 + 1318 1 161 214 146 228 + 1319 1 214 146 228 208 + 1320 1 161 214 228 268 + 1321 1 146 228 208 167 + 1322 1 228 208 167 279 + 1323 1 146 228 167 161 + 1324 1 223 166 264 186 + 1325 1 85 82 133 73 + 1326 1 458 537 554 506 + 1327 1 374 477 380 434 + 1328 1 72 125 90 123 + 1329 1 253 183 271 246 + 1330 1 288 215 210 158 + 1331 1 204 149 229 198 + 1332 1 206 142 147 133 + 1333 1 493 475 434 562 + 1334 1 244 268 176 210 + 1335 1 137 149 204 198 + 1336 1 180 166 147 112 + 1337 1 145 137 204 207 + 1338 1 192 244 158 250 + 1339 1 183 205 246 135 + 1340 1 94 165 112 78 + 1341 1 67 121 119 120 + 1342 1 285 282 205 209 + 1343 1 475 386 455 541 + 1344 1 83 72 90 46 + 1345 1 313 326 371 224 + 1346 1 229 253 271 386 + 1347 1 31 62 46 78 + 1348 1 194 254 230 166 + 1349 1 307 450 393 296 + 1350 1 201 204 229 342 + 1351 1 378 493 434 380 + 1352 1 377 285 378 342 + 1353 1 224 192 153 126 + 1354 1 477 374 448 496 + 1355 1 15 30 31 20 + 1356 1 339 245 270 309 + 1357 1 183 118 130 135 + 1358 1 183 118 135 192 + 1359 1 214 176 236 268 + 1360 1 166 230 264 254 + 1361 1 396 459 410 494 + 1362 1 476 562 519 434 + 1363 1 343 426 339 469 + 1364 1 477 373 380 513 + 1365 1 94 119 135 65 + 1366 1 271 246 366 327 + 1367 1 166 223 147 186 + 1368 1 374 380 305 434 + 1369 1 325 339 393 469 + 1370 1 95 68 47 53 + 1371 1 68 47 53 35 + 1372 1 53 68 35 51 + 1373 1 53 68 51 96 + 1374 1 68 35 51 46 + 1375 1 35 53 51 21 + 1376 1 121 85 133 161 + 1377 1 244 176 158 210 + 1378 1 183 130 205 135 + 1379 1 67 43 85 38 + 1380 1 282 305 205 261 + 1381 1 505 569 574 579 + 1382 1 222 153 152 224 + 1383 1 280 274 171 204 + 1384 1 92 115 162 98 + 1385 1 92 115 98 72 + 1386 1 307 223 317 217 + 1387 1 47 54 49 20 + 1388 1 405 368 375 283 + 1389 1 405 368 283 321 + 1390 1 405 368 321 467 + 1391 1 10 27 20 7 + 1392 1 517 553 455 540 + 1393 1 455 517 540 433 + 1394 1 517 553 540 601 + 1395 1 553 540 601 541 + 1396 1 385 334 244 311 + 1397 1 462 441 377 364 + 1398 1 441 377 364 375 + 1399 1 364 441 375 462 + 1400 1 38 17 25 19 + 1401 1 208 146 167 109 + 1402 1 595 629 569 578 + 1403 1 220 207 255 143 + 1404 1 197 300 281 184 + 1405 1 619 646 659 648 + 1406 1 288 311 244 210 + 1407 1 244 288 210 158 + 1408 1 80 56 101 69 + 1409 1 261 243 245 202 + 1410 1 245 261 202 256 + 1411 1 202 245 256 165 + 1412 1 256 202 165 261 + 1413 1 202 245 165 168 + 1414 1 165 202 168 185 + 1415 1 202 168 185 243 + 1416 1 165 202 185 261 + 1417 1 202 245 168 243 + 1418 1 202 185 261 243 + 1419 1 245 261 256 349 + 1420 1 168 165 185 144 + 1421 1 185 168 144 177 + 1422 1 185 261 243 177 + 1423 1 144 185 177 261 + 1424 1 616 587 644 593 + 1425 1 274 286 200 198 + 1426 1 587 515 600 525 + 1427 1 600 587 525 572 + 1428 1 224 289 253 326 + 1429 1 535 519 589 605 + 1430 1 587 512 525 572 + 1431 1 256 245 349 365 + 1432 1 9 16 7 6 + 1433 1 105 73 44 58 + 1434 1 472 474 558 489 + 1435 1 472 474 489 352 + 1436 1 505 401 509 433 + 1437 1 505 401 433 371 + 1438 1 97 96 160 102 + 1439 1 97 96 102 57 + 1440 1 162 197 131 184 + 1441 1 526 474 580 558 + 1442 1 129 213 154 155 + 1443 1 207 204 297 280 + 1444 1 390 300 277 344 + 1445 1 665 660 669 659 + 1446 1 273 279 388 292 + 1447 1 273 279 292 167 + 1448 1 388 273 292 394 + 1449 1 397 402 478 534 + 1450 1 478 397 534 510 + 1451 1 478 397 510 439 + 1452 1 13 3 9 7 + 1453 1 39 38 25 61 + 1454 1 25 39 61 34 + 1455 1 274 280 389 297 + 1456 1 527 473 581 559 + 1457 1 27 22 20 49 + 1458 1 524 573 585 556 + 1459 1 472 502 407 370 + 1460 1 472 502 370 458 + 1461 1 407 472 370 376 + 1462 1 472 370 376 458 + 1463 1 407 472 376 352 + 1464 1 376 407 352 272 + 1465 1 352 376 272 290 + 1466 1 376 272 290 303 + 1467 1 290 376 303 458 + 1468 1 376 272 303 407 + 1469 1 272 290 303 228 + 1470 1 352 376 290 420 + 1471 1 376 290 420 458 + 1472 1 352 376 420 489 + 1473 1 376 420 489 472 + 1474 1 489 376 472 352 + 1475 1 376 420 472 458 + 1476 1 462 499 406 398 + 1477 1 462 499 398 545 + 1478 1 406 462 398 364 + 1479 1 406 462 364 375 + 1480 1 364 406 375 255 + 1481 1 398 406 364 297 + 1482 1 375 364 255 284 + 1483 1 364 255 284 297 + 1484 1 375 364 284 377 + 1485 1 364 284 377 398 + 1486 1 377 364 398 462 + 1487 1 398 377 462 545 + 1488 1 364 406 255 297 + 1489 1 364 284 398 297 + 1490 1 284 377 398 342 + 1491 1 377 398 342 470 + 1492 1 590 653 609 627 + 1493 1 609 590 627 564 + 1494 1 609 590 564 493 + 1495 1 590 627 564 562 + 1496 1 627 609 564 563 + 1497 1 407 352 272 252 + 1498 1 352 272 252 290 + 1499 1 272 252 290 222 + 1500 1 272 407 252 323 + 1501 1 252 272 323 228 + 1502 1 252 272 228 214 + 1503 1 362 332 248 351 + 1504 1 538 566 516 460 + 1505 1 328 357 355 234 + 1506 1 541 492 504 386 + 1507 1 125 184 115 131 + 1508 1 2 10 12 11 + 1509 1 358 354 331 240 + 1510 1 324 410 450 296 + 1511 1 68 47 35 31 + 1512 1 151 99 140 105 + 1513 1 165 185 144 172 + 1514 1 185 144 172 261 + 1515 1 172 185 261 218 + 1516 1 172 185 218 165 + 1517 1 185 218 165 261 + 1518 1 385 490 533 461 + 1519 1 490 533 461 488 + 1520 1 490 533 488 595 + 1521 1 253 224 179 192 + 1522 1 194 230 168 166 + 1523 1 272 252 222 214 + 1524 1 470 475 563 504 + 1525 1 184 266 254 227 + 1526 1 102 97 57 79 + 1527 1 102 97 79 131 + 1528 1 79 102 131 98 + 1529 1 131 79 98 72 + 1530 1 79 98 72 59 + 1531 1 79 98 59 70 + 1532 1 79 98 70 102 + 1533 1 72 79 59 57 + 1534 1 59 79 70 57 + 1535 1 70 79 102 57 + 1536 1 102 97 131 190 + 1537 1 571 608 607 523 + 1538 1 571 608 523 547 + 1539 1 607 571 523 551 + 1540 1 161 146 104 167 + 1541 1 52 55 48 29 + 1542 1 52 55 29 56 + 1543 1 55 48 29 54 + 1544 1 291 391 278 350 + 1545 1 17 39 25 24 + 1546 1 17 39 24 44 + 1547 1 454 403 501 353 + 1548 1 576 611 609 590 + 1549 1 576 611 590 536 + 1550 1 576 611 536 544 + 1551 1 611 590 536 586 + 1552 1 590 576 536 493 + 1553 1 609 576 590 493 + 1554 1 590 536 586 496 + 1555 1 536 586 496 567 + 1556 1 496 536 567 477 + 1557 1 536 567 477 544 + 1558 1 496 536 477 493 + 1559 1 477 536 544 513 + 1560 1 477 536 513 493 + 1561 1 104 120 85 64 + 1562 1 85 104 64 66 + 1563 1 85 104 66 117 + 1564 1 85 104 117 161 + 1565 1 104 64 66 109 + 1566 1 104 66 117 109 + 1567 1 66 85 117 74 + 1568 1 85 117 74 133 + 1569 1 66 85 74 39 + 1570 1 74 66 39 58 + 1571 1 39 74 58 73 + 1572 1 39 74 73 85 + 1573 1 74 73 85 133 + 1574 1 117 66 74 89 + 1575 1 74 117 89 140 + 1576 1 117 89 140 100 + 1577 1 74 117 140 132 + 1578 1 117 140 132 182 + 1579 1 117 140 182 188 + 1580 1 140 182 188 232 + 1581 1 182 188 232 263 + 1582 1 182 188 263 167 + 1583 1 132 117 182 133 + 1584 1 117 140 188 100 + 1585 1 140 182 232 132 + 1586 1 188 140 232 233 + 1587 1 232 182 263 304 + 1588 1 188 232 263 355 + 1589 1 74 117 132 133 + 1590 1 182 117 188 167 + 1591 1 66 74 89 58 + 1592 1 74 89 58 99 + 1593 1 89 58 99 71 + 1594 1 99 89 71 100 + 1595 1 89 71 100 61 + 1596 1 99 89 100 140 + 1597 1 99 89 140 74 + 1598 1 100 89 61 66 + 1599 1 89 61 66 58 + 1600 1 100 89 66 117 + 1601 1 61 100 66 109 + 1602 1 104 120 64 93 + 1603 1 74 58 73 105 + 1604 1 73 74 105 132 + 1605 1 73 74 132 133 + 1606 1 89 58 71 61 + 1607 1 64 85 66 38 + 1608 1 66 64 38 45 + 1609 1 64 38 45 41 + 1610 1 64 38 41 67 + 1611 1 38 45 41 19 + 1612 1 64 38 67 85 + 1613 1 45 64 41 93 + 1614 1 67 64 85 120 + 1615 1 38 66 45 61 + 1616 1 66 45 61 109 + 1617 1 66 64 45 109 + 1618 1 41 38 19 30 + 1619 1 41 38 30 67 + 1620 1 58 74 99 105 + 1621 1 45 41 19 52 + 1622 1 41 19 52 29 + 1623 1 52 41 29 48 + 1624 1 52 41 48 86 + 1625 1 41 29 48 30 + 1626 1 48 41 30 67 + 1627 1 30 48 67 65 + 1628 1 48 67 65 119 + 1629 1 30 48 65 31 + 1630 1 66 39 58 61 + 1631 1 66 39 61 38 + 1632 1 66 39 38 85 + 1633 1 41 19 29 30 + 1634 1 647 643 644 593 + 1635 1 97 79 131 72 + 1636 1 97 79 72 57 + 1637 1 301 381 258 423 + 1638 1 143 95 110 209 + 1639 1 555 487 508 579 + 1640 1 609 564 563 493 + 1641 1 564 563 493 475 + 1642 1 493 564 475 562 + 1643 1 564 563 475 603 + 1644 1 276 310 413 321 + 1645 1 452 547 501 454 + 1646 1 553 455 540 541 + 1647 1 443 381 387 439 + 1648 1 603 617 635 588 + 1649 1 617 635 588 620 + 1650 1 384 452 454 547 + 1651 1 231 264 166 186 + 1652 1 457 418 438 436 + 1653 1 423 381 439 301 + 1654 1 521 458 554 472 + 1655 1 519 496 434 562 + 1656 1 446 310 363 321 + 1657 1 266 287 302 367 + 1658 1 287 302 367 436 + 1659 1 370 407 376 303 + 1660 1 376 370 303 458 + 1661 1 370 303 458 427 + 1662 1 370 303 427 399 + 1663 1 370 407 303 323 + 1664 1 370 303 399 292 + 1665 1 458 370 427 502 + 1666 1 303 370 323 292 + 1667 1 303 458 427 312 + 1668 1 458 427 312 425 + 1669 1 458 427 425 485 + 1670 1 458 427 485 506 + 1671 1 427 425 485 402 + 1672 1 485 427 402 399 + 1673 1 427 485 506 399 + 1674 1 506 427 399 502 + 1675 1 427 402 399 312 + 1676 1 425 485 402 490 + 1677 1 425 485 490 488 + 1678 1 490 425 488 461 + 1679 1 425 485 488 458 + 1680 1 485 490 488 578 + 1681 1 485 402 490 534 + 1682 1 427 425 402 312 + 1683 1 402 425 490 334 + 1684 1 488 425 458 518 + 1685 1 488 425 518 371 + 1686 1 312 458 425 371 + 1687 1 458 427 506 502 + 1688 1 485 506 399 478 + 1689 1 399 427 312 303 + 1690 1 425 458 518 371 + 1691 1 427 370 399 502 + 1692 1 402 485 399 478 + 1693 1 490 485 534 578 + 1694 1 425 490 334 461 + 1695 1 506 399 478 435 + 1696 1 506 399 435 447 + 1697 1 399 478 435 306 + 1698 1 303 458 312 290 + 1699 1 312 303 290 228 + 1700 1 485 402 534 478 + 1701 1 590 586 562 496 + 1702 1 586 562 496 519 + 1703 1 402 425 334 268 + 1704 1 261 172 218 205 + 1705 1 172 218 205 135 + 1706 1 533 602 595 490 + 1707 1 458 312 290 371 + 1708 1 312 290 371 214 + 1709 1 146 167 109 104 + 1710 1 109 146 104 93 + 1711 1 589 587 600 644 + 1712 1 590 564 493 562 + 1713 1 258 199 210 133 + 1714 1 658 643 662 664 + 1715 1 176 161 121 210 + 1716 1 401 509 433 327 + 1717 1 142 82 112 147 + 1718 1 570 620 588 604 + 1719 1 620 588 604 635 + 1720 1 588 604 635 618 + 1721 1 588 604 618 548 + 1722 1 588 604 548 546 + 1723 1 635 588 618 601 + 1724 1 588 618 601 548 + 1725 1 588 570 604 546 + 1726 1 635 588 601 603 + 1727 1 618 635 601 648 + 1728 1 618 635 648 619 + 1729 1 648 618 619 574 + 1730 1 618 619 574 548 + 1731 1 574 618 548 601 + 1732 1 619 574 548 533 + 1733 1 648 618 574 626 + 1734 1 648 618 626 601 + 1735 1 574 618 601 626 + 1736 1 618 619 548 604 + 1737 1 618 619 604 635 + 1738 1 619 548 604 546 + 1739 1 604 619 546 640 + 1740 1 604 619 640 660 + 1741 1 619 604 635 660 + 1742 1 570 620 604 546 + 1743 1 548 574 601 540 + 1744 1 548 574 540 505 + 1745 1 548 574 505 488 + 1746 1 80 122 75 87 + 1747 1 284 308 209 283 + 1748 1 397 311 410 258 + 1749 1 126 86 75 119 + 1750 1 230 180 245 168 + 1751 1 291 241 346 249 + 1752 1 192 158 135 250 + 1753 1 365 309 250 245 + 1754 1 605 570 519 589 + 1755 1 88 80 101 138 + 1756 1 583 529 543 471 + 1757 1 632 598 637 575 + 1758 1 632 598 575 557 + 1759 1 631 636 599 592 + 1760 1 401 432 371 505 + 1761 1 544 477 513 500 + 1762 1 212 157 128 175 + 1763 1 536 567 544 611 + 1764 1 536 567 611 586 + 1765 1 540 517 601 548 + 1766 1 540 517 548 505 + 1767 1 63 108 91 113 + 1768 1 108 91 113 150 + 1769 1 63 108 113 112 + 1770 1 108 113 112 147 + 1771 1 108 113 147 150 + 1772 1 108 91 150 105 + 1773 1 112 108 147 82 + 1774 1 113 112 147 166 + 1775 1 147 113 166 186 + 1776 1 108 147 82 133 + 1777 1 146 163 93 109 + 1778 1 605 606 645 641 + 1779 1 6 24 18 17 + 1780 1 6 24 17 14 + 1781 1 92 84 72 59 + 1782 1 73 43 44 39 + 1783 1 448 477 496 567 + 1784 1 519 429 476 434 + 1785 1 47 53 35 27 + 1786 1 53 35 27 21 + 1787 1 35 47 27 20 + 1788 1 227 231 189 277 + 1789 1 227 231 277 344 + 1790 1 54 75 118 87 + 1791 1 405 368 467 500 + 1792 1 460 418 457 426 + 1793 1 228 167 161 225 + 1794 1 228 167 225 292 + 1795 1 225 228 292 299 + 1796 1 292 225 299 335 + 1797 1 292 225 335 263 + 1798 1 225 335 263 301 + 1799 1 228 292 299 303 + 1800 1 292 225 263 167 + 1801 1 299 292 335 399 + 1802 1 335 299 399 306 + 1803 1 299 399 306 268 + 1804 1 335 299 306 225 + 1805 1 306 299 268 161 + 1806 1 225 228 299 161 + 1807 1 299 306 225 161 + 1808 1 335 292 263 394 + 1809 1 263 335 394 304 + 1810 1 228 167 292 279 + 1811 1 399 335 306 435 + 1812 1 399 335 435 292 + 1813 1 299 292 399 303 + 1814 1 399 299 303 312 + 1815 1 299 399 268 312 + 1816 1 268 299 312 228 + 1817 1 306 335 225 301 + 1818 1 335 435 292 388 + 1819 1 335 435 388 394 + 1820 1 335 435 394 439 + 1821 1 388 335 394 292 + 1822 1 21 16 23 36 + 1823 1 21 16 36 35 + 1824 1 16 23 36 46 + 1825 1 16 36 35 46 + 1826 1 21 16 35 27 + 1827 1 540 601 541 549 + 1828 1 540 601 549 579 + 1829 1 541 540 549 509 + 1830 1 540 549 509 579 + 1831 1 549 509 579 508 + 1832 1 549 541 509 492 + 1833 1 509 549 492 508 + 1834 1 541 540 509 455 + 1835 1 540 509 455 433 + 1836 1 509 540 579 505 + 1837 1 509 540 505 433 + 1838 1 524 451 511 556 + 1839 1 261 172 205 216 + 1840 1 172 205 216 116 + 1841 1 172 205 116 135 + 1842 1 8 19 25 17 + 1843 1 81 145 143 107 + 1844 1 196 239 291 278 + 1845 1 239 291 278 350 + 1846 1 35 68 31 46 + 1847 1 279 273 164 167 + 1848 1 76 68 78 31 + 1849 1 141 83 116 110 + 1850 1 425 312 371 334 + 1851 1 312 371 334 268 + 1852 1 334 312 268 425 + 1853 1 371 425 334 433 + 1854 1 312 371 268 236 + 1855 1 268 312 236 214 + 1856 1 312 371 236 214 + 1857 1 666 668 658 662 + 1858 1 638 596 633 591 + 1859 1 496 434 562 493 + 1860 1 584 530 542 481 + 1861 1 147 108 150 148 + 1862 1 147 108 148 133 + 1863 1 108 148 133 73 + 1864 1 573 585 556 631 + 1865 1 359 241 333 346 + 1866 1 640 664 650 660 + 1867 1 27 35 20 16 + 1868 1 494 512 593 532 + 1869 1 494 512 532 393 + 1870 1 593 494 532 568 + 1871 1 242 213 154 233 + 1872 1 148 147 133 217 + 1873 1 148 147 217 150 + 1874 1 391 431 445 350 + 1875 1 431 445 350 508 + 1876 1 390 444 430 344 + 1877 1 390 444 344 415 + 1878 1 444 430 344 503 + 1879 1 318 265 404 264 + 1880 1 612 629 578 569 + 1881 1 612 629 569 652 + 1882 1 24 58 44 39 + 1883 1 24 58 39 34 + 1884 1 58 39 34 61 + 1885 1 39 24 34 25 + 1886 1 280 207 322 297 + 1887 1 207 322 297 255 + 1888 1 322 280 297 414 + 1889 1 449 309 421 393 + 1890 1 279 208 323 228 + 1891 1 610 579 626 569 + 1892 1 98 59 92 72 + 1893 1 60 22 49 40 + 1894 1 60 22 40 32 + 1895 1 49 60 40 77 + 1896 1 60 40 77 80 + 1897 1 40 77 80 87 + 1898 1 49 60 77 107 + 1899 1 77 60 80 103 + 1900 1 77 60 103 107 + 1901 1 22 49 40 20 + 1902 1 40 22 20 26 + 1903 1 40 49 77 87 + 1904 1 647 628 613 593 + 1905 1 628 613 593 568 + 1906 1 647 628 593 656 + 1907 1 613 647 593 615 + 1908 1 25 45 61 38 + 1909 1 25 45 38 19 + 1910 1 500 446 491 363 + 1911 1 446 491 363 436 + 1912 1 500 446 363 321 + 1913 1 447 435 388 292 + 1914 1 442 499 484 398 + 1915 1 574 595 569 488 + 1916 1 474 489 352 483 + 1917 1 474 489 483 580 + 1918 1 574 601 540 579 + 1919 1 520 462 377 545 + 1920 1 113 114 150 91 + 1921 1 113 114 91 50 + 1922 1 301 258 210 311 + 1923 1 605 620 589 639 + 1924 1 620 589 639 546 + 1925 1 605 620 639 654 + 1926 1 620 639 654 663 + 1927 1 654 620 663 649 + 1928 1 605 620 654 649 + 1929 1 589 605 639 641 + 1930 1 639 589 641 644 + 1931 1 663 654 649 667 + 1932 1 663 654 667 670 + 1933 1 654 667 670 661 + 1934 1 654 667 661 645 + 1935 1 661 654 645 639 + 1936 1 661 654 639 663 + 1937 1 670 654 661 663 + 1938 1 654 667 645 649 + 1939 1 538 566 460 525 + 1940 1 460 538 525 426 + 1941 1 538 566 525 600 + 1942 1 525 538 600 572 + 1943 1 525 538 572 426 + 1944 1 390 300 344 356 + 1945 1 182 132 133 199 + 1946 1 132 133 199 148 + 1947 1 132 133 148 73 + 1948 1 182 132 199 203 + 1949 1 199 182 203 304 + 1950 1 132 199 203 148 + 1951 1 182 132 203 232 + 1952 1 203 182 232 304 + 1953 1 232 203 304 275 + 1954 1 133 199 148 217 + 1955 1 392 446 363 436 + 1956 1 83 90 78 46 + 1957 1 312 268 425 402 + 1958 1 312 268 402 399 + 1959 1 478 397 439 306 + 1960 1 131 98 162 115 + 1961 1 286 238 198 294 + 1962 1 238 198 294 260 + 1963 1 238 198 260 219 + 1964 1 260 238 219 341 + 1965 1 219 260 341 253 + 1966 1 294 238 260 341 + 1967 1 219 260 253 229 + 1968 1 260 253 229 341 + 1969 1 198 260 219 229 + 1970 1 198 260 229 294 + 1971 1 286 238 294 383 + 1972 1 260 229 294 336 + 1973 1 260 229 336 341 + 1974 1 336 260 341 294 + 1975 1 294 286 383 274 + 1976 1 58 44 39 73 + 1977 1 306 402 268 399 + 1978 1 306 402 399 478 + 1979 1 501 443 353 466 + 1980 1 533 546 461 548 + 1981 1 231 344 264 318 + 1982 1 400 345 289 250 + 1983 1 391 291 383 350 + 1984 1 269 239 170 178 + 1985 1 266 337 367 382 + 1986 1 266 337 382 281 + 1987 1 337 382 281 392 + 1988 1 337 382 392 436 + 1989 1 337 382 436 367 + 1990 1 436 337 367 287 + 1991 1 392 337 436 363 + 1992 1 397 534 510 459 + 1993 1 510 397 459 410 + 1994 1 323 407 463 409 + 1995 1 323 407 409 370 + 1996 1 407 409 370 502 + 1997 1 409 370 502 399 + 1998 1 409 323 370 292 + 1999 1 409 370 399 292 + 2000 1 407 463 409 502 + 2001 1 463 409 502 447 + 2002 1 409 502 447 399 + 2003 1 463 409 447 323 + 2004 1 409 447 323 292 + 2005 1 585 531 482 556 + 2006 1 667 657 645 649 + 2007 1 442 389 414 297 + 2008 1 529 466 501 403 + 2009 1 70 57 33 59 + 2010 1 498 531 556 456 + 2011 1 556 498 456 419 + 2012 1 498 456 419 404 + 2013 1 456 419 404 451 + 2014 1 456 419 451 556 + 2015 1 531 556 456 482 + 2016 1 456 531 482 404 + 2017 1 482 456 404 451 + 2018 1 482 456 451 556 + 2019 1 456 531 404 498 + 2020 1 464 442 414 322 + 2021 1 411 323 463 447 + 2022 1 408 320 465 395 + 2023 1 329 360 233 348 + 2024 1 528 557 582 483 + 2025 1 32 60 69 56 + 2026 1 530 467 500 405 + 2027 1 34 61 71 58 + 2028 1 653 638 611 609 + 2029 1 360 412 275 387 + 2030 1 88 106 52 111 + 2031 1 88 106 111 178 + 2032 1 322 406 464 417 + 2033 1 322 406 417 297 + 2034 1 417 322 297 442 + 2035 1 297 417 442 398 + 2036 1 297 417 398 406 + 2037 1 417 442 398 499 + 2038 1 398 417 499 406 + 2039 1 417 442 499 464 + 2040 1 417 442 464 322 + 2041 1 499 417 464 406 + 2042 1 322 406 297 255 + 2043 1 358 280 414 389 + 2044 1 416 445 465 320 + 2045 1 71 100 129 99 + 2046 1 412 466 319 443 + 2047 1 359 391 416 278 + 2048 1 606 567 566 535 + 2049 1 566 606 535 600 + 2050 1 445 497 465 395 + 2051 1 445 497 395 508 + 2052 1 319 466 403 353 + 2053 1 403 319 353 247 + 2054 1 12 22 32 26 + 2055 1 636 651 607 608 + 2056 1 4 8 14 6 + 2057 1 8 25 14 17 + 2058 1 468 531 498 404 + 2059 1 655 665 646 648 + 2060 1 528 408 465 497 + 2061 1 444 468 498 379 + 2062 1 498 444 379 424 + 2063 1 379 498 424 419 + 2064 1 444 379 424 344 + 2065 1 444 379 344 318 + 2066 1 424 444 344 503 + 2067 1 379 424 344 264 + 2068 1 379 344 318 264 + 2069 1 498 444 424 503 + 2070 1 424 498 503 469 + 2071 1 468 498 379 404 + 2072 1 379 468 404 318 + 2073 1 404 379 318 264 + 2074 1 379 468 318 444 + 2075 1 424 379 419 264 + 2076 1 498 379 404 419 + 2077 1 379 404 419 264 + 2078 1 320 278 416 391 + 2079 1 463 526 502 407 + 2080 1 361 235 330 347 + 2081 1 637 610 652 612 + 2082 1 656 666 644 647 + 2083 1 33 13 23 21 + 2084 1 362 415 390 277 + 2085 1 497 557 528 440 + 2086 1 60 103 69 80 + 2087 1 127 174 211 173 + 2088 1 265 189 186 231 + 2089 1 265 189 231 318 + 2090 1 231 265 318 264 + 2091 1 231 265 264 186 + 2092 1 500 467 446 321 + 2093 1 628 651 608 594 + 2094 1 608 628 594 532 + 2095 1 628 651 594 625 + 2096 1 651 594 625 607 + 2097 1 594 625 607 572 + 2098 1 651 594 607 608 + 2099 1 594 628 625 593 + 2100 1 594 628 593 532 + 2101 1 593 594 532 512 + 2102 1 594 607 608 523 + 2103 1 594 607 523 572 + 2104 1 413 276 361 392 + 2105 1 656 651 628 625 + 2106 1 173 101 127 134 + 2107 1 173 101 134 196 + 2108 1 134 173 196 200 + 2109 1 196 134 200 124 + 2110 1 134 200 124 103 + 2111 1 124 134 103 101 + 2112 1 101 127 134 103 + 2113 1 127 134 103 174 + 2114 1 134 103 174 200 + 2115 1 174 134 200 173 + 2116 1 127 134 174 173 + 2117 1 196 134 124 138 + 2118 1 134 124 138 101 + 2119 1 196 134 138 101 + 2120 1 124 196 138 198 + 2121 1 196 138 198 170 + 2122 1 196 138 170 178 + 2123 1 128 70 98 102 + 2124 1 467 413 446 321 + 2125 1 483 408 528 440 + 2126 1 483 408 440 352 + 2127 1 69 103 127 101 + 2128 1 484 504 437 342 + 2129 1 59 33 23 37 + 2130 1 23 59 37 36 + 2131 1 37 23 36 21 + 2132 1 36 37 21 51 + 2133 1 36 37 51 72 + 2134 1 36 37 72 59 + 2135 1 37 21 51 57 + 2136 1 51 37 57 72 + 2137 1 51 36 72 46 + 2138 1 37 21 57 33 + 2139 1 21 36 51 35 + 2140 1 36 51 35 46 + 2141 1 57 37 33 59 + 2142 1 36 72 46 42 + 2143 1 46 36 42 23 + 2144 1 36 42 23 59 + 2145 1 42 23 59 50 + 2146 1 59 42 50 84 + 2147 1 42 50 84 46 + 2148 1 42 23 50 46 + 2149 1 36 42 59 72 + 2150 1 42 59 72 84 + 2151 1 21 51 57 53 + 2152 1 37 21 33 23 + 2153 1 84 42 46 72 + 2154 1 37 57 72 59 + 2155 1 57 51 72 83 + 2156 1 51 72 83 46 + 2157 1 447 388 411 292 + 2158 1 279 323 411 292 + 2159 1 464 406 527 499 + 2160 1 415 468 444 318 + 2161 1 610 626 652 569 + 2162 1 357 411 388 279 + 2163 1 318 415 277 344 + 2164 1 164 279 167 208 + 2165 1 167 164 208 109 + 2166 1 167 164 109 117 + 2167 1 56 26 32 40 + 2168 1 391 445 416 320 + 2169 1 625 656 644 593 + 2170 1 233 360 275 295 + 2171 1 275 233 295 232 + 2172 1 233 295 232 348 + 2173 1 295 232 348 304 + 2174 1 295 232 304 275 + 2175 1 348 295 304 387 + 2176 1 295 304 387 275 + 2177 1 348 295 387 360 + 2178 1 348 295 360 233 + 2179 1 295 387 360 275 + 2180 1 304 348 387 394 + 2181 1 387 304 394 439 + 2182 1 49 81 107 87 + 2183 1 14 34 24 25 + 2184 1 258 301 423 397 + 2185 1 75 65 118 119 + 2186 1 48 41 67 86 + 2187 1 601 588 548 517 + 2188 1 588 548 517 546 + 2189 1 80 55 56 40 + 2190 1 353 443 319 466 + 2191 1 425 334 433 461 + 2192 1 327 400 433 289 + 2193 1 433 327 289 401 + 2194 1 289 433 401 371 + 2195 1 324 258 410 296 + 2196 1 324 258 296 307 + 2197 1 324 258 307 217 + 2198 1 448 429 374 349 + 2199 1 639 605 654 645 + 2200 1 605 654 645 649 + 2201 1 255 375 284 283 + 2202 1 563 470 504 484 + 2203 1 470 504 484 342 + 2204 1 484 470 342 398 + 2205 1 489 352 483 440 + 2206 1 483 489 440 557 + 2207 1 136 189 92 162 + 2208 1 160 97 102 190 + 2209 1 630 586 611 567 + 2210 1 229 294 336 342 + 2211 1 595 629 578 602 + 2212 1 515 535 589 600 + 2213 1 131 98 115 72 + 2214 1 220 145 207 143 + 2215 1 220 145 143 209 + 2216 1 273 164 167 188 + 2217 1 164 167 188 117 + 2218 1 381 443 495 439 + 2219 1 263 232 304 348 + 2220 1 104 64 109 93 + 2221 1 536 544 513 576 + 2222 1 513 536 576 493 + 2223 1 617 562 603 627 + 2224 1 189 231 318 277 + 2225 1 231 318 277 344 + 2226 1 410 396 494 393 + 2227 1 441 375 453 308 + 2228 1 327 400 289 246 + 2229 1 45 41 52 93 + 2230 1 444 344 415 318 + 2231 1 594 608 532 523 + 2232 1 532 594 523 512 + 2233 1 523 532 512 393 + 2234 1 523 532 393 450 + 2235 1 523 532 450 539 + 2236 1 523 532 539 608 + 2237 1 532 539 608 568 + 2238 1 539 608 568 547 + 2239 1 539 608 547 523 + 2240 1 568 539 547 450 + 2241 1 532 539 568 450 + 2242 1 547 539 523 450 + 2243 1 493 470 563 545 + 2244 1 54 75 87 80 + 2245 1 297 322 414 442 + 2246 1 634 629 652 569 + 2247 1 590 536 496 493 + 2248 1 132 203 232 151 + 2249 1 203 232 151 275 + 2250 1 548 517 546 461 + 2251 1 548 517 461 433 + 2252 1 552 510 534 459 + 2253 1 169 143 110 209 + 2254 1 349 339 426 421 + 2255 1 349 339 421 309 + 2256 1 339 426 421 469 + 2257 1 90 144 78 165 + 2258 1 161 120 121 85 + 2259 1 218 172 165 135 + 2260 1 372 365 250 400 + 2261 1 449 515 365 480 + 2262 1 43 73 85 39 + 2263 1 363 302 251 237 + 2264 1 353 319 262 217 + 2265 1 206 217 307 258 + 2266 1 327 455 386 422 + 2267 1 327 455 422 509 + 2268 1 455 386 422 541 + 2269 1 455 422 509 541 + 2270 1 386 327 422 336 + 2271 1 422 386 336 492 + 2272 1 336 422 492 341 + 2273 1 336 422 341 327 + 2274 1 422 492 341 509 + 2275 1 422 341 327 509 + 2276 1 422 492 509 541 + 2277 1 386 342 271 229 + 2278 1 119 192 135 118 + 2279 1 222 214 236 371 + 2280 1 461 533 548 488 + 2281 1 152 170 178 269 + 2282 1 261 374 305 429 + 2283 1 285 284 209 201 + 2284 1 167 161 225 182 + 2285 1 225 167 182 263 + 2286 1 182 225 263 301 + 2287 1 298 245 243 168 + 2288 1 368 373 363 500 + 2289 1 223 264 317 221 + 2290 1 223 264 221 186 + 2291 1 264 221 186 265 + 2292 1 221 186 265 247 + 2293 1 221 186 247 217 + 2294 1 264 221 265 317 + 2295 1 221 223 186 217 + 2296 1 317 223 221 217 + 2297 1 265 221 247 317 + 2298 1 247 221 217 317 + 2299 1 261 282 216 205 + 2300 1 434 496 374 477 + 2301 1 245 256 165 250 + 2302 1 245 256 250 365 + 2303 1 256 250 365 246 + 2304 1 256 250 246 218 + 2305 1 256 250 218 165 + 2306 1 246 256 218 261 + 2307 1 250 246 218 135 + 2308 1 256 218 261 165 + 2309 1 250 218 165 135 + 2310 1 297 220 255 284 + 2311 1 220 255 284 209 + 2312 1 297 220 284 342 + 2313 1 284 220 209 201 + 2314 1 284 220 201 342 + 2315 1 475 455 553 541 + 2316 1 115 123 125 72 + 2317 1 125 115 72 131 + 2318 1 112 165 90 78 + 2319 1 90 112 78 46 + 2320 1 335 306 435 439 + 2321 1 41 64 67 86 + 2322 1 574 548 533 488 + 2323 1 107 87 77 49 + 2324 1 161 225 182 199 + 2325 1 225 182 199 301 + 2326 1 575 489 558 580 + 2327 1 309 365 421 349 + 2328 1 365 421 349 460 + 2329 1 421 349 460 426 + 2330 1 72 90 46 84 + 2331 1 498 556 551 419 + 2332 1 391 431 350 383 + 2333 1 181 123 194 125 + 2334 1 300 382 281 266 + 2335 1 344 424 503 343 + 2336 1 344 424 343 264 + 2337 1 424 503 343 469 + 2338 1 343 424 469 419 + 2339 1 343 424 419 264 + 2340 1 47 49 53 27 + 2341 1 47 49 27 20 + 2342 1 564 627 563 603 + 2343 1 490 488 578 595 + 2344 1 519 515 480 365 + 2345 1 430 390 344 356 + 2346 1 344 430 356 503 + 2347 1 430 390 356 382 + 2348 1 356 430 382 436 + 2349 1 52 41 86 93 + 2350 1 171 274 200 193 + 2351 1 274 200 193 198 + 2352 1 200 171 193 137 + 2353 1 171 193 137 204 + 2354 1 193 137 204 198 + 2355 1 204 193 198 274 + 2356 1 193 137 198 200 + 2357 1 204 193 274 171 + 2358 1 67 64 120 86 + 2359 1 645 605 641 639 + 2360 1 385 490 461 334 + 2361 1 308 368 283 375 + 2362 1 491 438 436 516 + 2363 1 491 438 516 567 + 2364 1 208 163 252 214 + 2365 1 394 263 304 348 + 2366 1 430 503 486 356 + 2367 1 486 430 356 436 + 2368 1 31 35 46 16 + 2369 1 31 35 16 20 + 2370 1 31 35 20 47 + 2371 1 613 568 552 494 + 2372 1 272 303 407 323 + 2373 1 424 469 419 498 + 2374 1 523 428 571 507 + 2375 1 571 523 507 547 + 2376 1 523 428 507 547 + 2377 1 301 199 304 182 + 2378 1 480 570 546 589 + 2379 1 108 148 73 105 + 2380 1 167 273 188 263 + 2381 1 273 188 263 355 + 2382 1 263 273 355 394 + 2383 1 355 263 394 348 + 2384 1 50 84 46 63 + 2385 1 108 150 148 105 + 2386 1 163 156 252 222 + 2387 1 436 337 287 363 + 2388 1 552 568 510 514 + 2389 1 552 568 514 494 + 2390 1 510 552 514 410 + 2391 1 568 510 514 495 + 2392 1 514 568 495 450 + 2393 1 514 568 450 532 + 2394 1 514 568 532 494 + 2395 1 425 488 461 433 + 2396 1 425 488 433 371 + 2397 1 51 57 53 96 + 2398 1 441 520 561 473 + 2399 1 497 555 557 440 + 2400 1 587 600 644 625 + 2401 1 299 228 303 312 + 2402 1 218 246 261 205 + 2403 1 218 246 205 135 + 2404 1 450 428 523 547 + 2405 1 642 615 647 613 + 2406 1 191 237 141 160 + 2407 1 203 132 148 151 + 2408 1 397 306 301 439 + 2409 1 247 186 150 217 + 2410 1 206 217 258 133 + 2411 1 215 165 250 245 + 2412 1 227 254 344 300 + 2413 1 227 254 300 266 + 2414 1 496 434 493 477 + 2415 1 62 46 78 112 + 2416 1 563 541 504 475 + 2417 1 565 613 615 642 + 2418 1 589 605 641 535 + 2419 1 19 52 29 26 + 2420 1 29 19 26 20 + 2421 1 52 29 26 56 + 2422 1 29 26 56 40 + 2423 1 26 29 20 40 + 2424 1 29 20 40 54 + 2425 1 20 40 54 49 + 2426 1 40 29 54 55 + 2427 1 40 54 49 87 + 2428 1 40 54 87 80 + 2429 1 40 29 55 56 + 2430 1 619 548 546 533 + 2431 1 285 284 201 342 + 2432 1 133 182 199 161 + 2433 1 640 619 659 660 + 2434 1 339 421 309 393 + 2435 1 339 421 393 469 + 2436 1 279 323 292 228 + 2437 1 173 249 200 211 + 2438 1 173 249 211 333 + 2439 1 399 435 447 292 + 2440 1 344 227 300 277 + 2441 1 227 300 277 162 + 2442 1 277 227 162 189 + 2443 1 167 109 104 117 + 2444 1 135 119 118 65 + 2445 1 403 454 369 317 + 2446 1 305 374 434 429 + 2447 1 238 294 383 338 + 2448 1 238 294 338 341 + 2449 1 294 383 338 437 + 2450 1 253 183 246 192 + 2451 1 51 57 96 83 + 2452 1 119 67 120 86 + 2453 1 217 148 150 195 + 2454 1 271 253 246 327 + 2455 1 271 253 327 386 + 2456 1 253 246 327 289 + 2457 1 327 253 289 341 + 2458 1 327 253 341 336 + 2459 1 253 341 336 229 + 2460 1 336 253 229 386 + 2461 1 229 336 386 342 + 2462 1 336 386 342 504 + 2463 1 253 327 386 336 + 2464 1 226 235 281 330 + 2465 1 226 235 330 212 + 2466 1 502 472 554 458 + 2467 1 546 560 480 589 + 2468 1 546 560 589 639 + 2469 1 30 48 31 20 + 2470 1 289 192 253 246 + 2471 1 274 280 297 204 + 2472 1 31 15 20 16 + 2473 1 229 198 294 204 + 2474 1 371 432 518 505 + 2475 1 459 490 534 602 + 2476 1 40 54 80 55 + 2477 1 190 267 276 237 + 2478 1 515 600 525 566 + 2479 1 485 534 578 506 + 2480 1 485 534 506 478 + 2481 1 126 179 224 192 + 2482 1 504 492 437 336 + 2483 1 428 384 454 507 + 2484 1 384 454 507 547 + 2485 1 428 384 507 547 + 2486 1 500 491 544 477 + 2487 1 626 574 569 579 + 2488 1 564 475 562 603 + 2489 1 280 171 207 204 + 2490 1 363 373 491 500 + 2491 1 140 74 132 105 + 2492 1 567 477 544 491 + 2493 1 17 15 6 8 + 2494 1 188 155 100 140 + 2495 1 188 155 140 154 + 2496 1 113 84 50 63 + 2497 1 397 423 439 301 + 2498 1 227 181 162 189 + 2499 1 301 258 311 397 + 2500 1 199 210 133 161 + 2501 1 470 563 545 484 + 2502 1 545 470 484 398 + 2503 1 261 256 349 365 + 2504 1 620 570 589 546 + 2505 1 338 294 437 341 + 2506 1 145 143 107 207 + 2507 1 18 6 17 28 + 2508 1 17 18 28 44 + 2509 1 95 116 110 209 + 2510 1 227 300 162 197 + 2511 1 227 300 197 184 + 2512 1 162 227 197 184 + 2513 1 227 300 184 266 + 2514 1 327 289 401 341 + 2515 1 76 130 118 135 + 2516 1 426 343 503 469 + 2517 1 18 6 28 16 + 2518 1 189 186 231 166 + 2519 1 145 87 107 81 + 2520 1 627 564 562 603 + 2521 1 408 528 440 497 + 2522 1 48 75 86 119 + 2523 1 311 306 268 210 + 2524 1 284 398 297 342 + 2525 1 398 297 342 442 + 2526 1 104 161 167 117 + 2527 1 25 17 24 14 + 2528 1 410 450 296 393 + 2529 1 532 514 494 450 + 2530 1 118 126 119 192 + 2531 1 199 262 304 203 + 2532 1 199 262 203 148 + 2533 1 262 304 203 275 + 2534 1 255 220 143 209 + 2535 1 255 284 209 283 + 2536 1 493 470 545 377 + 2537 1 336 386 504 492 + 2538 1 292 273 167 263 + 2539 1 292 273 263 394 + 2540 1 377 441 513 308 + 2541 1 377 441 308 375 + 2542 1 603 553 601 541 + 2543 1 603 553 541 475 + 2544 1 410 514 494 552 + 2545 1 140 99 74 105 + 2546 1 422 492 541 386 + 2547 1 313 440 408 352 + 2548 1 290 272 222 214 + 2549 1 222 290 214 371 + 2550 1 535 606 605 641 + 2551 1 644 587 625 593 + 2552 1 268 312 214 228 + 2553 1 116 83 78 68 + 2554 1 116 83 68 110 + 2555 1 83 78 68 46 + 2556 1 83 68 110 96 + 2557 1 83 68 96 51 + 2558 1 83 68 51 46 + 2559 1 353 384 403 247 + 2560 1 576 520 493 609 + 2561 1 29 48 30 20 + 2562 1 224 236 371 222 + 2563 1 625 594 593 512 + 2564 1 228 299 161 268 + 2565 1 105 73 132 148 + 2566 1 367 486 356 436 + 2567 1 356 367 436 382 + 2568 1 474 489 580 558 + 2569 1 493 434 380 477 + 2570 1 83 141 96 110 + 2571 1 523 469 393 512 + 2572 1 261 349 374 429 + 2573 1 306 311 301 210 + 2574 1 628 593 532 568 + 2575 1 528 483 440 557 + 2576 1 132 105 148 151 + 2577 1 251 368 363 321 + 2578 1 304 394 439 335 + 2579 1 140 188 154 233 + 2580 1 432 395 497 508 + 2581 1 410 450 393 494 + 2582 1 419 317 264 404 + 2583 1 558 575 580 632 + 2584 1 533 565 602 459 + 2585 1 182 117 167 161 + 2586 1 24 18 17 44 + 2587 1 518 521 554 612 + 2588 1 334 402 268 311 + 2589 1 258 199 133 217 + 2590 1 66 100 117 109 + 2591 1 275 233 232 151 + 2592 1 233 232 151 140 + 2593 1 232 151 140 132 + 2594 1 151 140 132 105 + 2595 1 409 447 292 399 + 2596 1 512 587 593 625 + 2597 1 488 461 433 505 + 2598 1 433 488 505 371 + 2599 1 461 433 505 548 + 2600 1 208 323 228 252 + 2601 1 15 30 20 19 + 2602 1 148 150 195 105 + 2603 1 419 451 369 404 + 2604 1 566 535 515 600 + 2605 1 595 569 488 578 + 2606 1 113 147 150 186 + 2607 1 512 525 572 469 + 2608 1 123 84 112 46 + 2609 1 401 327 341 509 + 2610 1 565 494 613 552 + 2611 1 613 565 552 602 + 2612 1 312 290 214 228 + 2613 1 310 237 363 321 + 2614 1 533 479 459 385 + 2615 1 246 256 261 365 + 2616 1 243 185 177 168 + 2617 1 301 304 439 335 + 2618 1 565 613 642 602 + 2619 1 161 176 268 210 + 2620 1 445 391 350 320 + 2621 1 156 222 259 252 + 2622 1 499 484 398 545 + 2623 1 429 476 434 365 + 2624 1 552 510 459 410 + 2625 1 48 29 54 20 + 2626 1 341 336 294 437 + 2627 1 336 294 437 342 + 2628 1 85 117 133 161 + 2629 1 138 196 101 159 + 2630 1 138 196 159 178 + 2631 1 101 138 159 88 + 2632 1 138 159 88 178 + 2633 1 534 552 459 602 + 2634 1 453 500 513 373 + 2635 1 224 289 326 371 + 2636 1 17 15 8 19 + 2637 1 154 242 233 188 + 2638 1 494 593 613 568 + 2639 1 466 403 353 501 + 2640 1 482 524 583 585 + 2641 1 482 524 585 556 + 2642 1 294 383 437 389 + 2643 1 251 237 191 321 + 2644 1 121 133 210 161 + 2645 1 421 512 393 469 + 2646 1 355 263 348 232 + 2647 1 93 86 120 64 + 2648 1 65 54 118 76 + 2649 1 65 54 76 31 + 2650 1 607 572 551 523 + 2651 1 7 16 27 20 + 2652 1 228 292 303 323 + 2653 1 118 135 65 76 + 2654 1 200 174 173 211 + 2655 1 200 174 211 331 + 2656 1 306 335 301 439 + 2657 1 235 347 281 330 + 2658 1 347 281 330 332 + 2659 1 217 148 195 262 + 2660 1 561 591 584 633 + 2661 1 561 591 633 596 + 2662 1 584 561 633 581 + 2663 1 573 585 631 583 + 2664 1 242 234 213 328 + 2665 1 242 234 328 355 + 2666 1 213 242 328 329 + 2667 1 330 226 212 332 + 2668 1 595 574 533 488 + 2669 1 342 484 398 442 + 2670 1 548 517 433 505 + 2671 1 78 76 31 65 + 2672 1 78 76 65 135 + 2673 1 594 625 572 512 + 2674 1 172 165 135 78 + 2675 1 245 349 365 309 + 2676 1 137 107 103 171 + 2677 1 137 107 171 207 + 2678 1 222 259 313 269 + 2679 1 313 222 269 224 + 2680 1 275 319 195 262 + 2681 1 408 259 320 269 + 2682 1 249 211 333 331 + 2683 1 45 64 93 109 + 2684 1 124 103 80 101 + 2685 1 661 664 668 670 + 2686 1 661 664 670 663 + 2687 1 664 670 663 669 + 2688 1 664 668 670 669 + 2689 1 147 217 150 186 + 2690 1 663 635 649 620 + 2691 1 338 238 341 350 + 2692 1 341 338 350 431 + 2693 1 338 350 431 383 + 2694 1 341 338 431 492 + 2695 1 431 338 383 437 + 2696 1 338 238 350 291 + 2697 1 350 341 431 508 + 2698 1 431 338 437 492 + 2699 1 105 151 195 148 + 2700 1 200 196 124 198 + 2701 1 326 401 289 341 + 2702 1 326 401 341 508 + 2703 1 612 569 610 652 + 2704 1 279 388 292 411 + 2705 1 317 419 369 404 + 2706 1 251 283 321 191 + 2707 1 492 336 341 437 + 2708 1 660 669 659 664 + 2709 1 90 72 123 84 + 2710 1 123 90 84 46 + 2711 1 91 44 63 50 + 2712 1 369 404 265 317 + 2713 1 11 26 20 22 + 2714 1 155 100 140 99 + 2715 1 150 247 217 195 + 2716 1 383 238 338 291 + 2717 1 272 303 323 228 + 2718 1 366 400 246 365 + 2719 1 250 365 246 400 + 2720 1 263 335 304 301 + 2721 1 434 429 365 305 + 2722 1 497 465 395 408 + 2723 1 380 377 493 513 + 2724 1 341 338 492 437 + 2725 1 48 67 119 86 + 2726 1 294 286 274 198 + 2727 1 587 600 625 572 + 2728 1 483 489 557 582 + 2729 1 483 489 582 580 + 2730 1 69 103 101 80 + 2731 1 259 313 269 408 + 2732 1 411 323 447 292 + 2733 1 4 8 6 5 + 2734 1 6 4 5 3 + 2735 1 4 8 5 2 + 2736 1 32 60 56 40 + 2737 1 644 656 647 593 + 2738 1 628 656 625 593 + 2739 1 22 32 26 40 + 2740 1 17 6 14 8 + 2741 1 445 465 320 395 + 2742 1 233 329 348 242 + 2743 1 280 414 389 297 + 2744 1 413 446 321 310 + 2745 1 60 69 56 80 + 2746 1 41 86 93 64 + 2747 1 415 390 277 344 + 2748 1 251 363 237 321 + 2749 1 3 9 7 6 + 2750 1 2 10 11 5 + 2751 1 11 2 5 8 + 2752 1 5 11 8 15 + 2753 1 8 5 15 6 + 2754 1 5 15 6 7 + 2755 1 5 15 7 10 + 2756 1 473 581 559 561 + 2757 1 160 97 190 141 + 2758 1 419 469 551 498 + 2759 1 203 262 275 195 + 2760 1 455 327 433 509 + 2761 1 232 233 348 242 + 2762 1 232 233 242 188 + 2763 1 242 232 188 355 + 2764 1 170 239 196 178 + 2765 1 313 371 222 224 + 2766 1 84 46 63 112 + 2767 1 182 263 304 301 + 2768 1 469 523 551 572 + 2769 1 481 473 561 581 + 2770 1 20 10 7 15 + 2771 1 574 505 579 540 + 2772 1 47 54 20 31 + 2773 1 578 595 602 490 + 2774 1 10 20 11 15 + 2775 1 659 662 664 669 + 2776 1 228 214 208 252 + 2777 1 332 248 351 281 + 2778 1 440 432 497 555 + 2779 1 551 469 572 503 + 2780 1 63 28 50 44 + 2781 1 269 395 320 408 + 2782 1 184 125 190 131 + 2783 1 477 373 513 500 + 2784 1 56 80 40 60 + 2785 1 175 226 248 332 + 2786 1 308 284 375 283 + 2787 1 246 183 135 192 + 2788 1 2 10 5 7 + 2789 1 5 4 2 1 + 2790 1 5 4 1 3 + 2791 1 2 5 1 3 + 2792 1 520 377 513 493 + 2793 1 520 377 493 545 + 2794 1 493 520 545 609 + 2795 1 626 574 579 601 + 2796 1 346 354 249 331 + 2797 1 249 200 211 331 + 2798 1 354 331 240 200 + 2799 1 640 659 664 660 + 2800 1 532 494 393 450 + 2801 1 281 226 330 332 + 2802 1 525 421 426 469 + 2803 1 169 209 283 255 + 2804 1 152 170 269 224 + 2805 1 151 203 275 195 + 2806 1 151 203 195 148 + 2807 1 113 84 63 112 + 2808 1 199 301 210 306 + 2809 1 199 301 306 225 + 2810 1 314 329 213 328 + 2811 1 622 631 585 583 + 2812 1 623 580 582 632 + 2813 1 315 330 212 332 + 2814 1 671 669 670 668 + 2815 1 333 211 316 331 + 2816 1 633 581 624 584 + 2817 1 373 477 491 500 + 2818 1 563 541 475 603 + 2819 1 216 209 116 205 + 2820 1 435 478 439 306 + 2821 1 442 484 437 342 + 2822 1 551 469 503 498 + 2823 1 28 15 16 6 + 2824 1 506 399 447 502 + 2825 1 562 590 496 493 + 2826 1 265 264 317 404 + 2827 1 233 329 242 213 + 2828 1 137 171 204 207 + 2829 1 97 131 190 125 + 2830 1 437 504 336 342 + 2831 1 203 262 195 148 + 2832 1 162 131 115 184 + 2833 1 294 229 204 342 + 2834 1 144 165 172 78 + 2835 1 178 152 269 259 + 2836 1 200 171 137 103 + 2837 1 520 559 561 473 + 2838 1 489 575 557 582 + 2839 1 563 493 545 609 + 2840 1 341 401 509 508 + 2841 1 380 477 513 493 + 2842 1 2 5 3 7 + 2843 1 5 3 7 6 + 2844 1 305 246 261 365 + 2845 1 214 222 163 252 + 2846 1 28 46 50 23 + 2847 1 294 383 389 274 + 2848 1 389 294 274 297 + 2849 1 217 148 262 199 + 2850 1 290 272 214 228 + 2851 1 426 503 538 572 + 2852 1 164 188 100 117 + 2853 1 368 321 467 500 + 2854 1 596 520 561 591 + 2855 1 187 141 116 110 + 2856 1 5 11 15 10 + 2857 1 18 28 44 50 + 2858 1 18 28 50 23 + 2859 1 91 63 113 50 + 2860 1 198 294 204 274 + 2861 1 633 561 596 559 + 2862 1 408 352 259 313 + 2863 1 308 373 453 513 + 2864 1 96 141 160 191 + 2865 1 386 475 504 541 + 2866 1 96 141 191 110 + 2867 1 46 31 78 68 + 2868 1 109 164 100 117 + 2869 1 268 244 311 210 + 2870 1 575 580 632 582 + 2871 1 328 242 355 348 + 2872 1 568 547 495 450 + 2873 1 182 117 161 133 + 2874 1 54 20 31 48 + 2875 1 575 489 580 582 + 2876 1 222 152 259 269 + 2877 1 222 152 269 224 + 2878 1 459 410 494 552 + 2879 1 488 461 505 548 + 2880 1 338 350 383 291 + 2881 1 377 398 470 545 + 2882 1 159 196 278 178 + 2883 1 18 28 23 16 + 2884 1 172 116 78 135 + 2885 1 356 266 382 300 + 2886 1 239 269 320 178 + 2887 1 608 628 532 568 + 2888 1 321 191 276 237 + 2889 1 191 276 237 160 + 2890 1 350 395 508 445 + 2891 1 350 395 445 320 + 2892 1 442 437 389 294 + 2893 1 265 369 317 247 + 2894 1 369 317 247 403 + 2895 1 594 523 512 572 + 2896 1 554 458 506 502 + 2897 1 494 565 459 552 + 2898 1 348 232 242 355 + 2899 1 329 348 242 328 + 2900 1 250 246 135 192 + 2901 1 508 555 497 432 + 2902 1 534 490 578 602 + 2903 1 581 559 561 633 + 2904 1 575 632 557 582 + 2905 1 217 247 317 384 + 2906 1 365 429 261 305 + 2907 1 281 226 332 248 + 2908 1 660 663 669 664 + 2909 1 160 190 276 237 + 2910 1 259 320 269 178 + 2911 1 341 326 253 289 + 2912 1 249 200 331 354 + 2913 1 30 29 20 19 + 2914 1 246 250 400 289 + 2915 1 606 535 600 641 + 2916 1 363 368 500 321 + 2917 1 641 600 644 589 + 2918 1 641 600 589 535 + 2919 1 517 433 505 540 + 2920 1 169 143 209 255 + 2921 1 196 239 278 178 + 2922 1 237 141 160 190 + 2923 1 297 204 342 294 + 2924 1 523 469 512 572 + 2925 1 130 205 135 116 + 2926 1 130 205 116 209 + 2927 1 525 572 469 426 + 2928 1 306 225 161 199 + 2929 1 247 217 195 319 + 2930 1 20 11 15 19 + 2931 1 297 274 204 294 + 2932 1 266 184 281 300 + 2933 1 442 389 297 294 + 2934 1 512 587 625 572 + 2935 1 209 187 116 110 + 2936 1 320 178 278 239 + 2937 1 278 320 239 350 + 2938 1 46 28 16 23 + 2939 1 247 317 384 403 + 2940 1 431 492 508 341 + 2941 1 503 426 469 572 + 2942 1 250 246 192 289 + 2943 1 565 459 552 602 + 2944 1 15 20 16 7 + 2945 1 16 15 7 6 + 2946 1 492 509 508 341 + 2947 1 319 195 262 217 + 2948 1 384 353 217 247 + 2949 1 306 268 210 161 + 2950 1 319 353 247 217 + 2951 1 320 278 391 350 + 2952 1 297 342 442 294 + 2953 1 210 199 306 161 + 2954 1 294 437 342 442 +End Elements + +Begin Conditions WallCondition3D3N// GUI group identifier: _HIDDEN__SKIN_ + 1 0 622 583 631 + 2 0 328 357 355 + 3 0 637 652 612 + 4 0 656 651 628 + 5 0 412 360 387 + 6 0 526 580 558 + 7 0 669 671 668 + 8 0 529 466 501 + 9 0 411 463 447 + 10 0 655 665 646 + 11 0 636 631 592 + 12 0 329 314 328 + 13 0 623 632 580 + 14 0 668 666 662 + 15 0 583 529 543 + 16 0 357 411 388 + 17 0 652 655 629 + 18 0 651 636 608 + 19 0 360 329 348 + 20 0 466 412 443 + 21 0 463 526 502 + 22 0 665 669 659 + 23 0 632 637 597 + 24 0 666 656 647 + 25 0 355 357 388 + 26 0 355 388 394 + 27 0 592 631 583 + 28 0 502 526 558 + 29 0 502 558 554 + 30 0 394 388 435 + 31 0 554 558 597 + 32 0 597 558 632 + 33 0 502 554 506 + 34 0 558 580 632 + 35 0 629 655 646 + 36 0 629 646 602 + 37 0 602 646 642 + 38 0 629 602 578 + 39 0 628 651 608 + 40 0 628 608 568 + 41 0 568 608 547 + 42 0 628 568 613 + 43 0 543 529 501 + 44 0 543 501 547 + 45 0 597 637 612 + 46 0 597 612 554 + 47 0 447 463 502 + 48 0 447 502 506 + 49 0 447 506 435 + 50 0 435 506 478 + 51 0 447 435 388 + 52 0 478 506 534 + 53 0 435 478 439 + 54 0 447 388 411 + 55 0 348 329 328 + 56 0 612 652 629 + 57 0 612 629 578 + 58 0 612 578 554 + 59 0 662 666 647 + 60 0 662 647 642 + 61 0 659 669 662 + 62 0 501 466 443 + 63 0 501 443 495 + 64 0 495 443 439 + 65 0 501 495 547 + 66 0 608 636 592 + 67 0 608 592 547 + 68 0 547 592 543 + 69 0 543 592 583 + 70 0 387 360 348 + 71 0 387 348 394 + 72 0 647 656 628 + 73 0 647 628 613 + 74 0 647 613 642 + 75 0 646 665 659 + 76 0 646 659 642 + 77 0 642 659 662 + 78 0 662 669 668 + 79 0 443 412 387 + 80 0 443 387 439 + 81 0 328 355 348 + 82 0 348 355 394 + 83 0 439 478 510 + 84 0 435 439 394 + 85 0 394 439 387 + 86 0 506 554 578 + 87 0 578 602 534 + 88 0 613 568 552 + 89 0 602 642 613 + 90 0 568 547 495 + 91 0 510 478 534 + 92 0 439 510 495 + 93 0 534 602 552 + 94 0 578 534 506 + 95 0 552 568 510 + 96 0 613 552 602 + 97 0 495 510 568 + 98 0 552 510 534 +End Conditions + +Begin SubModelPart Parts_Parts_Auto1 // Group Parts Auto1 // Subtree Parts + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart +Begin SubModelPart NoSlip3D_No_Slip_Auto1 // Group No Slip Auto1 // Subtree NoSlip3D + Begin SubModelPartNodes + 314 + 328 + 329 + 348 + 355 + 357 + 360 + 387 + 388 + 394 + 411 + 412 + 435 + 439 + 443 + 447 + 463 + 466 + 478 + 495 + 501 + 502 + 506 + 510 + 526 + 529 + 534 + 543 + 547 + 552 + 554 + 558 + 568 + 578 + 580 + 583 + 592 + 597 + 602 + 608 + 612 + 613 + 622 + 623 + 628 + 629 + 631 + 632 + 636 + 637 + 642 + 646 + 647 + 651 + 652 + 655 + 656 + 659 + 662 + 665 + 666 + 668 + 669 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + End SubModelPartConditions +End SubModelPart +Begin SubModelPart TEMPERATURE_Parts_Auto1 // Group Parts Auto1 // Subtree TEMPERATURE + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart +Begin SubModelPart HeatFlux3D_Thermal_face_conditions_Auto3 // Group Thermal face conditions Auto3 // Subtree HeatFlux3D + Begin SubModelPartNodes + 1 + 2 + 3 + 7 + 10 + 12 + 13 + 21 + 22 + 27 + 32 + 33 + 49 + 53 + 57 + 60 + 69 + 70 + 81 + 96 + 102 + 103 + 107 + 110 + 127 + 128 + 143 + 157 + 160 + 169 + 171 + 174 + 191 + 207 + 211 + 212 + 235 + 240 + 255 + 276 + 280 + 283 + 315 + 316 + 321 + 322 + 330 + 331 + 358 + 361 + 375 + 405 + 406 + 413 + 414 + 464 + 467 + 473 + 481 + 527 + 530 + 581 + 584 + 624 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements +End SubModelPart +Begin SubModelPart ImposedTemperature3D_Imposed_temperature_Auto1 // Group Imposed temperature Auto1 // Subtree ImposedTemperature3D + Begin SubModelPartNodes + 314 + 328 + 329 + 348 + 355 + 357 + 360 + 387 + 388 + 394 + 411 + 412 + 435 + 439 + 443 + 447 + 463 + 466 + 478 + 495 + 501 + 502 + 506 + 510 + 526 + 529 + 534 + 543 + 547 + 552 + 554 + 558 + 568 + 578 + 580 + 583 + 592 + 597 + 602 + 608 + 612 + 613 + 622 + 623 + 628 + 629 + 631 + 632 + 636 + 637 + 642 + 646 + 647 + 651 + 652 + 655 + 656 + 659 + 662 + 665 + 666 + 668 + 669 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + End SubModelPartConditions +End SubModelPart +Begin SubModelPart ThermalFace3D_Thermal_face_conditions_Auto3 // Group Thermal face conditions Auto3 // Subtree ThermalFace3D + Begin SubModelPartNodes + 1 + 2 + 3 + 7 + 10 + 12 + 13 + 21 + 22 + 27 + 32 + 33 + 49 + 53 + 57 + 60 + 69 + 70 + 81 + 96 + 102 + 103 + 107 + 110 + 127 + 128 + 143 + 157 + 160 + 169 + 171 + 174 + 191 + 207 + 211 + 212 + 235 + 240 + 255 + 276 + 280 + 283 + 315 + 316 + 321 + 322 + 330 + 331 + 358 + 361 + 375 + 405 + 406 + 413 + 414 + 464 + 467 + 473 + 481 + 527 + 530 + 581 + 584 + 624 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements +End SubModelPart +Begin SubModelPart Boussinesq__Boussinesq_hidden_ // Group _Boussinesq_hidden_ // Subtree Boussinesq + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.msh b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.msh new file mode 100644 index 000000000000..8965da5598c1 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.msh differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.png b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.png new file mode 100644 index 000000000000..7ee4930f416e Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.png differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.prj b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.prj new file mode 100644 index 000000000000..3c259c5b8e99 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.prj @@ -0,0 +1,45 @@ + + +
+    
+    
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+    
+    
+      
+        1:6
+        4x4 7 3
+        7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 18 19 20 5 13 15
+      
+      
+        1
+        3
+        1 12 14
+      
+      
+        1:671
+        10x3 7 3 7 10 7 7 10 7 10 10 7 3x3 7 7 3 10 10 7x4 10 3x4 10 10 7 3x9 7 7 3x3 10 7 3 7 10 3 3 7 10 7 7 10 7 3x7 10 10 7 3x9 10 3x6 7 3 3 7x3 3 3 10 3 7x4 10 10 3 7 7 10 3 7 10 3x3 7 3x12 10 10 7 3x13 10 3x6 7 7 3 3 7x3 10 3 7 10 3 7x3 3x4 10 3 10 3 7 10 7 3 3 7 3x7 7 3 3 7 3 10 3x3 7 3x11 10 7 3 3 10 10 7 3x19 7 7 10 3x4 10 7 3x5 7 7 3x3 7 3 3 10 3x3 7 3x5 7 3x9 7 10 7x3 10 3 3 10 3x30 10x3 3 7x3 10 10 7 3x4 10x4 7 7 3x12 7 7 6 3 3 7 7 3 7 6 3 10 10 7 10 10 7 3x6 7 3x5 10 3x6 7 7 3x3 6 6 7x4 3 6 3x8 7 7 10 10 7 7 3 3 10x4 7 7 3x13 7 7 3x3 6 7 7 3 6 3 3 7 6 7x3 6 3x15 10 10 7 10 10 7 3 3 7 3 10 7 3x3 6 3 3 10 7x3 3 7 3x4 7 7 3 3 6 3 7x4 6 6 7 7 3 6 3 7 3 6 3x5 7 3x9 10 10 7 10 10 7 3 3 6 3x3 7 3 3 7 7 6 7 7 3 6 3 7 3 7 6 3 6 7x3 6 7 3x3 7 3 3 7 7 6 3x3 7 3x5 6 7 10 10 7 10 10 7 3x5 7 6 3x3 7 6 7x4 6 7 3 3 7 7 6 7x3 6 6 3x8 10x3 7x3 6 6 7 10 10 7 3 7 10 10 7 3 3 7 6 3 7 7 6 6 7 7 3 10 10 7 3 10 10 7 7 6 7 7 6 7 3 10 10 7 10 10 7 10
+        7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 5 13 15 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 5 13 15 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 18 19 20 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 1 12 14 5 13 15 1 12 14 7 9 11 17 1 12 14 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 5 13 15 1 12 14 7 9 11 17 1 12 14 7 9 11 17 5 13 15 1 12 14
+      
+      
+        1:3542
+        3x2954 4x392 7x98 3x98
+        1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 1 12 14 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 7 9 11 17 18 19 20 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15 5 13 15
+      
+    
+  
+
diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.rdr b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.rdr new file mode 100644 index 000000000000..0114caabb390 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.rdr differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.spd b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.spd new file mode 100644 index 000000000000..26cb7acfd23f Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.spd differ diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.tree b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.tree new file mode 100644 index 000000000000..d384111098c9 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.tree @@ -0,0 +1,9 @@ + + +
+    
+    
+    
+    
+  
+
diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.vv b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.vv new file mode 100644 index 000000000000..d3c99b7a4c8c --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q.vv @@ -0,0 +1,37 @@ +BeginZE /home/julio/B_KRATOS/Kratos/applications/ConvectionDiffusionApplication/test_examples/polimero_prueba_q.gid/polimero_prueba_q.vv + x -0.780896544456481934 1.77025330066680908 + y 1.40225183963775635 -0.694879889488220215 + z -3.6324007511138916 2.65899443626403809 + e 1.04856586456298828 + v 0.022847140565061333 0.926041584318712641 0.046026821595937524 + r -0.37390710607618477 + m -0.719342947006225586 0.0767343193292617798 -0.690403878688812256 0 0.00789529271423816681 0.994719088077545166 0.102330915629863739 0 0.694610238075256348 0.0681600868701934814 -0.716149985790252686 0 0 0 0 1 + c 0.494678407907485962 0.353685945272445679 0.486703217029571533 + pd 0 + pno 0 + pfo 0 + pf 4 + pv 0 + NowUse 2 + DrawingType 3 + LightVector 90 90 150 0 + OGLShadow(UseShadows) 0 + OGLShadow(RenderMode) RenderNice + OGLShadow(ShadowBias) -0.002 + OGLShadow(AmbientShadows) 1 + OGLShadow(UseFBO) 0 + OGLShadow(FBOSize) 2048 + OGLShadow(DimmedLightFactor) 0.02 + OGLStereo(UseStereo) 0 + OGLStereo(RelativeEyeDistance) 1 + OGLStereo(FlipEyes) 0 + OGLStereo(StereoMode) AnaglyphColors + OGLStereo(EyeDistance) 0.075 + OGLStereo(LeftEyeDistance) 1 0 0 1 + OGLStereo(RightEyeDistance) 0 1 1 1 +EndZE /home/julio/B_KRATOS/Kratos/applications/ConvectionDiffusionApplication/test_examples/polimero_prueba_q.gid/polimero_prueba_q.vv + +BeginMirror + Mirror 0 Angle 0.0 AngleFake -15.0 SizeFactor 2.0 HeightOffset 0.25 Color #d9e5f24d Backlight Off EdgeStyle No Type Scene DrawMode Mirror +EndMirror + diff --git a/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q_mdpa_new.docx b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q_mdpa_new.docx new file mode 100644 index 000000000000..4e12e8f1f406 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square/polimero_prueba_q_mdpa_new.docx differ diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/BuoyancyMaterials.json b/applications/PfemMeltingApplication/test_examples/square_clean/BuoyancyMaterials.json new file mode 100644 index 000000000000..de92a352e22b --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/BuoyancyMaterials.json @@ -0,0 +1,13 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "CONDUCTIVITY" : 1000.0, + "SPECIFIC_HEAT" : 1920.0 + }, + "Tables" : {} + } + }] +} diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/FluidMaterials.json b/applications/PfemMeltingApplication/test_examples/square_clean/FluidMaterials.json new file mode 100644 index 000000000000..7e7975ebf59f --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/FluidMaterials.json @@ -0,0 +1,39 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "ACTIVATION_ENERGY" : 0.0, + "ARRHENIUS_COEFFICIENT" : 0.0, + "HEAT_OF_VAPORIZATION" : 0.0, + "CONDUCTIVITY" : 1000.0, + "SPECIFIC_HEAT" : 1920.0, + "DYNAMIC_VISCOSITY" : 10000000.0, + "DENSITY" : 900.0, + "EMISSIVITY" : 1.0, + "AMBIENT_TEMPERATURE" : 298.0, + "CONVECTION_COEFFICIENT" : 0.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "DYNAMIC_VISCOSITY", + "data": [ + [298.0, 1000000.0], + [374.0, 1000000.0], + [473.0, 500000.0], + [553.0, 8706.0], + [613.0, 3716.0], + [723.0, 500.0], + [798.0, 500.0], + [1373.0, 500.3] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/LaserSettings.json b/applications/PfemMeltingApplication/test_examples/square_clean/LaserSettings.json new file mode 100644 index 000000000000..cdf3f39a059d --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/LaserSettings.json @@ -0,0 +1,30 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "INITIAL_POSITION_X" : 0.57102, + "INITIAL_POSITION_Y" : 0.99997, + "INITIAL_POSITION_Z" : 0.5299, + "RADIOUS" : 0.8, + "FACE_HEAT_FLUX" : 10000000.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "YOUNG_MODULUS", + "data": [ + [0.0, 2.0], + [1.0, 10.0], + [2.0, 12.0], + [3.5, 15.0] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/MainKratos.py b/applications/PfemMeltingApplication/test_examples/square_clean/MainKratos.py new file mode 100644 index 000000000000..274aa39f8643 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/MainKratos.py @@ -0,0 +1,36 @@ +from __future__ import print_function, absolute_import, division #makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +import KratosMultiphysics +import KratosMultiphysics.PfemMeltingApplication + + +#from convection_diffusion_analysis import ConvectionDiffusionAnalysis +from KratosMultiphysics.PfemMeltingApplication.pfem_melting_analysis import PfemMeltingAnalysis +import sys +import time + +class PfemMeltingAnalysisWithFlush(PfemMeltingAnalysis): + + def __init__(self,model,project_parameters,flush_frequency=10.0): + super(PfemMeltingAnalysisWithFlush,self).__init__(model,project_parameters) + + self.flush_frequency = flush_frequency + self.last_flush = time.time() + + def FinalizeSolutionStep(self): + super(PfemMeltingAnalysisWithFlush,self).FinalizeSolutionStep() + + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + +if __name__ == "__main__": + + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = PfemMeltingAnalysisWithFlush(model,parameters) + simulation.Run() diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/ProjectParameters.json b/applications/PfemMeltingApplication/test_examples/square_clean/ProjectParameters.json new file mode 100644 index 000000000000..90f3a47be29d --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/ProjectParameters.json @@ -0,0 +1,189 @@ +{ + "problem_data" : { + "problem_name" : "polimero_prueba_q", + "domain_size" : 3, + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 100.0, + "laser_import_settings" : { + "laser_filename": "LaserSettings.json" + }, + "material_settings" : { + "material_filename": "MaterialCharacterization.json" + }, + "environment_settings" : { + "gravity": [0,-10.0, 0], + "ambient_temperature" : 293.15 + } + }, + "output_processes" : { + "gid_output" : [{ + "python_module" : "gid_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "GiDOutputProcess", + "help" : "This process writes postprocessing files for GiD", + "Parameters" : { + "model_part_name" : "FluidModelPart", + "output_name" : "polimero_prueba_q", + "postprocess_parameters" : { + "result_file_configuration" : { + "gidpost_flags" : { + "GiDPostMode" : "GiD_PostBinary", + "WriteDeformedMeshFlag" : "WriteDeformed", + "WriteConditionsFlag" : "WriteConditions", + "MultiFileFlag" : "MultipleFiles" + }, + "file_label" : "time", + "output_control_type" : "time", + "output_frequency" : 0.01, + "body_output" : true, + "node_output" : false, + "skin_output" : false, + "plane_output" : [], + "nodal_results" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT", "VISCOSITY", "CONDUCTIVITY", "SPECIFIC_HEAT", "IS_STRUCTURE","IS_FREE_SURFACE" ], + "gauss_point_results" : [] + }, + "point_data_configuration" : [] + } + } + }], + "vtk_output" : [{ + "python_module" : "vtk_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "VtkOutputProcess", + "help" : "This process writes postprocessing files for Paraview", + "Parameters" : { + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "output_control_type" : "step", + "output_frequency" : 1, + "file_format" : "ascii", + "output_precision" : 7, + "output_sub_model_parts" : true, + "folder_name" : "vtk_output", + "save_output_files_in_folder" : true, + "nodal_solution_step_data_variables" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT"], + "nodal_data_value_variables" : [], + "element_data_value_variables" : [], + "condition_data_value_variables" : [] + } + }] + }, + "restart_options" : { + "SaveRestart" : "False", + "RestartFrequency" : 0, + "LoadRestart" : "False", + "Restart_Step" : 0 + }, + "solver_settings" : { + "solver_type" : "ThermallyCoupledPfem2", + "domain_size" : 3, + "echo_level" : 0, + "fluid_solver_settings" : { + "model_part_name" : "FluidModelPart", + "domain_size" : 3, + "solver_type" : "Monolithic", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "echo_level" : 0, + "compute_reactions" : true, + "maximum_iterations" : 10, + "reform_dofs_at_each_step": true, + "relative_velocity_tolerance" : 0.001, + "absolute_velocity_tolerance" : 1e-5, + "relative_pressure_tolerance" : 0.001, + "absolute_pressure_tolerance" : 1e-5, + "volume_model_part_name" : "FluidParts_Parts_Auto1", + "skin_parts" : ["NoSlip3D_No_Slip_Auto1"], + "no_skin_parts" : [], + "time_stepping" : { + "automatic_time_step" : false, + "time_step" : 0.005 + }, + "alpha":0.0, + "move_mesh_strategy": 2, + "formulation" : { + "element_type" : "vms", + "use_orthogonal_subscales" : false, + "dynamic_tau" : 0.0 + } + }, + "thermal_solver_settings" : { + "solver_type" : "transient", + "analysis_type" : "non_linear", + "model_part_name" : "ThermalModelPart", + "domain_size" : 3, + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "material_import_settings" : { + "materials_filename" : "BuoyancyMaterials.json" + }, + "time_integration_method" : "implicit", + "transient_parameters" : { + "dynamic_tau": 0.0, + "theta" : 0.5 + }, + "reform_dofs_at_each_step": true, + "line_search" : false, + "echo_level" : 0, + "compute_reactions" : false, + "max_iteration" : 10, + "convergence_criterion" : "residual_criterion", + "solution_relative_tolerance" : 1e-5, + "solution_absolute_tolerance" : 1e-7, + "residual_relative_tolerance" : 1e-5, + "residual_absolute_tolerance" : 1e-7, + "problem_domain_sub_model_part_list" : ["FluidParts_Parts_Auto1"], + "processes_sub_model_part_list" : [""], + "time_stepping" : { + "time_step" : 0.01 + } + } + }, + "processes" : { + "constraints_process_list" : [{ + "python_module" : "apply_noslip_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "Parameters" : { + "model_part_name" : "FluidModelPart.NoSlip3D_No_Slip_Auto1" + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.TEMPERATURE_Parts_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : false, + "value" : 350.0, + "interval" : [0.0,0.0] + } + },{ + "python_module" : "apply_laser_process", + "kratos_module" : "KratosMultiphysics.PfemMeltingApplication", + "process_name" : "ApplyLaserProcess", + "Parameters" : { + "model_part_name" : "ThermalModelPart.TEMPERATURE_Parts_Auto1", + "laser_profile" : { + "shape": [], + "radius": 0.5, + "power": 500000000.0}, + "direction" : [1.0,0.0,0.0], + "path" : { + "table" : [0.0, 1.0, 2.0, 0.0] + } + } + }] + } +} + + + + + + + + diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.mdpa b/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.mdpa new file mode 100644 index 000000000000..a4a28c38ae8a --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.mdpa @@ -0,0 +1,8227 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties + +Begin Properties 1 +End Properties + + + +Begin Nodes + 1 0.0000000000 1.0000000000 1.0000000000 + 2 0.1428571429 1.0000000000 1.0000000000 + 3 0.0000000000 1.0000000000 0.8571428571 + 4 0.0000000000 0.8571428571 1.0000000000 + 5 0.0918312382 0.8977829983 0.9081687618 + 6 0.0000000000 0.7857142857 0.8700961894 + 7 0.1299038106 1.0000000000 0.7857142857 + 8 0.1299038106 0.7857142857 1.0000000000 + 9 0.0000000000 0.8796728280 0.7610710800 + 10 0.2402664764 1.0000000000 0.8792005708 + 11 0.2402664764 0.8792005708 1.0000000000 + 12 0.2857142857 1.0000000000 1.0000000000 + 13 0.0000000000 1.0000000000 0.7142857143 + 14 0.0000000000 0.7142857143 1.0000000000 + 15 0.1608404886 0.8216039701 0.8321262122 + 16 0.1118033989 0.9165896725 0.7060713124 + 17 0.1202269179 0.6951396157 0.8654024038 + 18 0.0000000000 0.7432260441 0.7462161530 + 19 0.2544826993 0.7431520015 1.0000000000 + 20 0.3148384622 0.8881966011 0.8294925583 + 21 0.1423525250 1.0000000000 0.6508229884 + 22 0.3571428571 1.0000000000 0.8700961894 + 23 0.0000000000 0.8700961894 0.6428571429 + 24 0.0000000000 0.6428571429 0.8700961894 + 25 0.1299038106 0.6428571429 1.0000000000 + 26 0.3571428571 0.8700961894 1.0000000000 + 27 0.2857142857 1.0000000000 0.7401923789 + 28 0.1302490828 0.7314095989 0.7337435852 + 29 0.3625443322 0.8112247873 0.9247177002 + 30 0.2434367607 0.7148639933 0.8090084010 + 31 0.2414803888 0.8068748947 0.7076172444 + 32 0.4285714286 1.0000000000 1.0000000000 + 33 0.0000000000 1.0000000000 0.5714285714 + 34 0.0000000000 0.5714285714 1.0000000000 + 35 0.2641065112 0.8978450333 0.6681982371 + 36 0.1483675190 0.8630817082 0.6024168980 + 37 0.1118033989 0.9133974596 0.5714285714 + 38 0.2244831600 0.6125960305 0.8980703166 + 39 0.0986597483 0.5609629943 0.8821801112 + 40 0.4308006892 0.8881966011 0.8275820146 + 41 0.3332474118 0.6641866373 0.9329203997 + 42 0.0401521754 0.8040192414 0.5591250126 + 43 0.1684346856 0.6060048352 0.7733100479 + 44 0.0000000000 0.5781163534 0.7425536650 + 45 0.2574463350 0.5781163534 1.0000000000 + 46 0.1610578152 0.7435501318 0.6042723356 + 47 0.3814272016 0.9083694779 0.6894370587 + 48 0.3581023656 0.6948379371 0.8246441040 + 49 0.4352592105 1.0000000000 0.7425536650 + 50 0.0000000000 0.7028994652 0.5906226515 + 51 0.2096362978 0.9279945446 0.5450819545 + 52 0.4122329062 0.7029274666 1.0000000000 + 53 0.3085932432 1.0000000000 0.5933169800 + 54 0.4161788811 0.8174378438 0.7580960863 + 55 0.4526992579 0.7771013607 0.8936484006 + 56 0.5000000000 0.8700961894 1.0000000000 + 57 0.1299038106 1.0000000000 0.5000000000 + 58 0.0000000000 0.5000000000 0.8700961894 + 59 0.0000000000 0.8700961894 0.5000000000 + 60 0.5000000000 1.0000000000 0.8700961894 + 61 0.1299038106 0.5000000000 1.0000000000 + 62 0.2411867682 0.6730460025 0.6786389522 + 63 0.1164769303 0.6254429644 0.6481199892 + 64 0.2971185674 0.5496574680 0.8867533212 + 65 0.3705302124 0.6960105757 0.7172770396 + 66 0.1826058134 0.4751246223 0.9100737663 + 67 0.3035928210 0.5860928846 0.7640476159 + 68 0.3366682592 0.8985449485 0.5572756393 + 69 0.5714285714 1.0000000000 1.0000000000 + 70 0.0000000000 1.0000000000 0.4285714286 + 71 0.0000000000 0.4285714286 1.0000000000 + 72 0.1497434089 0.8262454996 0.4712203478 + 73 0.0957430913 0.5067544878 0.7131826776 + 74 0.0983897244 0.4588541658 0.8033269031 + 75 0.4757598692 0.7206713031 0.8074380590 + 76 0.4079909077 0.8035934732 0.6254467266 + 77 0.5575928444 0.9153315388 0.8086200022 + 78 0.3320454923 0.7214490877 0.5883514470 + 79 0.0798581784 0.8923881345 0.4161402244 + 80 0.5643883815 0.8234712246 0.8880606516 + 81 0.4679285218 1.0000000000 0.6140426985 + 82 0.2204831733 0.5382529359 0.6663024076 + 83 0.2852453101 0.8423036320 0.4826820730 + 84 0.0653321511 0.6804437154 0.4804014154 + 85 0.2316596541 0.4715444765 0.7853615010 + 86 0.4627745622 0.6040705565 0.9052835634 + 87 0.5283775967 0.8489553622 0.7133767894 + 88 0.5647407895 0.7425536650 1.0000000000 + 89 0.0785421295 0.3862224345 0.9174520853 + 90 0.2296883572 0.7290888606 0.4862186241 + 91 0.0000000000 0.5053947920 0.6114854020 + 92 0.0000000000 0.7425536650 0.4218836466 + 93 0.4289820831 0.5298954759 1.0000000000 + 94 0.3417404894 0.5922563802 0.6326826027 + 95 0.4727503219 0.9095655802 0.5677741092 + 96 0.2801902718 1.0000000000 0.4151972535 + 97 0.2150289585 0.9162287681 0.3912778159 + 98 0.0000000000 0.8700961894 0.3571428571 + 99 0.0000000000 0.3571428571 0.8700961894 + 100 0.1299038106 0.3571428571 1.0000000000 + 101 0.6428571429 0.8700961894 1.0000000000 + 102 0.1299038106 1.0000000000 0.3571428571 + 103 0.6428571429 1.0000000000 0.8700961894 + 104 0.2914511191 0.4279991273 0.8638797512 + 105 0.0000000000 0.4141502988 0.7031170417 + 106 0.5320714782 0.6140426985 1.0000000000 + 107 0.5877670938 1.0000000000 0.7029274666 + 108 0.1200341110 0.5076287569 0.5784266684 + 109 0.2971005348 0.4093773485 1.0000000000 + 110 0.4195639639 1.0000000000 0.4863943903 + 111 0.5736782513 0.6745739495 0.9235859254 + 112 0.2416075575 0.5999099981 0.5225143091 + 113 0.0983144447 0.5657881727 0.4965974642 + 114 0.0000000000 0.5710179169 0.4701045241 + 115 0.0949008109 0.7395780955 0.3760872381 + 116 0.4178395941 0.8118495555 0.4891204985 + 117 0.1854030710 0.3595557819 0.8363352453 + 118 0.5291681909 0.6957499291 0.6838400158 + 119 0.4420613958 0.5552795535 0.7182304254 + 120 0.4126368344 0.4741770081 0.8245627926 + 121 0.3360242209 0.4713554646 0.6967161319 + 122 0.6118571829 0.7514445299 0.7639650247 + 123 0.1682869744 0.6334362955 0.4242253341 + 124 0.6637659248 0.8573121501 0.8149971816 + 125 0.2326126656 0.7818563400 0.3716598697 + 126 0.5637855365 0.6171607713 0.7904954594 + 127 0.7142857143 1.0000000000 1.0000000000 + 128 0.0000000000 1.0000000000 0.2857142857 + 129 0.0000000000 0.2857142857 1.0000000000 + 130 0.5290522900 0.7847941242 0.5642852502 + 131 0.0848490054 0.8881966011 0.2924900097 + 132 0.1547442855 0.3540941482 0.7152087626 + 133 0.2260905078 0.4020271996 0.6536096319 + 134 0.7142857143 0.9133974596 0.8881966011 + 135 0.4674360458 0.6228528396 0.5877996019 + 136 0.0660067933 0.6154879006 0.3835611728 + 137 0.6599837487 0.8935345708 0.6991894201 + 138 0.6912854347 0.7720352465 0.8892763932 + 139 0.5103162719 0.4746445208 0.9205237686 + 140 0.1118033989 0.2916994270 0.8307742275 + 141 0.3388478806 0.8673469938 0.3591928247 + 142 0.2952391016 0.4818169692 0.5664198126 + 143 0.5710179169 1.0000000000 0.5298954759 + 144 0.3820689833 0.7613750639 0.4127521058 + 145 0.6078926684 0.8949480383 0.5842929967 + 146 0.4030052426 0.3787088081 0.9064756846 + 147 0.1640952756 0.4646445118 0.4976538405 + 148 0.1248289012 0.3765766192 0.5928197359 + 149 0.6332281519 0.7792309039 0.6529782053 + 150 0.0000000000 0.4195639639 0.5136056097 + 151 0.0000000000 0.2790265038 0.7425536650 + 152 0.6174516033 0.5564014450 0.9008506022 + 153 0.5431049532 0.4962652552 0.7893466127 + 154 0.0000000000 0.2389289200 0.8796728280 + 155 0.1203271720 0.2389289200 1.0000000000 + 156 0.5804360361 0.4863943903 1.0000000000 + 157 0.1246432057 1.0000000000 0.2346128863 + 158 0.4281860325 0.4920329401 0.5975766228 + 159 0.7381390670 0.7473058372 1.0000000000 + 160 0.2533860264 1.0000000000 0.2606072627 + 161 0.3758757013 0.3478506371 0.7866119419 + 162 0.0000000000 0.7455173007 0.2568479985 + 163 0.4946052080 0.3885145980 1.0000000000 + 164 0.2567739559 0.2537838470 1.0000000000 + 165 0.4024001403 0.5673366526 0.4750353905 + 166 0.1622587241 0.5464078430 0.3730192933 + 167 0.3149904891 0.2789262430 0.9171839663 + 168 0.3086689264 0.6119479922 0.3832700661 + 169 0.5053947920 1.0000000000 0.3885145980 + 170 0.6909237277 0.6482489745 0.8307372778 + 171 0.7505012691 1.0000000000 0.7381680330 + 172 0.4750966725 0.6972212996 0.4382510052 + 173 0.7857142857 0.8700961894 1.0000000000 + 174 0.7857142857 1.0000000000 0.8700961894 + 175 0.0000000000 0.8700961894 0.2142857143 + 176 0.4624406108 0.4201889250 0.7089995167 + 177 0.3514095478 0.7297719478 0.3340668111 + 178 0.6914067568 0.5933169800 1.0000000000 + 179 0.6582665059 0.6522965320 0.6978195472 + 180 0.2779867090 0.5035133640 0.4323242686 + 181 0.1506199474 0.6475560752 0.2926383499 + 182 0.2263332095 0.2542990165 0.7785937620 + 183 0.6056893971 0.6716438577 0.5728742449 + 184 0.2049414743 0.7347652737 0.2607479809 + 185 0.4338662279 0.6460207443 0.4120361941 + 186 0.0000000000 0.4679285218 0.3859573015 + 187 0.4734934183 0.9213897714 0.3416049778 + 188 0.1856086811 0.2122473683 0.9049671110 + 189 0.0000000000 0.5877670938 0.2970725334 + 190 0.2058304721 0.9049671110 0.2162095446 + 191 0.4141502988 1.0000000000 0.2968829583 + 192 0.5524344721 0.5069788144 0.6531549106 + 193 0.7582585398 0.8573978346 0.7133046360 + 194 0.2544120991 0.6459854226 0.3003366254 + 195 0.0000000000 0.2801902718 0.5848027465 + 196 0.7992908635 0.7941056277 0.8881966011 + 197 0.0882717643 0.8087571834 0.1910566375 + 198 0.7629675743 0.7639630524 0.7495646413 + 199 0.2401548315 0.2734783307 0.6514261273 + 200 0.8184548252 0.9062641435 0.8245217490 + 201 0.6580926537 0.7858628135 0.5184874129 + 202 0.3899068740 0.5962844614 0.3705241786 + 203 0.1240643770 0.2217603840 0.6951650193 + 204 0.7370900264 0.8552337130 0.6062204917 + 205 0.5733718032 0.7075399539 0.4447452563 + 206 0.2680201506 0.3766962800 0.4830005741 + 207 0.7425536650 1.0000000000 0.5781163534 + 208 0.4218836466 0.2574463350 1.0000000000 + 209 0.5663474479 0.8600848434 0.3757621146 + 210 0.3631126111 0.3495756490 0.5777206388 + 211 0.8571428571 1.0000000000 1.0000000000 + 212 0.0000000000 1.0000000000 0.1428571429 + 213 0.0000000000 0.1428571429 1.0000000000 + 214 0.5334119498 0.3368159105 0.8870709588 + 215 0.3899337148 0.4387871753 0.4773616238 + 216 0.4651991484 0.7630905101 0.3149144033 + 217 0.1389028238 0.3327328617 0.4709207741 + 218 0.4993311016 0.5710559125 0.4319793980 + 219 0.7328344454 0.5967099407 0.7511673921 + 220 0.7021554142 0.9114654714 0.4863557254 + 221 0.0571090190 0.4090181672 0.3568832999 + 222 0.6196206372 0.3944527186 0.8628832923 + 223 0.1932189164 0.4130285371 0.3742132116 + 224 0.6732876247 0.5071029905 0.7175327023 + 225 0.3424231519 0.2090554015 0.7972486544 + 226 0.0984275637 0.9265545962 0.1221654702 + 227 0.1089777116 0.6803657167 0.1795864989 + 228 0.4785461946 0.2602078500 0.8934349987 + 229 0.7374143074 0.6973568063 0.6027284979 + 230 0.2663848754 0.5212958027 0.2968967135 + 231 0.0833873539 0.5555634987 0.2297876512 + 232 0.1443979439 0.1404717281 0.7968285055 + 233 0.0000000000 0.1299038106 0.7857142857 + 234 0.2142857143 0.1299038106 1.0000000000 + 235 0.2142857143 1.0000000000 0.1299038106 + 236 0.6015557307 0.3895544685 0.7349210011 + 237 0.4083628975 0.8603664097 0.2130235245 + 238 0.8259966467 0.7053733146 0.7841148252 + 239 0.8153521368 0.6348165111 0.8565635035 + 240 0.8740192379 1.0000000000 0.7649148565 + 241 0.8740192379 0.7649148565 1.0000000000 + 242 0.1019286424 0.1045153339 0.9058246626 + 243 0.4051802292 0.6473592335 0.2699846546 + 244 0.5312064098 0.3842970885 0.5961587397 + 245 0.4109775955 0.5142997548 0.3498344785 + 246 0.5970492987 0.5736404988 0.4608794307 + 247 0.0000000000 0.3085932432 0.4066830200 + 248 0.0000000000 0.7597335236 0.1207994292 + 249 0.9006446193 0.8776837457 0.9263611454 + 250 0.5189817150 0.4799725700 0.4573522613 + 251 0.5128207032 0.8825169652 0.2516695133 + 252 0.5858497012 0.2968829583 1.0000000000 + 253 0.7134653334 0.5840279930 0.6046691755 + 254 0.2122879818 0.5902908712 0.2084632057 + 255 0.7028994652 1.0000000000 0.4093773485 + 256 0.4974089063 0.5441452940 0.3710596662 + 257 0.2966223492 0.8213145692 0.1424875243 + 258 0.2832192827 0.2552220495 0.5269877177 + 259 0.7198097282 0.4151972535 1.0000000000 + 260 0.7925318502 0.6424344930 0.6752601582 + 261 0.5084323535 0.6349987124 0.3118909049 + 262 0.1591775161 0.1902149014 0.5703995675 + 263 0.2574220686 0.1264792590 0.8007984464 + 264 0.1414811963 0.4572234497 0.2553859875 + 265 0.0000000000 0.4352592105 0.2574463350 + 266 0.3010620513 0.6885122027 0.1735098857 + 267 0.2706029869 0.9277920737 0.1081791955 + 268 0.5200118318 0.2889756007 0.6839674543 + 269 0.7804359159 0.5024872208 0.8609994101 + 270 0.3287209267 0.3975145845 0.3620381087 + 271 0.6997072897 0.6633497872 0.4736682384 + 272 0.5687082086 0.2561130512 0.9324802593 + 273 0.2943745398 0.1118033989 0.9164322534 + 274 0.8881966011 0.9164322534 0.7056254602 + 275 0.0000000000 0.1299038106 0.6428571429 + 276 0.3571428571 1.0000000000 0.1299038106 + 277 0.0000000000 0.6428571429 0.1299038106 + 278 0.8700961894 0.6428571429 1.0000000000 + 279 0.3571428571 0.1299038106 1.0000000000 + 280 0.8700961894 1.0000000000 0.6428571429 + 281 0.1810232132 0.8245758961 0.0938613819 + 282 0.5758001119 0.7459362140 0.3007238740 + 283 0.5781163534 1.0000000000 0.2574463350 + 284 0.7186037175 0.8977932075 0.3936212074 + 285 0.6817585737 0.7661910170 0.3850597820 + 286 0.9088772695 0.8074112153 0.8090959939 + 287 0.4039105443 0.7773066524 0.1702833700 + 288 0.4939531800 0.3546266382 0.5064640707 + 289 0.6577146182 0.4364455278 0.6012786510 + 290 0.6363886613 0.2986307000 0.8730275839 + 291 0.9013988681 0.7070556827 0.8725843347 + 292 0.3940217778 0.1405878164 0.8558807498 + 293 0.6850910304 0.3332136618 0.9561387544 + 294 0.8689857661 0.7447453223 0.6757170759 + 295 0.1118033989 0.0866025404 0.7142857143 + 296 0.3797966787 0.3051518304 0.4492754654 + 297 0.8326073373 0.9113015541 0.5210676136 + 298 0.3469590538 0.5591755481 0.2140065840 + 299 0.4685509906 0.1859564102 0.7629093756 + 300 0.1118033989 0.7056254602 0.0835677466 + 301 0.3040356524 0.1567058801 0.6190180408 + 302 0.4880843385 0.7265004696 0.1973885227 + 303 0.5922080045 0.2311441758 0.8527370916 + 304 0.1968038414 0.0977127553 0.6640884781 + 305 0.6451325779 0.6388575469 0.3504950331 + 306 0.4231337062 0.1790077432 0.6594407524 + 307 0.2472399409 0.2875162580 0.3653677135 + 308 0.6621397462 0.8498565702 0.2784522075 + 309 0.4642806981 0.3842727850 0.3761158921 + 310 0.4066196862 0.8975320181 0.1003029371 + 311 0.4630038792 0.2363622307 0.5571228021 + 312 0.6172916484 0.2581980228 0.7462873239 + 313 0.7590800951 0.3684652807 0.8428754672 + 314 0.0000000000 0.0000000000 1.0000000000 + 315 0.0000000000 1.0000000000 0.0000000000 + 316 1.0000000000 1.0000000000 1.0000000000 + 317 0.1326201078 0.3037999851 0.2924614044 + 318 0.0000000000 0.5000000000 0.1299038106 + 319 0.0000000000 0.1299038106 0.5000000000 + 320 0.8700961894 0.5000000000 1.0000000000 + 321 0.5000000000 1.0000000000 0.1299038106 + 322 0.8700961894 1.0000000000 0.5000000000 + 323 0.5000000000 0.1299038106 1.0000000000 + 324 0.2376416141 0.1873354832 0.4582162634 + 325 0.2468211141 0.3697422278 0.2558817100 + 326 0.7983181020 0.4463925404 0.7373753203 + 327 0.7443884476 0.5021471867 0.5332896758 + 328 0.1428571429 0.0000000000 1.0000000000 + 329 0.0000000000 0.0000000000 0.8571428571 + 330 0.1428571429 1.0000000000 0.0000000000 + 331 1.0000000000 1.0000000000 0.8571428571 + 332 0.0000000000 0.8571428571 0.0000000000 + 333 1.0000000000 0.8571428571 1.0000000000 + 334 0.6116719747 0.2926927649 0.6127266417 + 335 0.3723071459 0.0894922104 0.7508510762 + 336 0.8545452726 0.6390648610 0.5785242361 + 337 0.3482277766 0.7754299424 0.0686769988 + 338 0.9074020863 0.6431290356 0.6988578098 + 339 0.3673186209 0.4313693917 0.2350987079 + 340 0.0907819701 0.0720916742 0.5813060987 + 341 0.8451578033 0.5413242304 0.6505192122 + 342 0.8329741319 0.7470603444 0.4612461137 + 343 0.2575449412 0.4694501611 0.1626449758 + 344 0.1526375824 0.5314296278 0.1001711000 + 345 0.6212937377 0.3552415996 0.4972140485 + 346 1.0000000000 0.7857142857 0.8700961894 + 347 0.2142857143 0.8700961894 0.0000000000 + 348 0.1299038106 0.0000000000 0.7857142857 + 349 0.4988546850 0.5152073116 0.2388461922 + 350 0.9017055166 0.5367643820 0.7949630459 + 351 0.1246432057 0.7653871137 0.0000000000 + 352 0.7209734962 0.2574463350 1.0000000000 + 353 0.1152846814 0.1258652893 0.4577827840 + 354 1.0000000000 0.8792005708 0.7597335236 + 355 0.2402664764 0.0000000000 0.8792005708 + 356 0.2790228551 0.5829529553 0.0891207990 + 357 0.2857142857 0.0000000000 1.0000000000 + 358 1.0000000000 1.0000000000 0.7142857143 + 359 1.0000000000 0.7142857143 1.0000000000 + 360 0.0000000000 0.0000000000 0.7142857143 + 361 0.2857142857 1.0000000000 0.0000000000 + 362 0.0000000000 0.7142857143 0.0000000000 + 363 0.4912634559 0.8276383189 0.0955786189 + 364 0.8041160820 0.9254167870 0.3375521024 + 365 0.5847916710 0.4440869215 0.3354604904 + 366 0.7332642628 0.5495466815 0.4053148603 + 367 0.4055016857 0.6331523070 0.1043893772 + 368 0.6274048324 0.9140246909 0.1625818576 + 369 0.0000000000 0.2618609330 0.2526941628 + 370 0.5978677424 0.1453629298 0.8619161247 + 371 0.7626800273 0.3320336612 0.7180383769 + 372 0.5937503536 0.3589457801 0.4128058158 + 373 0.6124345428 0.7783001227 0.1728157206 + 374 0.5989165635 0.6469302810 0.2089989888 + 375 0.7432260441 1.0000000000 0.2537838470 + 376 0.6845086822 0.2044666743 0.8961963550 + 377 0.7855105566 0.8163448941 0.3173878686 + 378 0.7776937327 0.6713922074 0.3614041997 + 379 0.0866025404 0.4285714286 0.1118033989 + 380 0.7033498019 0.7209439446 0.2576372019 + 381 0.2181731911 0.0730605477 0.5311011969 + 382 0.2487998785 0.7382420757 0.0000000000 + 383 1.0000000000 0.7431520015 0.7455173007 + 384 0.1648158382 0.1805999720 0.3424547234 + 385 0.5861923233 0.2541489328 0.5185541941 + 386 0.8389177377 0.6104076051 0.4676230200 + 387 0.1423525250 0.0000000000 0.6508229884 + 388 0.3571428571 0.0000000000 0.8700961894 + 389 1.0000000000 0.8700961894 0.6428571429 + 390 0.1299038106 0.6428571429 0.0000000000 + 391 1.0000000000 0.6428571429 0.8700961894 + 392 0.3571428571 0.8700961894 0.0000000000 + 393 0.3552772555 0.2901669398 0.2813000101 + 394 0.2857142857 0.0000000000 0.7401923789 + 395 0.8863619126 0.4186821327 0.8385207364 + 396 0.5020866704 0.2572469887 0.4105419673 + 397 0.4128222942 0.1169969405 0.5499121223 + 398 0.8723687080 0.8289469964 0.3979679815 + 399 0.5159073379 0.0942850657 0.7408303988 + 400 0.7067139547 0.4180159613 0.4321050682 + 401 0.8163583072 0.3976037392 0.6351276134 + 402 0.5463563693 0.1553633041 0.6046035772 + 403 0.0000000000 0.1299038106 0.3571428571 + 404 0.0000000000 0.3571428571 0.1299038106 + 405 0.6428571429 1.0000000000 0.1299038106 + 406 0.8700961894 1.0000000000 0.3571428571 + 407 0.6428571429 0.1299038106 1.0000000000 + 408 0.8700961894 0.3571428571 1.0000000000 + 409 0.5714285714 0.0866025404 0.8881966011 + 410 0.3959314882 0.1716909197 0.4232398516 + 411 0.4285714286 0.0000000000 1.0000000000 + 412 0.0000000000 0.0000000000 0.5714285714 + 413 0.4285714286 1.0000000000 0.0000000000 + 414 1.0000000000 1.0000000000 0.5714285714 + 415 0.0000000000 0.5714285714 0.0000000000 + 416 1.0000000000 0.5714285714 1.0000000000 + 417 0.9263878407 0.9049671110 0.4285714286 + 418 0.5047641834 0.5809661432 0.1247801815 + 419 0.1643255429 0.3174425177 0.1599887728 + 420 0.7624189129 0.2349400895 0.8140295238 + 421 0.4707987357 0.3934828841 0.2138829257 + 422 0.8823165614 0.5076188401 0.5595731619 + 423 0.3362954051 0.0925937057 0.4646512487 + 424 0.2197272608 0.4285714286 0.0776464423 + 425 0.6865978541 0.2059391318 0.6430842091 + 426 0.3646452810 0.4588228894 0.1028323339 + 427 0.6107458184 0.1064645092 0.7482703712 + 428 0.2142588570 0.2150117661 0.2408713813 + 429 0.6161510675 0.4928408186 0.2229047974 + 430 0.2574463350 0.5781163534 0.0000000000 + 431 1.0000000000 0.5781163534 0.7425536650 + 432 0.8486623384 0.3198713625 0.7515725523 + 433 0.7590379555 0.3295947106 0.5294508690 + 434 0.7376860679 0.5765061112 0.2711519964 + 435 0.4352592105 0.0000000000 0.7425536650 + 436 0.4093773485 0.7028994652 0.0000000000 + 437 1.0000000000 0.7029274666 0.5877670938 + 438 0.5317245845 0.6518843345 0.0753482600 + 439 0.3085932432 0.0000000000 0.5933169800 + 440 0.8643946392 0.2916323905 0.8846246654 + 441 0.8025974428 0.8900792666 0.2214302051 + 442 1.0000000000 0.8700961894 0.5000000000 + 443 0.1299038106 0.0000000000 0.5000000000 + 444 0.1299038106 0.5000000000 0.0000000000 + 445 1.0000000000 0.5000000000 0.8700961894 + 446 0.5000000000 0.8700961894 0.0000000000 + 447 0.5000000000 0.0000000000 0.8700961894 + 448 0.5629394113 0.5394954849 0.1408910361 + 449 0.5461252983 0.3123504018 0.2931783742 + 450 0.2936118042 0.1396483763 0.3271459266 + 451 0.1118033989 0.2007091365 0.2058943723 + 452 0.2215550991 0.0672930010 0.3943340739 + 453 0.7073525712 0.9147051424 0.1118033989 + 454 0.0848490054 0.1118033989 0.2924900097 + 455 0.8352882579 0.4643273308 0.4381505397 + 456 0.0866025404 0.2857142857 0.1118033989 + 457 0.4737142310 0.5591484059 0.0575041756 + 458 0.6898194484 0.1254330646 0.7405604935 + 459 0.5335285841 0.1376889880 0.4694256705 + 460 0.5068368426 0.4787743480 0.1149793985 + 461 0.6986501423 0.2815194385 0.4423245248 + 462 0.9096156500 0.9049671110 0.3034108131 + 463 0.5714285714 0.0000000000 1.0000000000 + 464 1.0000000000 1.0000000000 0.4285714286 + 465 1.0000000000 0.4285714286 1.0000000000 + 466 0.0000000000 0.0000000000 0.4285714286 + 467 0.5714285714 1.0000000000 0.0000000000 + 468 0.0000000000 0.4285714286 0.0000000000 + 469 0.2975237889 0.2985242184 0.1350543951 + 470 0.9137918863 0.6779451662 0.3749816129 + 471 0.0000000000 0.1259807621 0.2350851435 + 472 0.7060713124 0.0834103275 0.8881966011 + 473 0.8796728280 1.0000000000 0.2389289200 + 474 0.7610710800 0.1203271720 1.0000000000 + 475 0.8539609310 0.5594366787 0.3414282554 + 476 0.7722276377 0.4522984169 0.3172424606 + 477 0.6909209670 0.6826871555 0.1140956926 + 478 0.4679285218 0.0000000000 0.6140426985 + 479 0.6067736003 0.2390689477 0.3506860715 + 480 0.6899621484 0.3432824284 0.3202098307 + 481 0.7857142857 1.0000000000 0.1299038106 + 482 0.0000000000 0.2142857143 0.1299038106 + 483 0.8700961894 0.2142857143 1.0000000000 + 484 1.0000000000 0.7425536650 0.4352592105 + 485 0.6355287616 0.0793068216 0.6213893816 + 486 0.3885145980 0.5053947920 0.0000000000 + 487 0.9126226845 0.3275104492 0.6646444956 + 488 0.7531075685 0.1975019910 0.5669170830 + 489 0.8293682459 0.1613970716 0.9079098599 + 490 0.6577745322 0.1377232982 0.5269838428 + 491 0.5781163534 0.7425536650 0.0000000000 + 492 1.0000000000 0.5298954759 0.5710179169 + 493 0.8580470752 0.6621070150 0.2509184965 + 494 0.5044974959 0.1857589299 0.2944278806 + 495 0.2801902718 0.0000000000 0.4151972535 + 496 0.7277281278 0.5504419719 0.1646977452 + 497 1.0000000000 0.3571428571 0.8700961894 + 498 0.1299038106 0.3571428571 0.0000000000 + 499 1.0000000000 0.8700961894 0.3571428571 + 500 0.6428571429 0.8700961894 0.0000000000 + 501 0.1299038106 0.0000000000 0.3571428571 + 502 0.6428571429 0.0000000000 0.8700961894 + 503 0.2968829583 0.4141502988 0.0000000000 + 504 1.0000000000 0.6140426985 0.4679285218 + 505 0.8436883566 0.2623643961 0.5789982525 + 506 0.5877670938 0.0000000000 0.7029274666 + 507 0.1926225362 0.1167497299 0.2144466855 + 508 1.0000000000 0.4093773485 0.7028994652 + 509 0.9166783358 0.3754802490 0.5434377472 + 510 0.4195639639 0.0000000000 0.4863943903 + 511 0.2090512855 0.2070675614 0.1194348452 + 512 0.4886627049 0.2618067491 0.1819717756 + 513 0.7910596930 0.8034115976 0.1118033989 + 514 0.4025467239 0.0679743059 0.3497566185 + 515 0.5933042105 0.3494889839 0.1717616720 + 516 0.5298954759 0.5710179169 0.0000000000 + 517 0.8093886077 0.3401793439 0.3865635056 + 518 0.8128372784 0.1603813244 0.6800094812 + 519 0.7032551756 0.4156573491 0.2048486710 + 520 0.8881966011 0.7941056277 0.2007091365 + 521 0.8034115976 0.1118033989 0.7910596930 + 522 0.8881966011 0.1959095995 0.7912417929 + 523 0.3203812693 0.1584712994 0.1820334376 + 524 0.0824110185 0.1124878906 0.1669249207 + 525 0.4890081970 0.3567063477 0.0833338902 + 526 0.7142857143 0.0000000000 1.0000000000 + 527 1.0000000000 1.0000000000 0.2857142857 + 528 1.0000000000 0.2857142857 1.0000000000 + 529 0.0000000000 0.0000000000 0.2857142857 + 530 0.7142857143 1.0000000000 0.0000000000 + 531 0.0000000000 0.2857142857 0.0000000000 + 532 0.4092623695 0.1462540614 0.2092047263 + 533 0.6860721974 0.1508013948 0.4165753259 + 534 0.5710179169 0.0000000000 0.5298954759 + 535 0.6684200288 0.4423296829 0.1075659661 + 536 0.7739746194 0.6418033684 0.0851291945 + 537 0.7556714954 0.0674329032 0.6441247927 + 538 0.4863943903 0.4195639639 0.0000000000 + 539 0.3331984407 0.0659522273 0.2266505226 + 540 0.9302773492 0.3618011874 0.4436554082 + 541 1.0000000000 0.4863943903 0.4195639639 + 542 0.7649148565 0.8740192379 0.0000000000 + 543 0.1246432057 0.0000000000 0.2346128863 + 544 0.7381680330 0.7505012691 0.0000000000 + 545 1.0000000000 0.7473058372 0.2618609330 + 546 0.7195488763 0.2242700064 0.2999001763 + 547 0.2533860264 0.0000000000 0.2606072627 + 548 0.8287404904 0.2408816236 0.4062296914 + 549 1.0000000000 0.3885145980 0.5053947920 + 550 0.9357203312 0.2058388124 0.6629715181 + 551 0.2606072627 0.2533860264 0.0000000000 + 552 0.5053947920 0.0000000000 0.3885145980 + 553 0.9027395461 0.4108993965 0.3156002036 + 554 0.7505012691 0.0000000000 0.7381680330 + 555 1.0000000000 0.2487998785 0.7382420757 + 556 0.1299038106 0.2142857143 0.0000000000 + 557 1.0000000000 0.2142857143 0.8700961894 + 558 0.7857142857 0.0000000000 0.8700961894 + 559 1.0000000000 0.8700961894 0.2142857143 + 560 0.6233136772 0.2131799834 0.2076398895 + 561 0.8768899949 0.9022821017 0.0726213811 + 562 0.8453220784 0.4608810330 0.2017791220 + 563 1.0000000000 0.5933169800 0.3085932432 + 564 0.9340782375 0.5729295009 0.2276749749 + 565 0.6202521884 0.1152160379 0.3025265270 + 566 0.6140426985 0.4679285218 0.0000000000 + 567 0.7029274666 0.5877670938 0.0000000000 + 568 0.4141502988 0.0000000000 0.2968829583 + 569 0.8610749644 0.1265441373 0.5799225560 + 570 0.8169312078 0.3185976075 0.2560693152 + 571 0.2733196479 0.1064669247 0.0980360066 + 572 0.4151972535 0.2801902718 0.0000000000 + 573 0.1235352417 0.0995451620 0.0662844770 + 574 0.8737480045 0.1998281870 0.4557545900 + 575 0.9036347417 0.0691230399 0.8422688190 + 576 0.8881966011 0.7073525712 0.0852948576 + 577 0.8881966011 0.0848490054 0.7075099903 + 578 0.7425536650 0.0000000000 0.5781163534 + 579 1.0000000000 0.2574463350 0.5781163534 + 580 0.8571428571 0.0000000000 1.0000000000 + 581 1.0000000000 1.0000000000 0.1428571429 + 582 1.0000000000 0.1428571429 1.0000000000 + 583 0.0000000000 0.0000000000 0.1428571429 + 584 0.8571428571 1.0000000000 0.0000000000 + 585 0.0000000000 0.1428571429 0.0000000000 + 586 0.7945863909 0.4876388217 0.0774418200 + 587 0.5866593537 0.2410457687 0.0886884953 + 588 0.8925621662 0.2839718675 0.3276610655 + 589 0.6901663350 0.2852715344 0.1186914084 + 590 0.8916214175 0.5759313597 0.0999372130 + 591 0.8700961894 0.7857142857 0.0000000000 + 592 0.2142857143 0.0000000000 0.1299038106 + 593 0.5604683023 0.1134109320 0.1598502358 + 594 0.4285714286 0.1118033989 0.0866025404 + 595 0.8080257238 0.0819525889 0.4405949847 + 596 1.0000000000 0.7649148565 0.1259807621 + 597 0.8740192379 0.0000000000 0.7649148565 + 598 1.0000000000 0.1246432057 0.7653871137 + 599 0.2346128863 0.1246432057 0.0000000000 + 600 0.5933169800 0.3085932432 0.0000000000 + 601 1.0000000000 0.2968829583 0.4141502988 + 602 0.7028994652 0.0000000000 0.4093773485 + 603 1.0000000000 0.4151972535 0.2801902718 + 604 0.8651164213 0.2249503531 0.2815158422 + 605 0.8196398569 0.3583036636 0.1147862940 + 606 0.7425536650 0.4352592105 0.0000000000 + 607 0.3571428571 0.1299038106 0.0000000000 + 608 0.3571428571 0.0000000000 0.1299038106 + 609 1.0000000000 0.6428571429 0.1299038106 + 610 1.0000000000 0.1299038106 0.6428571429 + 611 0.8700961894 0.6428571429 0.0000000000 + 612 0.8700961894 0.0000000000 0.6428571429 + 613 0.5781163534 0.0000000000 0.2574463350 + 614 0.7661463877 0.0810222879 0.3257376068 + 615 0.7052499282 0.1143362578 0.2099741560 + 616 0.6646381774 0.1617522176 0.1228599815 + 617 0.9311848082 0.3544918128 0.1941155706 + 618 0.9568906009 0.1955350755 0.3913367986 + 619 0.8691472708 0.1366130489 0.3348942898 + 620 0.8785773717 0.2625015694 0.1804773350 + 621 0.9236946706 0.4440107826 0.0907702424 + 622 0.0000000000 0.0000000000 0.0000000000 + 623 1.0000000000 0.0000000000 1.0000000000 + 624 1.0000000000 1.0000000000 0.0000000000 + 625 0.5000000000 0.1299038106 0.0000000000 + 626 1.0000000000 0.1299038106 0.5000000000 + 627 1.0000000000 0.5000000000 0.1299038106 + 628 0.5000000000 0.0000000000 0.1299038106 + 629 0.8700961894 0.0000000000 0.5000000000 + 630 0.8700961894 0.5000000000 0.0000000000 + 631 0.1428571429 0.0000000000 0.0000000000 + 632 1.0000000000 0.0000000000 0.8571428571 + 633 1.0000000000 0.8571428571 0.0000000000 + 634 0.9430500179 0.0832301418 0.4372418225 + 635 1.0000000000 0.2574463350 0.2790265038 + 636 0.2857142857 0.0000000000 0.0000000000 + 637 1.0000000000 0.0000000000 0.7142857143 + 638 1.0000000000 0.7142857143 0.0000000000 + 639 0.8027737366 0.1977844742 0.1039073982 + 640 0.8324403947 0.1130819648 0.2122473683 + 641 0.7473058372 0.2618609330 0.0000000000 + 642 0.7432260441 0.0000000000 0.2537838470 + 643 0.7121236295 0.0909193384 0.1114085988 + 644 0.6428571429 0.1299038106 0.0000000000 + 645 0.8700961894 0.3571428571 0.0000000000 + 646 0.8700961894 0.0000000000 0.3571428571 + 647 0.6428571429 0.0000000000 0.1299038106 + 648 1.0000000000 0.1299038106 0.3571428571 + 649 1.0000000000 0.3571428571 0.1299038106 + 650 0.9187747007 0.1754071846 0.1898600241 + 651 0.4285714286 0.0000000000 0.0000000000 + 652 1.0000000000 0.0000000000 0.5714285714 + 653 1.0000000000 0.5714285714 0.0000000000 + 654 0.9293994114 0.2744055413 0.0576340671 + 655 1.0000000000 0.0000000000 0.4285714286 + 656 0.5714285714 0.0000000000 0.0000000000 + 657 1.0000000000 0.4285714286 0.0000000000 + 658 0.7649148565 0.1259807621 0.0000000000 + 659 0.8796728280 0.0000000000 0.2389289200 + 660 1.0000000000 0.1203271720 0.2389289200 + 661 0.8700961894 0.2142857143 0.0000000000 + 662 0.7857142857 0.0000000000 0.1299038106 + 663 1.0000000000 0.2142857143 0.1299038106 + 664 0.8664618417 0.1012225834 0.0937238553 + 665 1.0000000000 0.0000000000 0.2857142857 + 666 0.7142857143 0.0000000000 0.0000000000 + 667 1.0000000000 0.2857142857 0.0000000000 + 668 0.8571428571 0.0000000000 0.0000000000 + 669 1.0000000000 0.0000000000 0.1428571429 + 670 1.0000000000 0.1428571429 0.0000000000 + 671 1.0000000000 0.0000000000 0.0000000000 +End Nodes + + +Begin Elements Element3D4N// GUI group identifier: Parts Auto1 + 1 1 10 22 12 11 + 2 1 277 362 248 300 + 3 1 248 277 300 162 + 4 1 389 354 358 274 + 5 1 389 354 274 383 + 6 1 355 357 388 273 + 7 1 388 355 273 394 + 8 1 26 11 12 22 + 9 1 407 474 526 472 + 10 1 407 474 472 352 + 11 1 648 660 665 659 + 12 1 99 129 154 155 + 13 1 646 665 659 648 + 14 1 23 13 9 16 + 15 1 9 23 16 18 + 16 1 100 155 129 99 + 17 1 406 473 527 462 + 18 1 406 473 462 375 + 19 1 355 357 273 234 + 20 1 362 248 300 351 + 21 1 300 362 351 390 + 22 1 351 300 390 382 + 23 1 300 362 390 277 + 24 1 351 300 382 281 + 25 1 351 300 281 248 + 26 1 382 351 281 347 + 27 1 351 281 347 332 + 28 1 281 382 347 392 + 29 1 13 9 16 7 + 30 1 354 358 274 240 + 31 1 358 274 240 280 + 32 1 274 240 280 171 + 33 1 274 240 171 200 + 34 1 274 240 200 354 + 35 1 358 274 280 389 + 36 1 240 171 200 174 + 37 1 200 240 174 331 + 38 1 171 200 174 103 + 39 1 474 526 472 558 + 40 1 473 527 462 559 + 41 1 544 591 542 513 + 42 1 542 544 513 500 + 43 1 554 558 597 521 + 44 1 597 554 521 612 + 45 1 555 598 557 522 + 46 1 555 598 522 610 + 47 1 526 472 558 502 + 48 1 472 558 502 554 + 49 1 526 472 502 407 + 50 1 527 462 559 499 + 51 1 462 559 499 545 + 52 1 527 462 499 406 + 53 1 16 13 7 21 + 54 1 7 16 21 27 + 55 1 16 13 21 23 + 56 1 357 273 234 279 + 57 1 273 234 279 164 + 58 1 357 273 279 388 + 59 1 543 529 501 454 + 60 1 501 543 454 547 + 61 1 599 636 607 571 + 62 1 607 599 571 551 + 63 1 551 556 599 511 + 64 1 599 551 511 571 + 65 1 160 157 235 190 + 66 1 160 157 190 102 + 67 1 157 102 128 131 + 68 1 157 102 131 190 + 69 1 598 610 637 577 + 70 1 598 610 577 522 + 71 1 547 592 543 507 + 72 1 543 547 507 454 + 73 1 658 661 641 639 + 74 1 661 641 639 645 + 75 1 471 482 369 451 + 76 1 482 369 451 404 + 77 1 596 545 559 520 + 78 1 545 559 520 462 + 79 1 559 520 462 473 + 80 1 241 159 173 196 + 81 1 159 173 196 101 + 82 1 403 529 471 454 + 83 1 471 403 454 369 + 84 1 529 471 454 543 + 85 1 403 529 454 501 + 86 1 542 530 500 453 + 87 1 500 542 453 513 + 88 1 609 596 638 576 + 89 1 609 596 576 520 + 90 1 577 598 522 575 + 91 1 577 598 575 637 + 92 1 542 453 513 481 + 93 1 278 241 359 291 + 94 1 278 241 291 196 + 95 1 597 637 612 577 + 96 1 612 597 577 521 + 97 1 597 577 521 575 + 98 1 597 577 575 637 + 99 1 521 597 575 558 + 100 1 577 521 575 522 + 101 1 521 575 522 489 + 102 1 577 521 522 518 + 103 1 522 521 489 420 + 104 1 521 522 518 420 + 105 1 597 575 558 632 + 106 1 597 575 632 637 + 107 1 521 575 489 558 + 108 1 577 521 518 612 + 109 1 637 612 577 610 + 110 1 521 489 420 472 + 111 1 518 521 420 458 + 112 1 518 521 458 554 + 113 1 521 420 458 472 + 114 1 489 522 420 440 + 115 1 522 420 440 432 + 116 1 522 420 432 518 + 117 1 644 666 658 643 + 118 1 658 644 643 639 + 119 1 128 157 131 175 + 120 1 131 128 175 98 + 121 1 175 131 98 162 + 122 1 131 128 98 102 + 123 1 599 636 571 592 + 124 1 636 571 592 608 + 125 1 571 592 608 547 + 126 1 636 571 608 607 + 127 1 598 522 575 557 + 128 1 489 522 440 557 + 129 1 575 522 489 557 + 130 1 131 157 190 175 + 131 1 507 543 454 524 + 132 1 543 454 524 471 + 133 1 454 524 471 451 + 134 1 471 454 451 369 + 135 1 524 471 451 482 + 136 1 524 471 482 583 + 137 1 524 471 583 543 + 138 1 454 524 451 507 + 139 1 524 451 507 511 + 140 1 451 507 511 428 + 141 1 451 507 428 454 + 142 1 451 524 482 556 + 143 1 507 511 428 571 + 144 1 511 451 428 419 + 145 1 451 428 419 317 + 146 1 451 428 317 454 + 147 1 511 451 419 556 + 148 1 507 511 571 592 + 149 1 571 507 592 547 + 150 1 511 599 571 592 + 151 1 596 638 576 591 + 152 1 638 576 591 611 + 153 1 576 591 611 544 + 154 1 638 576 611 609 + 155 1 440 522 432 555 + 156 1 557 555 522 440 + 157 1 241 359 291 346 + 158 1 359 291 346 391 + 159 1 291 346 391 383 + 160 1 359 291 391 278 + 161 1 666 658 643 662 + 162 1 643 666 662 647 + 163 1 662 643 647 642 + 164 1 643 666 647 644 + 165 1 542 530 453 481 + 166 1 530 453 481 405 + 167 1 453 481 405 375 + 168 1 530 453 405 500 + 169 1 419 451 317 369 + 170 1 544 591 513 576 + 171 1 591 513 576 520 + 172 1 507 543 524 592 + 173 1 554 558 521 472 + 174 1 558 521 472 489 + 175 1 428 511 419 469 + 176 1 551 556 511 419 + 177 1 428 419 317 325 + 178 1 420 440 432 313 + 179 1 432 420 313 371 + 180 1 432 420 371 518 + 181 1 235 160 190 276 + 182 1 317 428 325 307 + 183 1 317 428 307 384 + 184 1 317 428 384 454 + 185 1 420 489 440 352 + 186 1 419 428 469 325 + 187 1 428 511 469 523 + 188 1 428 511 523 571 + 189 1 511 523 571 551 + 190 1 420 440 313 352 + 191 1 591 542 513 561 + 192 1 542 513 561 481 + 193 1 596 545 520 609 + 194 1 428 325 307 393 + 195 1 428 325 393 469 + 196 1 511 419 469 551 + 197 1 641 658 639 644 + 198 1 511 469 523 551 + 199 1 583 524 543 592 + 200 1 241 159 196 278 + 201 1 428 307 384 450 + 202 1 420 313 371 290 + 203 1 420 313 290 352 + 204 1 371 420 290 458 + 205 1 469 428 523 393 + 206 1 522 577 518 550 + 207 1 518 522 550 432 + 208 1 577 518 550 569 + 209 1 577 518 569 612 + 210 1 569 577 612 610 + 211 1 518 550 569 505 + 212 1 518 550 505 432 + 213 1 569 518 505 488 + 214 1 569 518 488 537 + 215 1 569 518 537 612 + 216 1 518 505 488 371 + 217 1 518 488 537 458 + 218 1 488 569 537 578 + 219 1 569 537 578 612 + 220 1 537 578 612 554 + 221 1 537 578 554 506 + 222 1 612 537 554 518 + 223 1 325 307 393 270 + 224 1 325 307 270 223 + 225 1 325 307 223 317 + 226 1 658 661 639 664 + 227 1 661 639 664 663 + 228 1 384 428 450 547 + 229 1 440 432 313 395 + 230 1 432 313 395 326 + 231 1 313 440 395 408 + 232 1 440 432 395 497 + 233 1 432 313 326 371 + 234 1 395 432 326 508 + 235 1 270 325 223 230 + 236 1 270 325 230 339 + 237 1 325 223 230 264 + 238 1 325 223 264 317 + 239 1 325 230 339 343 + 240 1 325 230 343 264 + 241 1 230 339 343 298 + 242 1 343 230 298 254 + 243 1 343 230 254 264 + 244 1 298 343 254 356 + 245 1 298 343 356 426 + 246 1 298 343 426 339 + 247 1 343 254 356 344 + 248 1 343 254 344 264 + 249 1 230 339 298 245 + 250 1 339 298 245 349 + 251 1 339 298 349 426 + 252 1 254 356 344 300 + 253 1 230 339 245 270 + 254 1 270 325 339 393 + 255 1 223 270 230 180 + 256 1 270 230 180 245 + 257 1 223 270 180 206 + 258 1 223 270 206 307 + 259 1 230 223 180 166 + 260 1 180 223 206 147 + 261 1 223 180 166 147 + 262 1 230 223 166 264 + 263 1 270 180 206 215 + 264 1 270 180 215 245 + 265 1 206 270 215 296 + 266 1 206 270 296 307 + 267 1 180 206 215 142 + 268 1 215 206 296 210 + 269 1 180 206 142 147 + 270 1 206 215 142 210 + 271 1 270 215 296 309 + 272 1 270 215 309 245 + 273 1 296 270 309 393 + 274 1 215 296 309 288 + 275 1 309 215 288 250 + 276 1 309 215 250 245 + 277 1 215 296 288 210 + 278 1 296 309 288 396 + 279 1 309 288 396 372 + 280 1 296 309 396 393 + 281 1 396 309 372 449 + 282 1 309 372 449 365 + 283 1 309 372 365 250 + 284 1 288 296 396 311 + 285 1 296 396 311 410 + 286 1 296 396 410 393 + 287 1 288 296 311 210 + 288 1 309 288 372 250 + 289 1 396 309 449 393 + 290 1 215 180 142 165 + 291 1 215 180 165 245 + 292 1 180 142 165 112 + 293 1 180 142 112 147 + 294 1 165 180 112 168 + 295 1 165 180 168 245 + 296 1 180 112 168 166 + 297 1 142 215 165 158 + 298 1 215 165 158 250 + 299 1 142 215 158 210 + 300 1 165 142 158 94 + 301 1 158 165 94 135 + 302 1 158 165 135 250 + 303 1 165 142 94 112 + 304 1 142 158 94 121 + 305 1 142 158 121 210 + 306 1 158 94 121 119 + 307 1 158 94 119 135 + 308 1 121 158 119 176 + 309 1 121 158 176 210 + 310 1 158 119 176 192 + 311 1 158 119 192 135 + 312 1 119 176 192 153 + 313 1 119 176 153 120 + 314 1 176 192 153 236 + 315 1 119 176 120 121 + 316 1 176 192 236 244 + 317 1 176 192 244 158 + 318 1 192 236 244 289 + 319 1 192 236 289 224 + 320 1 192 236 224 153 + 321 1 236 244 289 334 + 322 1 244 289 334 345 + 323 1 244 289 345 250 + 324 1 236 244 334 268 + 325 1 289 334 345 433 + 326 1 289 334 433 371 + 327 1 236 244 268 176 + 328 1 244 334 268 311 + 329 1 94 142 121 82 + 330 1 142 121 82 133 + 331 1 94 142 82 112 + 332 1 82 142 133 147 + 333 1 121 94 82 67 + 334 1 82 121 67 85 + 335 1 82 121 85 133 + 336 1 121 94 67 119 + 337 1 94 82 67 62 + 338 1 82 67 62 43 + 339 1 82 67 43 85 + 340 1 94 82 62 112 + 341 1 62 82 43 63 + 342 1 62 82 63 112 + 343 1 82 43 63 73 + 344 1 82 43 73 85 + 345 1 43 62 63 28 + 346 1 43 63 73 44 + 347 1 62 63 28 46 + 348 1 62 63 46 112 + 349 1 63 28 46 50 + 350 1 43 62 28 30 + 351 1 62 28 30 31 + 352 1 62 28 31 46 + 353 1 43 62 30 67 + 354 1 28 43 30 17 + 355 1 30 28 17 15 + 356 1 30 28 15 31 + 357 1 28 43 17 44 + 358 1 43 30 17 38 + 359 1 43 30 38 67 + 360 1 30 17 38 19 + 361 1 142 121 133 210 + 362 1 244 192 289 250 + 363 1 67 94 62 65 + 364 1 62 67 65 30 + 365 1 94 62 65 78 + 366 1 67 94 65 119 + 367 1 62 65 78 31 + 368 1 94 62 78 112 + 369 1 65 94 78 135 + 370 1 17 30 15 19 + 371 1 298 230 245 168 + 372 1 396 288 311 385 + 373 1 396 288 385 372 + 374 1 311 396 385 459 + 375 1 311 396 459 410 + 376 1 288 311 385 244 + 377 1 385 288 244 345 + 378 1 288 244 345 250 + 379 1 385 288 345 372 + 380 1 345 385 372 461 + 381 1 372 345 461 400 + 382 1 372 345 400 250 + 383 1 288 345 372 250 + 384 1 345 385 461 334 + 385 1 345 385 334 244 + 386 1 345 461 400 433 + 387 1 345 461 433 334 + 388 1 461 372 400 480 + 389 1 372 400 480 365 + 390 1 461 372 480 479 + 391 1 461 372 479 385 + 392 1 400 345 433 289 + 393 1 372 480 479 449 + 394 1 479 372 449 396 + 395 1 449 479 396 494 + 396 1 449 479 494 560 + 397 1 449 479 560 480 + 398 1 479 396 494 459 + 399 1 479 372 396 385 + 400 1 479 494 560 565 + 401 1 479 494 565 459 + 402 1 560 479 565 546 + 403 1 560 479 546 480 + 404 1 494 449 560 512 + 405 1 449 560 512 515 + 406 1 449 560 515 480 + 407 1 494 449 512 393 + 408 1 479 565 546 533 + 409 1 479 565 533 459 + 410 1 396 449 494 393 + 411 1 546 479 533 461 + 412 1 479 533 461 385 + 413 1 512 449 515 421 + 414 1 288 244 250 158 + 415 1 512 449 421 393 + 416 1 449 515 421 365 + 417 1 565 560 546 615 + 418 1 560 546 615 639 + 419 1 560 512 515 587 + 420 1 494 560 565 593 + 421 1 565 494 593 613 + 422 1 593 565 613 615 + 423 1 515 560 587 589 + 424 1 515 560 589 480 + 425 1 560 512 587 593 + 426 1 560 494 512 593 + 427 1 565 560 615 593 + 428 1 400 461 480 517 + 429 1 480 400 517 476 + 430 1 480 400 476 365 + 431 1 560 587 589 616 + 432 1 565 546 533 614 + 433 1 533 565 614 602 + 434 1 614 533 602 595 + 435 1 602 614 595 646 + 436 1 614 595 646 619 + 437 1 614 595 619 533 + 438 1 595 646 619 634 + 439 1 595 646 634 629 + 440 1 634 595 629 569 + 441 1 595 646 629 602 + 442 1 619 595 634 574 + 443 1 619 595 574 533 + 444 1 646 634 629 655 + 445 1 634 629 655 652 + 446 1 646 634 655 648 + 447 1 634 655 648 626 + 448 1 634 655 626 652 + 449 1 648 634 626 574 + 450 1 634 626 574 569 + 451 1 595 634 574 569 + 452 1 587 515 589 600 + 453 1 480 461 479 546 + 454 1 546 533 614 619 + 455 1 560 587 616 593 + 456 1 546 565 615 614 + 457 1 517 480 476 570 + 458 1 480 476 570 519 + 459 1 480 476 519 365 + 460 1 517 480 570 546 + 461 1 515 512 421 525 + 462 1 512 421 525 469 + 463 1 634 619 574 648 + 464 1 634 619 648 646 + 465 1 400 517 476 455 + 466 1 476 400 455 366 + 467 1 400 517 455 433 + 468 1 476 400 366 365 + 469 1 589 560 616 639 + 470 1 616 589 639 644 + 471 1 512 515 587 525 + 472 1 455 476 366 475 + 473 1 476 366 475 434 + 474 1 476 366 434 365 + 475 1 476 517 570 553 + 476 1 517 570 553 588 + 477 1 517 570 588 546 + 478 1 385 311 459 402 + 479 1 311 459 402 397 + 480 1 311 459 397 410 + 481 1 385 311 402 334 + 482 1 476 517 553 455 + 483 1 587 589 616 644 + 484 1 455 476 475 553 + 485 1 570 476 553 562 + 486 1 570 476 562 519 + 487 1 553 570 562 617 + 488 1 570 562 617 605 + 489 1 570 562 605 519 + 490 1 476 553 562 475 + 491 1 562 617 605 621 + 492 1 605 562 621 586 + 493 1 605 562 586 519 + 494 1 562 617 621 627 + 495 1 617 605 621 649 + 496 1 621 617 649 627 + 497 1 649 621 627 657 + 498 1 621 627 657 653 + 499 1 649 621 657 645 + 500 1 621 657 645 630 + 501 1 621 657 630 653 + 502 1 645 621 630 586 + 503 1 621 630 586 590 + 504 1 630 586 590 611 + 505 1 621 630 590 653 + 506 1 590 630 611 653 + 507 1 586 621 590 562 + 508 1 617 649 627 603 + 509 1 617 649 603 635 + 510 1 553 570 617 588 + 511 1 562 553 617 603 + 512 1 553 617 603 588 + 513 1 396 385 459 479 + 514 1 366 475 434 378 + 515 1 434 366 378 305 + 516 1 366 475 378 386 + 517 1 366 475 386 455 + 518 1 366 378 305 271 + 519 1 366 378 271 386 + 520 1 475 378 386 470 + 521 1 475 378 470 493 + 522 1 475 378 493 434 + 523 1 378 305 271 285 + 524 1 378 386 470 342 + 525 1 386 470 342 504 + 526 1 305 271 285 205 + 527 1 305 271 205 246 + 528 1 305 271 246 366 + 529 1 271 285 205 201 + 530 1 271 285 201 342 + 531 1 205 271 201 183 + 532 1 205 271 183 246 + 533 1 271 201 183 229 + 534 1 271 201 229 342 + 535 1 201 183 229 149 + 536 1 201 183 149 130 + 537 1 201 183 130 205 + 538 1 183 229 149 179 + 539 1 183 229 179 253 + 540 1 183 229 253 271 + 541 1 149 183 179 118 + 542 1 179 149 118 122 + 543 1 179 149 122 198 + 544 1 179 149 198 229 + 545 1 149 183 118 130 + 546 1 378 386 342 271 + 547 1 378 305 285 380 + 548 1 378 305 380 434 + 549 1 305 285 380 282 + 550 1 285 380 282 308 + 551 1 285 380 308 377 + 552 1 285 380 377 378 + 553 1 380 282 308 373 + 554 1 380 282 373 374 + 555 1 380 282 374 305 + 556 1 282 308 373 251 + 557 1 308 373 251 368 + 558 1 308 373 368 453 + 559 1 373 368 453 500 + 560 1 368 453 500 405 + 561 1 368 453 405 375 + 562 1 282 308 251 209 + 563 1 308 251 209 283 + 564 1 282 308 209 285 + 565 1 305 285 282 205 + 566 1 282 373 374 302 + 567 1 374 282 302 261 + 568 1 282 373 302 251 + 569 1 373 374 302 438 + 570 1 373 374 438 477 + 571 1 373 374 477 380 + 572 1 302 373 438 363 + 573 1 302 373 363 251 + 574 1 373 438 363 491 + 575 1 438 363 491 436 + 576 1 374 282 261 305 + 577 1 374 302 438 418 + 578 1 374 302 418 261 + 579 1 438 374 418 448 + 580 1 302 438 418 436 + 581 1 374 418 448 349 + 582 1 374 438 477 448 + 583 1 418 438 448 516 + 584 1 434 366 305 365 + 585 1 386 475 470 504 + 586 1 149 201 130 145 + 587 1 149 201 145 204 + 588 1 201 130 145 209 + 589 1 201 145 204 220 + 590 1 201 145 220 209 + 591 1 204 201 220 342 + 592 1 130 149 145 87 + 593 1 130 149 87 118 + 594 1 145 130 87 95 + 595 1 145 130 95 209 + 596 1 130 87 95 76 + 597 1 87 95 76 47 + 598 1 87 95 47 81 + 599 1 95 47 81 53 + 600 1 87 95 81 145 + 601 1 130 87 76 118 + 602 1 149 145 87 137 + 603 1 149 145 137 204 + 604 1 145 87 137 107 + 605 1 145 204 220 207 + 606 1 95 130 76 116 + 607 1 95 130 116 209 + 608 1 130 76 116 135 + 609 1 76 95 116 68 + 610 1 76 95 68 47 + 611 1 95 116 68 110 + 612 1 116 76 68 78 + 613 1 149 201 204 229 + 614 1 87 149 137 122 + 615 1 271 378 285 342 + 616 1 380 308 377 513 + 617 1 621 605 586 645 + 618 1 621 605 645 649 + 619 1 205 305 246 261 + 620 1 165 94 135 78 + 621 1 617 570 605 620 + 622 1 617 570 620 588 + 623 1 570 605 620 589 + 624 1 605 617 620 649 + 625 1 378 470 493 377 + 626 1 251 282 209 216 + 627 1 251 282 216 302 + 628 1 209 251 216 187 + 629 1 209 251 187 283 + 630 1 216 209 187 116 + 631 1 282 209 216 205 + 632 1 251 216 187 237 + 633 1 251 216 237 302 + 634 1 216 187 237 141 + 635 1 237 216 141 177 + 636 1 237 216 177 302 + 637 1 216 187 141 116 + 638 1 187 251 237 191 + 639 1 237 187 191 141 + 640 1 187 191 141 110 + 641 1 216 141 177 144 + 642 1 216 141 144 116 + 643 1 141 177 144 125 + 644 1 144 141 125 83 + 645 1 144 141 83 116 + 646 1 83 144 116 78 + 647 1 125 144 83 90 + 648 1 125 144 90 168 + 649 1 144 90 168 165 + 650 1 144 83 90 78 + 651 1 141 177 125 190 + 652 1 177 216 144 261 + 653 1 177 144 125 168 + 654 1 141 125 83 97 + 655 1 141 125 97 190 + 656 1 125 83 97 72 + 657 1 125 83 72 90 + 658 1 97 125 72 131 + 659 1 83 141 97 96 + 660 1 141 97 96 160 + 661 1 83 97 72 57 + 662 1 141 237 177 190 + 663 1 223 206 147 217 + 664 1 223 206 217 307 + 665 1 147 223 217 186 + 666 1 206 147 217 133 + 667 1 118 179 122 126 + 668 1 118 179 126 192 + 669 1 179 122 126 170 + 670 1 179 122 170 198 + 671 1 122 126 170 111 + 672 1 170 122 111 138 + 673 1 122 118 126 75 + 674 1 122 126 111 75 + 675 1 122 118 75 87 + 676 1 170 122 138 198 + 677 1 111 170 138 178 + 678 1 126 170 111 152 + 679 1 170 111 152 178 + 680 1 126 170 152 224 + 681 1 111 126 152 86 + 682 1 111 126 86 75 + 683 1 126 152 86 153 + 684 1 126 152 153 224 + 685 1 152 111 86 106 + 686 1 111 86 106 52 + 687 1 86 152 106 156 + 688 1 152 106 156 178 + 689 1 156 152 178 259 + 690 1 126 179 170 224 + 691 1 118 126 75 119 + 692 1 122 111 138 80 + 693 1 122 111 80 75 + 694 1 138 122 80 124 + 695 1 138 122 124 198 + 696 1 122 80 124 87 + 697 1 111 138 80 88 + 698 1 80 111 88 55 + 699 1 111 88 55 52 + 700 1 88 55 52 56 + 701 1 80 111 55 75 + 702 1 111 55 75 86 + 703 1 88 80 55 56 + 704 1 80 138 124 101 + 705 1 289 236 334 371 + 706 1 236 334 371 268 + 707 1 215 288 250 158 + 708 1 553 517 588 601 + 709 1 282 302 261 216 + 710 1 372 449 365 480 + 711 1 173 241 196 249 + 712 1 196 173 249 200 + 713 1 249 196 200 286 + 714 1 196 200 286 198 + 715 1 200 249 286 354 + 716 1 249 196 286 291 + 717 1 196 286 291 238 + 718 1 286 291 238 383 + 719 1 196 286 238 198 + 720 1 343 356 426 503 + 721 1 373 251 368 363 + 722 1 428 307 450 393 + 723 1 179 183 253 192 + 724 1 176 153 120 214 + 725 1 120 176 214 161 + 726 1 176 214 161 268 + 727 1 176 153 214 236 + 728 1 120 176 161 121 + 729 1 153 120 214 139 + 730 1 153 120 139 86 + 731 1 120 214 139 146 + 732 1 214 153 139 222 + 733 1 153 139 222 152 + 734 1 214 153 222 236 + 735 1 214 139 146 163 + 736 1 139 146 163 93 + 737 1 163 139 93 156 + 738 1 163 139 156 222 + 739 1 139 93 156 86 + 740 1 139 93 86 120 + 741 1 139 156 222 152 + 742 1 139 156 152 86 + 743 1 152 139 86 153 + 744 1 214 120 161 146 + 745 1 139 120 146 93 + 746 1 139 214 222 163 + 747 1 206 296 210 258 + 748 1 206 296 258 307 + 749 1 210 206 258 133 + 750 1 296 210 258 311 + 751 1 30 62 31 65 + 752 1 550 569 505 579 + 753 1 311 296 410 258 + 754 1 339 325 343 469 + 755 1 76 87 47 54 + 756 1 76 87 54 118 + 757 1 87 47 54 49 + 758 1 47 76 54 31 + 759 1 63 82 73 108 + 760 1 63 82 108 112 + 761 1 82 73 108 133 + 762 1 73 63 108 91 + 763 1 108 73 91 105 + 764 1 73 91 105 44 + 765 1 313 395 326 269 + 766 1 313 395 269 408 + 767 1 326 313 269 224 + 768 1 395 326 269 350 + 769 1 269 395 350 320 + 770 1 326 269 350 219 + 771 1 326 269 219 224 + 772 1 219 326 224 253 + 773 1 269 350 219 239 + 774 1 269 350 239 320 + 775 1 219 269 239 170 + 776 1 239 219 170 238 + 777 1 170 239 238 196 + 778 1 239 219 238 350 + 779 1 239 238 196 291 + 780 1 239 238 291 350 + 781 1 395 326 350 508 + 782 1 350 326 219 341 + 783 1 326 219 341 253 + 784 1 350 326 341 508 + 785 1 219 350 341 238 + 786 1 236 289 224 371 + 787 1 245 339 349 309 + 788 1 459 402 397 534 + 789 1 570 480 519 589 + 790 1 470 378 342 377 + 791 1 559 596 520 561 + 792 1 475 476 434 562 + 793 1 307 393 270 296 + 794 1 438 302 363 436 + 795 1 229 179 253 219 + 796 1 192 119 153 126 + 797 1 254 298 356 266 + 798 1 298 356 266 367 + 799 1 356 254 266 300 + 800 1 356 266 367 382 + 801 1 254 298 266 194 + 802 1 298 266 194 243 + 803 1 298 266 243 367 + 804 1 254 298 194 230 + 805 1 266 194 243 177 + 806 1 194 243 177 168 + 807 1 266 194 177 184 + 808 1 194 177 184 125 + 809 1 243 266 177 302 + 810 1 177 194 168 125 + 811 1 177 184 125 190 + 812 1 177 266 184 257 + 813 1 177 243 302 216 + 814 1 177 266 257 287 + 815 1 184 177 257 190 + 816 1 177 266 287 302 + 817 1 257 184 190 281 + 818 1 190 257 281 267 + 819 1 190 257 267 237 + 820 1 257 281 267 392 + 821 1 281 190 267 235 + 822 1 190 267 235 276 + 823 1 267 235 276 361 + 824 1 267 235 361 347 + 825 1 276 267 361 392 + 826 1 257 177 287 237 + 827 1 177 287 237 302 + 828 1 287 257 237 310 + 829 1 237 287 310 363 + 830 1 287 237 302 363 + 831 1 302 287 363 436 + 832 1 257 237 310 267 + 833 1 310 257 267 392 + 834 1 267 310 392 276 + 835 1 267 310 276 237 + 836 1 257 177 237 190 + 837 1 287 257 310 337 + 838 1 310 287 337 363 + 839 1 266 194 184 254 + 840 1 310 392 276 413 + 841 1 266 257 287 337 + 842 1 287 266 337 367 + 843 1 177 243 216 261 + 844 1 266 184 257 281 + 845 1 298 356 367 426 + 846 1 194 298 243 168 + 847 1 17 43 38 39 + 848 1 17 43 39 44 + 849 1 43 38 39 85 + 850 1 38 17 39 25 + 851 1 313 371 290 222 + 852 1 121 67 85 120 + 853 1 400 455 366 327 + 854 1 400 455 327 433 + 855 1 366 400 327 246 + 856 1 455 366 327 386 + 857 1 298 245 349 243 + 858 1 438 373 477 491 + 859 1 356 343 344 503 + 860 1 149 122 198 137 + 861 1 112 165 168 90 + 862 1 168 112 90 123 + 863 1 112 90 123 46 + 864 1 90 168 123 125 + 865 1 168 112 123 166 + 866 1 123 168 166 194 + 867 1 459 385 402 490 + 868 1 459 385 490 533 + 869 1 402 459 490 534 + 870 1 385 402 490 334 + 871 1 419 317 325 264 + 872 1 449 309 365 421 + 873 1 183 179 118 192 + 874 1 421 515 525 460 + 875 1 421 515 460 365 + 876 1 525 421 460 426 + 877 1 515 525 460 566 + 878 1 251 308 368 283 + 879 1 307 384 450 324 + 880 1 450 307 324 296 + 881 1 384 450 324 452 + 882 1 384 450 452 547 + 883 1 307 384 324 217 + 884 1 324 384 452 353 + 885 1 324 384 353 217 + 886 1 452 324 353 381 + 887 1 452 324 381 423 + 888 1 452 324 423 450 + 889 1 324 353 381 262 + 890 1 353 381 262 340 + 891 1 324 381 423 258 + 892 1 381 262 340 304 + 893 1 381 262 304 301 + 894 1 381 262 301 258 + 895 1 262 301 258 199 + 896 1 301 258 199 210 + 897 1 262 301 199 304 + 898 1 304 381 301 439 + 899 1 262 340 304 275 + 900 1 353 381 340 443 + 901 1 381 340 443 387 + 902 1 340 443 387 412 + 903 1 340 443 412 319 + 904 1 340 353 443 319 + 905 1 353 381 443 452 + 906 1 387 340 412 275 + 907 1 340 412 275 319 + 908 1 340 353 319 262 + 909 1 275 340 319 262 + 910 1 381 340 387 304 + 911 1 340 387 304 275 + 912 1 387 381 304 439 + 913 1 381 443 452 495 + 914 1 452 381 495 423 + 915 1 495 452 423 450 + 916 1 381 495 423 439 + 917 1 324 353 262 217 + 918 1 384 452 353 454 + 919 1 381 324 262 258 + 920 1 324 262 258 217 + 921 1 149 118 122 87 + 922 1 153 119 120 86 + 923 1 180 230 166 168 + 924 1 285 205 201 209 + 925 1 307 317 384 217 + 926 1 308 380 373 513 + 927 1 63 43 28 44 + 928 1 28 17 15 6 + 929 1 505 569 488 574 + 930 1 308 285 377 284 + 931 1 308 285 284 209 + 932 1 285 377 284 342 + 933 1 377 308 284 375 + 934 1 402 311 397 306 + 935 1 311 397 306 301 + 936 1 402 311 306 268 + 937 1 397 402 306 478 + 938 1 470 475 493 563 + 939 1 289 192 224 253 + 940 1 495 452 450 547 + 941 1 495 452 547 501 + 942 1 495 452 501 443 + 943 1 400 461 517 433 + 944 1 99 154 151 140 + 945 1 99 154 140 155 + 946 1 152 111 106 178 + 947 1 461 480 517 546 + 948 1 648 635 660 619 + 949 1 55 80 75 54 + 950 1 658 661 664 668 + 951 1 556 599 511 573 + 952 1 599 511 573 592 + 953 1 266 257 337 281 + 954 1 591 542 561 584 + 955 1 173 241 249 333 + 956 1 112 123 166 113 + 957 1 123 166 113 136 + 958 1 123 166 136 181 + 959 1 123 166 181 194 + 960 1 113 123 136 84 + 961 1 113 123 84 112 + 962 1 136 123 181 115 + 963 1 123 136 84 115 + 964 1 84 123 115 72 + 965 1 136 84 115 92 + 966 1 84 115 92 72 + 967 1 136 84 92 114 + 968 1 115 136 92 162 + 969 1 136 84 114 113 + 970 1 114 136 113 186 + 971 1 84 114 113 50 + 972 1 123 181 115 125 + 973 1 114 136 186 189 + 974 1 114 136 189 92 + 975 1 136 186 189 166 + 976 1 166 136 181 189 + 977 1 136 181 189 162 + 978 1 181 136 115 162 + 979 1 166 113 136 186 + 980 1 477 438 491 567 + 981 1 157 235 190 226 + 982 1 190 157 226 175 + 983 1 144 216 116 172 + 984 1 116 144 172 78 + 985 1 144 216 172 261 + 986 1 550 577 569 610 + 987 1 550 577 610 522 + 988 1 569 550 610 579 + 989 1 550 610 579 555 + 990 1 550 610 555 522 + 991 1 555 550 522 432 + 992 1 579 550 555 487 + 993 1 550 555 487 432 + 994 1 579 550 487 505 + 995 1 550 487 505 432 + 996 1 639 658 664 643 + 997 1 10 27 22 20 + 998 1 22 10 20 11 + 999 1 511 556 573 524 + 1000 1 241 196 249 291 + 1001 1 235 190 226 281 + 1002 1 190 226 281 197 + 1003 1 281 190 197 184 + 1004 1 226 281 197 248 + 1005 1 190 226 197 175 + 1006 1 226 197 175 248 + 1007 1 197 175 248 162 + 1008 1 197 175 162 131 + 1009 1 197 175 131 190 + 1010 1 248 197 162 300 + 1011 1 248 197 300 281 + 1012 1 131 197 190 184 + 1013 1 537 488 578 485 + 1014 1 578 537 485 506 + 1015 1 537 488 485 458 + 1016 1 157 235 226 212 + 1017 1 18 9 6 16 + 1018 1 513 591 561 520 + 1019 1 438 448 516 567 + 1020 1 375 481 473 441 + 1021 1 375 481 441 453 + 1022 1 481 441 453 513 + 1023 1 441 453 513 308 + 1024 1 473 375 441 462 + 1025 1 441 473 462 520 + 1026 1 462 441 520 377 + 1027 1 441 520 377 513 + 1028 1 441 520 513 561 + 1029 1 556 599 573 631 + 1030 1 75 55 54 48 + 1031 1 75 55 48 86 + 1032 1 54 75 48 65 + 1033 1 75 48 65 119 + 1034 1 48 54 65 31 + 1035 1 54 75 65 118 + 1036 1 642 659 662 640 + 1037 1 662 642 640 643 + 1038 1 640 662 643 664 + 1039 1 642 659 640 614 + 1040 1 640 642 614 615 + 1041 1 640 642 615 643 + 1042 1 615 640 643 639 + 1043 1 643 615 639 616 + 1044 1 643 615 616 593 + 1045 1 639 643 616 644 + 1046 1 643 616 644 593 + 1047 1 615 639 616 560 + 1048 1 616 615 560 593 + 1049 1 615 640 639 546 + 1050 1 615 640 546 614 + 1051 1 642 614 615 565 + 1052 1 642 615 643 647 + 1053 1 615 643 647 593 + 1054 1 642 659 614 646 + 1055 1 614 642 646 602 + 1056 1 614 642 602 565 + 1057 1 164 234 155 188 + 1058 1 164 234 188 273 + 1059 1 234 188 273 355 + 1060 1 155 164 188 100 + 1061 1 290 313 222 293 + 1062 1 222 290 293 252 + 1063 1 290 313 293 352 + 1064 1 111 55 86 52 + 1065 1 55 86 52 48 + 1066 1 573 511 524 507 + 1067 1 524 573 507 592 + 1068 1 113 114 186 150 + 1069 1 73 91 44 63 + 1070 1 123 168 194 125 + 1071 1 137 145 107 207 + 1072 1 383 346 354 286 + 1073 1 383 346 286 291 + 1074 1 346 286 291 249 + 1075 1 346 354 286 249 + 1076 1 354 383 286 274 + 1077 1 286 354 274 200 + 1078 1 267 235 347 281 + 1079 1 347 267 281 392 + 1080 1 626 634 652 569 + 1081 1 19 8 11 15 + 1082 1 640 643 639 664 + 1083 1 603 553 588 601 + 1084 1 243 302 216 261 + 1085 1 243 302 261 418 + 1086 1 243 302 418 367 + 1087 1 418 243 367 298 + 1088 1 367 418 298 426 + 1089 1 261 243 418 349 + 1090 1 302 418 367 436 + 1091 1 418 261 349 374 + 1092 1 243 302 367 266 + 1093 1 367 418 426 457 + 1094 1 367 418 457 436 + 1095 1 457 367 436 486 + 1096 1 457 367 486 426 + 1097 1 486 457 426 460 + 1098 1 490 459 533 602 + 1099 1 257 310 337 392 + 1100 1 310 337 392 363 + 1101 1 119 153 126 86 + 1102 1 596 576 520 591 + 1103 1 116 76 78 135 + 1104 1 361 267 347 392 + 1105 1 187 251 191 283 + 1106 1 243 418 349 298 + 1107 1 418 349 298 426 + 1108 1 621 562 627 590 + 1109 1 627 621 590 653 + 1110 1 367 486 426 356 + 1111 1 486 426 356 503 + 1112 1 486 426 503 538 + 1113 1 486 426 538 460 + 1114 1 660 648 619 659 + 1115 1 555 487 432 508 + 1116 1 87 47 49 81 + 1117 1 47 49 81 53 + 1118 1 485 537 458 506 + 1119 1 87 137 107 77 + 1120 1 137 107 77 103 + 1121 1 87 137 77 124 + 1122 1 137 77 124 103 + 1123 1 77 124 103 80 + 1124 1 77 124 80 87 + 1125 1 87 137 124 122 + 1126 1 137 124 122 198 + 1127 1 513 576 520 493 + 1128 1 542 561 584 481 + 1129 1 420 518 458 371 + 1130 1 95 81 145 143 + 1131 1 95 81 143 110 + 1132 1 95 81 110 53 + 1133 1 145 95 143 209 + 1134 1 599 573 631 592 + 1135 1 368 308 453 375 + 1136 1 226 157 212 175 + 1137 1 487 432 508 326 + 1138 1 451 317 369 454 + 1139 1 191 187 283 169 + 1140 1 191 187 169 110 + 1141 1 187 169 110 209 + 1142 1 187 169 209 283 + 1143 1 561 584 481 581 + 1144 1 238 196 198 170 + 1145 1 198 238 170 219 + 1146 1 293 290 352 252 + 1147 1 352 293 252 259 + 1148 1 352 293 259 313 + 1149 1 293 252 259 222 + 1150 1 259 293 222 313 + 1151 1 137 124 198 200 + 1152 1 26 19 11 20 + 1153 1 97 83 96 57 + 1154 1 258 262 199 217 + 1155 1 452 501 443 353 + 1156 1 611 590 653 609 + 1157 1 487 505 432 401 + 1158 1 432 487 401 326 + 1159 1 401 432 326 371 + 1160 1 487 505 401 509 + 1161 1 401 487 509 508 + 1162 1 487 505 509 579 + 1163 1 326 401 371 289 + 1164 1 487 401 326 508 + 1165 1 111 138 88 178 + 1166 1 617 620 649 635 + 1167 1 204 220 207 297 + 1168 1 220 207 297 255 + 1169 1 204 220 297 342 + 1170 1 452 501 353 454 + 1171 1 88 80 56 101 + 1172 1 68 95 110 53 + 1173 1 110 68 53 96 + 1174 1 241 249 333 346 + 1175 1 154 151 140 233 + 1176 1 573 631 592 583 + 1177 1 423 324 258 410 + 1178 1 423 324 410 450 + 1179 1 410 423 450 514 + 1180 1 410 423 514 510 + 1181 1 450 410 514 494 + 1182 1 423 514 510 495 + 1183 1 510 423 495 439 + 1184 1 423 514 495 450 + 1185 1 410 423 510 397 + 1186 1 423 510 397 439 + 1187 1 410 423 397 258 + 1188 1 664 658 668 662 + 1189 1 537 518 458 554 + 1190 1 212 226 175 332 + 1191 1 156 222 152 259 + 1192 1 513 441 561 481 + 1193 1 562 553 603 475 + 1194 1 249 333 346 331 + 1195 1 224 219 253 179 + 1196 1 224 219 179 170 + 1197 1 219 179 170 198 + 1198 1 659 662 640 664 + 1199 1 668 664 662 669 + 1200 1 481 473 441 561 + 1201 1 234 155 188 242 + 1202 1 188 234 242 355 + 1203 1 155 188 242 154 + 1204 1 310 276 237 321 + 1205 1 509 487 579 508 + 1206 1 418 448 349 460 + 1207 1 349 418 460 426 + 1208 1 418 448 460 457 + 1209 1 448 349 460 429 + 1210 1 460 448 429 535 + 1211 1 460 448 535 566 + 1212 1 429 460 535 515 + 1213 1 349 460 429 365 + 1214 1 460 448 566 516 + 1215 1 448 535 566 567 + 1216 1 535 460 566 515 + 1217 1 448 566 516 567 + 1218 1 429 349 365 261 + 1219 1 460 448 516 457 + 1220 1 448 516 457 418 + 1221 1 516 457 418 438 + 1222 1 516 457 438 436 + 1223 1 516 460 457 538 + 1224 1 457 516 538 486 + 1225 1 457 516 486 436 + 1226 1 538 457 486 460 + 1227 1 429 460 515 365 + 1228 1 448 429 535 496 + 1229 1 535 448 496 567 + 1230 1 429 535 496 519 + 1231 1 429 535 519 515 + 1232 1 535 519 515 589 + 1233 1 535 496 519 586 + 1234 1 496 429 519 434 + 1235 1 535 496 586 567 + 1236 1 519 429 515 365 + 1237 1 519 429 365 476 + 1238 1 496 429 434 374 + 1239 1 519 535 586 605 + 1240 1 519 515 589 480 + 1241 1 146 214 163 208 + 1242 1 163 146 208 109 + 1243 1 524 573 592 583 + 1244 1 524 573 583 585 + 1245 1 224 219 170 269 + 1246 1 257 337 281 392 + 1247 1 368 251 283 321 + 1248 1 124 137 103 200 + 1249 1 630 645 586 606 + 1250 1 586 630 606 567 + 1251 1 606 586 567 535 + 1252 1 606 586 535 605 + 1253 1 606 586 605 645 + 1254 1 234 155 242 213 + 1255 1 155 242 213 154 + 1256 1 395 440 497 408 + 1257 1 573 511 507 592 + 1258 1 184 194 125 181 + 1259 1 184 194 181 254 + 1260 1 181 184 254 227 + 1261 1 181 184 227 162 + 1262 1 254 181 227 231 + 1263 1 254 181 231 166 + 1264 1 181 227 231 189 + 1265 1 194 181 254 166 + 1266 1 231 181 189 166 + 1267 1 125 184 181 115 + 1268 1 184 181 115 162 + 1269 1 227 254 231 344 + 1270 1 254 231 344 264 + 1271 1 254 231 264 166 + 1272 1 639 640 664 650 + 1273 1 639 640 650 620 + 1274 1 650 639 620 663 + 1275 1 620 650 663 635 + 1276 1 640 650 620 604 + 1277 1 650 620 604 635 + 1278 1 639 640 620 546 + 1279 1 650 663 635 660 + 1280 1 650 663 660 664 + 1281 1 640 650 604 660 + 1282 1 664 639 650 663 + 1283 1 604 650 635 660 + 1284 1 620 640 604 546 + 1285 1 84 92 114 50 + 1286 1 84 92 50 59 + 1287 1 646 614 619 659 + 1288 1 640 546 614 619 + 1289 1 614 640 619 659 + 1290 1 448 429 496 374 + 1291 1 310 392 413 446 + 1292 1 310 392 446 363 + 1293 1 261 243 349 245 + 1294 1 300 390 382 356 + 1295 1 353 384 454 403 + 1296 1 384 454 403 317 + 1297 1 450 428 393 523 + 1298 1 106 86 156 93 + 1299 1 106 86 93 52 + 1300 1 469 419 325 343 + 1301 1 28 31 46 16 + 1302 1 130 201 205 209 + 1303 1 298 194 230 168 + 1304 1 142 206 210 133 + 1305 1 339 270 393 309 + 1306 1 271 366 386 327 + 1307 1 68 76 47 31 + 1308 1 380 377 378 493 + 1309 1 236 224 153 222 + 1310 1 343 325 264 419 + 1311 1 438 477 448 567 + 1312 1 28 15 31 16 + 1313 1 198 179 229 219 + 1314 1 120 161 146 104 + 1315 1 120 161 104 85 + 1316 1 146 120 104 93 + 1317 1 246 305 366 365 + 1318 1 161 214 146 228 + 1319 1 214 146 228 208 + 1320 1 161 214 228 268 + 1321 1 146 228 208 167 + 1322 1 228 208 167 279 + 1323 1 146 228 167 161 + 1324 1 223 166 264 186 + 1325 1 85 82 133 73 + 1326 1 458 537 554 506 + 1327 1 374 477 380 434 + 1328 1 72 125 90 123 + 1329 1 253 183 271 246 + 1330 1 288 215 210 158 + 1331 1 204 149 229 198 + 1332 1 206 142 147 133 + 1333 1 493 475 434 562 + 1334 1 244 268 176 210 + 1335 1 137 149 204 198 + 1336 1 180 166 147 112 + 1337 1 145 137 204 207 + 1338 1 192 244 158 250 + 1339 1 183 205 246 135 + 1340 1 94 165 112 78 + 1341 1 67 121 119 120 + 1342 1 285 282 205 209 + 1343 1 475 386 455 541 + 1344 1 83 72 90 46 + 1345 1 313 326 371 224 + 1346 1 229 253 271 386 + 1347 1 31 62 46 78 + 1348 1 194 254 230 166 + 1349 1 307 450 393 296 + 1350 1 201 204 229 342 + 1351 1 378 493 434 380 + 1352 1 377 285 378 342 + 1353 1 224 192 153 126 + 1354 1 477 374 448 496 + 1355 1 15 30 31 20 + 1356 1 339 245 270 309 + 1357 1 183 118 130 135 + 1358 1 183 118 135 192 + 1359 1 214 176 236 268 + 1360 1 166 230 264 254 + 1361 1 396 459 410 494 + 1362 1 476 562 519 434 + 1363 1 343 426 339 469 + 1364 1 477 373 380 513 + 1365 1 94 119 135 65 + 1366 1 271 246 366 327 + 1367 1 166 223 147 186 + 1368 1 374 380 305 434 + 1369 1 325 339 393 469 + 1370 1 95 68 47 53 + 1371 1 68 47 53 35 + 1372 1 53 68 35 51 + 1373 1 53 68 51 96 + 1374 1 68 35 51 46 + 1375 1 35 53 51 21 + 1376 1 121 85 133 161 + 1377 1 244 176 158 210 + 1378 1 183 130 205 135 + 1379 1 67 43 85 38 + 1380 1 282 305 205 261 + 1381 1 505 569 574 579 + 1382 1 222 153 152 224 + 1383 1 280 274 171 204 + 1384 1 92 115 162 98 + 1385 1 92 115 98 72 + 1386 1 307 223 317 217 + 1387 1 47 54 49 20 + 1388 1 405 368 375 283 + 1389 1 405 368 283 321 + 1390 1 405 368 321 467 + 1391 1 10 27 20 7 + 1392 1 517 553 455 540 + 1393 1 455 517 540 433 + 1394 1 517 553 540 601 + 1395 1 553 540 601 541 + 1396 1 385 334 244 311 + 1397 1 462 441 377 364 + 1398 1 441 377 364 375 + 1399 1 364 441 375 462 + 1400 1 38 17 25 19 + 1401 1 208 146 167 109 + 1402 1 595 629 569 578 + 1403 1 220 207 255 143 + 1404 1 197 300 281 184 + 1405 1 619 646 659 648 + 1406 1 288 311 244 210 + 1407 1 244 288 210 158 + 1408 1 80 56 101 69 + 1409 1 261 243 245 202 + 1410 1 245 261 202 256 + 1411 1 202 245 256 165 + 1412 1 256 202 165 261 + 1413 1 202 245 165 168 + 1414 1 165 202 168 185 + 1415 1 202 168 185 243 + 1416 1 165 202 185 261 + 1417 1 202 245 168 243 + 1418 1 202 185 261 243 + 1419 1 245 261 256 349 + 1420 1 168 165 185 144 + 1421 1 185 168 144 177 + 1422 1 185 261 243 177 + 1423 1 144 185 177 261 + 1424 1 616 587 644 593 + 1425 1 274 286 200 198 + 1426 1 587 515 600 525 + 1427 1 600 587 525 572 + 1428 1 224 289 253 326 + 1429 1 535 519 589 605 + 1430 1 587 512 525 572 + 1431 1 256 245 349 365 + 1432 1 9 16 7 6 + 1433 1 105 73 44 58 + 1434 1 472 474 558 489 + 1435 1 472 474 489 352 + 1436 1 505 401 509 433 + 1437 1 505 401 433 371 + 1438 1 97 96 160 102 + 1439 1 97 96 102 57 + 1440 1 162 197 131 184 + 1441 1 526 474 580 558 + 1442 1 129 213 154 155 + 1443 1 207 204 297 280 + 1444 1 390 300 277 344 + 1445 1 665 660 669 659 + 1446 1 273 279 388 292 + 1447 1 273 279 292 167 + 1448 1 388 273 292 394 + 1449 1 397 402 478 534 + 1450 1 478 397 534 510 + 1451 1 478 397 510 439 + 1452 1 13 3 9 7 + 1453 1 39 38 25 61 + 1454 1 25 39 61 34 + 1455 1 274 280 389 297 + 1456 1 527 473 581 559 + 1457 1 27 22 20 49 + 1458 1 524 573 585 556 + 1459 1 472 502 407 370 + 1460 1 472 502 370 458 + 1461 1 407 472 370 376 + 1462 1 472 370 376 458 + 1463 1 407 472 376 352 + 1464 1 376 407 352 272 + 1465 1 352 376 272 290 + 1466 1 376 272 290 303 + 1467 1 290 376 303 458 + 1468 1 376 272 303 407 + 1469 1 272 290 303 228 + 1470 1 352 376 290 420 + 1471 1 376 290 420 458 + 1472 1 352 376 420 489 + 1473 1 376 420 489 472 + 1474 1 489 376 472 352 + 1475 1 376 420 472 458 + 1476 1 462 499 406 398 + 1477 1 462 499 398 545 + 1478 1 406 462 398 364 + 1479 1 406 462 364 375 + 1480 1 364 406 375 255 + 1481 1 398 406 364 297 + 1482 1 375 364 255 284 + 1483 1 364 255 284 297 + 1484 1 375 364 284 377 + 1485 1 364 284 377 398 + 1486 1 377 364 398 462 + 1487 1 398 377 462 545 + 1488 1 364 406 255 297 + 1489 1 364 284 398 297 + 1490 1 284 377 398 342 + 1491 1 377 398 342 470 + 1492 1 590 653 609 627 + 1493 1 609 590 627 564 + 1494 1 609 590 564 493 + 1495 1 590 627 564 562 + 1496 1 627 609 564 563 + 1497 1 407 352 272 252 + 1498 1 352 272 252 290 + 1499 1 272 252 290 222 + 1500 1 272 407 252 323 + 1501 1 252 272 323 228 + 1502 1 252 272 228 214 + 1503 1 362 332 248 351 + 1504 1 538 566 516 460 + 1505 1 328 357 355 234 + 1506 1 541 492 504 386 + 1507 1 125 184 115 131 + 1508 1 2 10 12 11 + 1509 1 358 354 331 240 + 1510 1 324 410 450 296 + 1511 1 68 47 35 31 + 1512 1 151 99 140 105 + 1513 1 165 185 144 172 + 1514 1 185 144 172 261 + 1515 1 172 185 261 218 + 1516 1 172 185 218 165 + 1517 1 185 218 165 261 + 1518 1 385 490 533 461 + 1519 1 490 533 461 488 + 1520 1 490 533 488 595 + 1521 1 253 224 179 192 + 1522 1 194 230 168 166 + 1523 1 272 252 222 214 + 1524 1 470 475 563 504 + 1525 1 184 266 254 227 + 1526 1 102 97 57 79 + 1527 1 102 97 79 131 + 1528 1 79 102 131 98 + 1529 1 131 79 98 72 + 1530 1 79 98 72 59 + 1531 1 79 98 59 70 + 1532 1 79 98 70 102 + 1533 1 72 79 59 57 + 1534 1 59 79 70 57 + 1535 1 70 79 102 57 + 1536 1 102 97 131 190 + 1537 1 571 608 607 523 + 1538 1 571 608 523 547 + 1539 1 607 571 523 551 + 1540 1 161 146 104 167 + 1541 1 52 55 48 29 + 1542 1 52 55 29 56 + 1543 1 55 48 29 54 + 1544 1 291 391 278 350 + 1545 1 17 39 25 24 + 1546 1 17 39 24 44 + 1547 1 454 403 501 353 + 1548 1 576 611 609 590 + 1549 1 576 611 590 536 + 1550 1 576 611 536 544 + 1551 1 611 590 536 586 + 1552 1 590 576 536 493 + 1553 1 609 576 590 493 + 1554 1 590 536 586 496 + 1555 1 536 586 496 567 + 1556 1 496 536 567 477 + 1557 1 536 567 477 544 + 1558 1 496 536 477 493 + 1559 1 477 536 544 513 + 1560 1 477 536 513 493 + 1561 1 104 120 85 64 + 1562 1 85 104 64 66 + 1563 1 85 104 66 117 + 1564 1 85 104 117 161 + 1565 1 104 64 66 109 + 1566 1 104 66 117 109 + 1567 1 66 85 117 74 + 1568 1 85 117 74 133 + 1569 1 66 85 74 39 + 1570 1 74 66 39 58 + 1571 1 39 74 58 73 + 1572 1 39 74 73 85 + 1573 1 74 73 85 133 + 1574 1 117 66 74 89 + 1575 1 74 117 89 140 + 1576 1 117 89 140 100 + 1577 1 74 117 140 132 + 1578 1 117 140 132 182 + 1579 1 117 140 182 188 + 1580 1 140 182 188 232 + 1581 1 182 188 232 263 + 1582 1 182 188 263 167 + 1583 1 132 117 182 133 + 1584 1 117 140 188 100 + 1585 1 140 182 232 132 + 1586 1 188 140 232 233 + 1587 1 232 182 263 304 + 1588 1 188 232 263 355 + 1589 1 74 117 132 133 + 1590 1 182 117 188 167 + 1591 1 66 74 89 58 + 1592 1 74 89 58 99 + 1593 1 89 58 99 71 + 1594 1 99 89 71 100 + 1595 1 89 71 100 61 + 1596 1 99 89 100 140 + 1597 1 99 89 140 74 + 1598 1 100 89 61 66 + 1599 1 89 61 66 58 + 1600 1 100 89 66 117 + 1601 1 61 100 66 109 + 1602 1 104 120 64 93 + 1603 1 74 58 73 105 + 1604 1 73 74 105 132 + 1605 1 73 74 132 133 + 1606 1 89 58 71 61 + 1607 1 64 85 66 38 + 1608 1 66 64 38 45 + 1609 1 64 38 45 41 + 1610 1 64 38 41 67 + 1611 1 38 45 41 19 + 1612 1 64 38 67 85 + 1613 1 45 64 41 93 + 1614 1 67 64 85 120 + 1615 1 38 66 45 61 + 1616 1 66 45 61 109 + 1617 1 66 64 45 109 + 1618 1 41 38 19 30 + 1619 1 41 38 30 67 + 1620 1 58 74 99 105 + 1621 1 45 41 19 52 + 1622 1 41 19 52 29 + 1623 1 52 41 29 48 + 1624 1 52 41 48 86 + 1625 1 41 29 48 30 + 1626 1 48 41 30 67 + 1627 1 30 48 67 65 + 1628 1 48 67 65 119 + 1629 1 30 48 65 31 + 1630 1 66 39 58 61 + 1631 1 66 39 61 38 + 1632 1 66 39 38 85 + 1633 1 41 19 29 30 + 1634 1 647 643 644 593 + 1635 1 97 79 131 72 + 1636 1 97 79 72 57 + 1637 1 301 381 258 423 + 1638 1 143 95 110 209 + 1639 1 555 487 508 579 + 1640 1 609 564 563 493 + 1641 1 564 563 493 475 + 1642 1 493 564 475 562 + 1643 1 564 563 475 603 + 1644 1 276 310 413 321 + 1645 1 452 547 501 454 + 1646 1 553 455 540 541 + 1647 1 443 381 387 439 + 1648 1 603 617 635 588 + 1649 1 617 635 588 620 + 1650 1 384 452 454 547 + 1651 1 231 264 166 186 + 1652 1 457 418 438 436 + 1653 1 423 381 439 301 + 1654 1 521 458 554 472 + 1655 1 519 496 434 562 + 1656 1 446 310 363 321 + 1657 1 266 287 302 367 + 1658 1 287 302 367 436 + 1659 1 370 407 376 303 + 1660 1 376 370 303 458 + 1661 1 370 303 458 427 + 1662 1 370 303 427 399 + 1663 1 370 407 303 323 + 1664 1 370 303 399 292 + 1665 1 458 370 427 502 + 1666 1 303 370 323 292 + 1667 1 303 458 427 312 + 1668 1 458 427 312 425 + 1669 1 458 427 425 485 + 1670 1 458 427 485 506 + 1671 1 427 425 485 402 + 1672 1 485 427 402 399 + 1673 1 427 485 506 399 + 1674 1 506 427 399 502 + 1675 1 427 402 399 312 + 1676 1 425 485 402 490 + 1677 1 425 485 490 488 + 1678 1 490 425 488 461 + 1679 1 425 485 488 458 + 1680 1 485 490 488 578 + 1681 1 485 402 490 534 + 1682 1 427 425 402 312 + 1683 1 402 425 490 334 + 1684 1 488 425 458 518 + 1685 1 488 425 518 371 + 1686 1 312 458 425 371 + 1687 1 458 427 506 502 + 1688 1 485 506 399 478 + 1689 1 399 427 312 303 + 1690 1 425 458 518 371 + 1691 1 427 370 399 502 + 1692 1 402 485 399 478 + 1693 1 490 485 534 578 + 1694 1 425 490 334 461 + 1695 1 506 399 478 435 + 1696 1 506 399 435 447 + 1697 1 399 478 435 306 + 1698 1 303 458 312 290 + 1699 1 312 303 290 228 + 1700 1 485 402 534 478 + 1701 1 590 586 562 496 + 1702 1 586 562 496 519 + 1703 1 402 425 334 268 + 1704 1 261 172 218 205 + 1705 1 172 218 205 135 + 1706 1 533 602 595 490 + 1707 1 458 312 290 371 + 1708 1 312 290 371 214 + 1709 1 146 167 109 104 + 1710 1 109 146 104 93 + 1711 1 589 587 600 644 + 1712 1 590 564 493 562 + 1713 1 258 199 210 133 + 1714 1 658 643 662 664 + 1715 1 176 161 121 210 + 1716 1 401 509 433 327 + 1717 1 142 82 112 147 + 1718 1 570 620 588 604 + 1719 1 620 588 604 635 + 1720 1 588 604 635 618 + 1721 1 588 604 618 548 + 1722 1 588 604 548 546 + 1723 1 635 588 618 601 + 1724 1 588 618 601 548 + 1725 1 588 570 604 546 + 1726 1 635 588 601 603 + 1727 1 618 635 601 648 + 1728 1 618 635 648 619 + 1729 1 648 618 619 574 + 1730 1 618 619 574 548 + 1731 1 574 618 548 601 + 1732 1 619 574 548 533 + 1733 1 648 618 574 626 + 1734 1 648 618 626 601 + 1735 1 574 618 601 626 + 1736 1 618 619 548 604 + 1737 1 618 619 604 635 + 1738 1 619 548 604 546 + 1739 1 604 619 546 640 + 1740 1 604 619 640 660 + 1741 1 619 604 635 660 + 1742 1 570 620 604 546 + 1743 1 548 574 601 540 + 1744 1 548 574 540 505 + 1745 1 548 574 505 488 + 1746 1 80 122 75 87 + 1747 1 284 308 209 283 + 1748 1 397 311 410 258 + 1749 1 126 86 75 119 + 1750 1 230 180 245 168 + 1751 1 291 241 346 249 + 1752 1 192 158 135 250 + 1753 1 365 309 250 245 + 1754 1 605 570 519 589 + 1755 1 88 80 101 138 + 1756 1 583 529 543 471 + 1757 1 632 598 637 575 + 1758 1 632 598 575 557 + 1759 1 631 636 599 592 + 1760 1 401 432 371 505 + 1761 1 544 477 513 500 + 1762 1 212 157 128 175 + 1763 1 536 567 544 611 + 1764 1 536 567 611 586 + 1765 1 540 517 601 548 + 1766 1 540 517 548 505 + 1767 1 63 108 91 113 + 1768 1 108 91 113 150 + 1769 1 63 108 113 112 + 1770 1 108 113 112 147 + 1771 1 108 113 147 150 + 1772 1 108 91 150 105 + 1773 1 112 108 147 82 + 1774 1 113 112 147 166 + 1775 1 147 113 166 186 + 1776 1 108 147 82 133 + 1777 1 146 163 93 109 + 1778 1 605 606 645 641 + 1779 1 6 24 18 17 + 1780 1 6 24 17 14 + 1781 1 92 84 72 59 + 1782 1 73 43 44 39 + 1783 1 448 477 496 567 + 1784 1 519 429 476 434 + 1785 1 47 53 35 27 + 1786 1 53 35 27 21 + 1787 1 35 47 27 20 + 1788 1 227 231 189 277 + 1789 1 227 231 277 344 + 1790 1 54 75 118 87 + 1791 1 405 368 467 500 + 1792 1 460 418 457 426 + 1793 1 228 167 161 225 + 1794 1 228 167 225 292 + 1795 1 225 228 292 299 + 1796 1 292 225 299 335 + 1797 1 292 225 335 263 + 1798 1 225 335 263 301 + 1799 1 228 292 299 303 + 1800 1 292 225 263 167 + 1801 1 299 292 335 399 + 1802 1 335 299 399 306 + 1803 1 299 399 306 268 + 1804 1 335 299 306 225 + 1805 1 306 299 268 161 + 1806 1 225 228 299 161 + 1807 1 299 306 225 161 + 1808 1 335 292 263 394 + 1809 1 263 335 394 304 + 1810 1 228 167 292 279 + 1811 1 399 335 306 435 + 1812 1 399 335 435 292 + 1813 1 299 292 399 303 + 1814 1 399 299 303 312 + 1815 1 299 399 268 312 + 1816 1 268 299 312 228 + 1817 1 306 335 225 301 + 1818 1 335 435 292 388 + 1819 1 335 435 388 394 + 1820 1 335 435 394 439 + 1821 1 388 335 394 292 + 1822 1 21 16 23 36 + 1823 1 21 16 36 35 + 1824 1 16 23 36 46 + 1825 1 16 36 35 46 + 1826 1 21 16 35 27 + 1827 1 540 601 541 549 + 1828 1 540 601 549 579 + 1829 1 541 540 549 509 + 1830 1 540 549 509 579 + 1831 1 549 509 579 508 + 1832 1 549 541 509 492 + 1833 1 509 549 492 508 + 1834 1 541 540 509 455 + 1835 1 540 509 455 433 + 1836 1 509 540 579 505 + 1837 1 509 540 505 433 + 1838 1 524 451 511 556 + 1839 1 261 172 205 216 + 1840 1 172 205 216 116 + 1841 1 172 205 116 135 + 1842 1 8 19 25 17 + 1843 1 81 145 143 107 + 1844 1 196 239 291 278 + 1845 1 239 291 278 350 + 1846 1 35 68 31 46 + 1847 1 279 273 164 167 + 1848 1 76 68 78 31 + 1849 1 141 83 116 110 + 1850 1 425 312 371 334 + 1851 1 312 371 334 268 + 1852 1 334 312 268 425 + 1853 1 371 425 334 433 + 1854 1 312 371 268 236 + 1855 1 268 312 236 214 + 1856 1 312 371 236 214 + 1857 1 666 668 658 662 + 1858 1 638 596 633 591 + 1859 1 496 434 562 493 + 1860 1 584 530 542 481 + 1861 1 147 108 150 148 + 1862 1 147 108 148 133 + 1863 1 108 148 133 73 + 1864 1 573 585 556 631 + 1865 1 359 241 333 346 + 1866 1 640 664 650 660 + 1867 1 27 35 20 16 + 1868 1 494 512 593 532 + 1869 1 494 512 532 393 + 1870 1 593 494 532 568 + 1871 1 242 213 154 233 + 1872 1 148 147 133 217 + 1873 1 148 147 217 150 + 1874 1 391 431 445 350 + 1875 1 431 445 350 508 + 1876 1 390 444 430 344 + 1877 1 390 444 344 415 + 1878 1 444 430 344 503 + 1879 1 318 265 404 264 + 1880 1 612 629 578 569 + 1881 1 612 629 569 652 + 1882 1 24 58 44 39 + 1883 1 24 58 39 34 + 1884 1 58 39 34 61 + 1885 1 39 24 34 25 + 1886 1 280 207 322 297 + 1887 1 207 322 297 255 + 1888 1 322 280 297 414 + 1889 1 449 309 421 393 + 1890 1 279 208 323 228 + 1891 1 610 579 626 569 + 1892 1 98 59 92 72 + 1893 1 60 22 49 40 + 1894 1 60 22 40 32 + 1895 1 49 60 40 77 + 1896 1 60 40 77 80 + 1897 1 40 77 80 87 + 1898 1 49 60 77 107 + 1899 1 77 60 80 103 + 1900 1 77 60 103 107 + 1901 1 22 49 40 20 + 1902 1 40 22 20 26 + 1903 1 40 49 77 87 + 1904 1 647 628 613 593 + 1905 1 628 613 593 568 + 1906 1 647 628 593 656 + 1907 1 613 647 593 615 + 1908 1 25 45 61 38 + 1909 1 25 45 38 19 + 1910 1 500 446 491 363 + 1911 1 446 491 363 436 + 1912 1 500 446 363 321 + 1913 1 447 435 388 292 + 1914 1 442 499 484 398 + 1915 1 574 595 569 488 + 1916 1 474 489 352 483 + 1917 1 474 489 483 580 + 1918 1 574 601 540 579 + 1919 1 520 462 377 545 + 1920 1 113 114 150 91 + 1921 1 113 114 91 50 + 1922 1 301 258 210 311 + 1923 1 605 620 589 639 + 1924 1 620 589 639 546 + 1925 1 605 620 639 654 + 1926 1 620 639 654 663 + 1927 1 654 620 663 649 + 1928 1 605 620 654 649 + 1929 1 589 605 639 641 + 1930 1 639 589 641 644 + 1931 1 663 654 649 667 + 1932 1 663 654 667 670 + 1933 1 654 667 670 661 + 1934 1 654 667 661 645 + 1935 1 661 654 645 639 + 1936 1 661 654 639 663 + 1937 1 670 654 661 663 + 1938 1 654 667 645 649 + 1939 1 538 566 460 525 + 1940 1 460 538 525 426 + 1941 1 538 566 525 600 + 1942 1 525 538 600 572 + 1943 1 525 538 572 426 + 1944 1 390 300 344 356 + 1945 1 182 132 133 199 + 1946 1 132 133 199 148 + 1947 1 132 133 148 73 + 1948 1 182 132 199 203 + 1949 1 199 182 203 304 + 1950 1 132 199 203 148 + 1951 1 182 132 203 232 + 1952 1 203 182 232 304 + 1953 1 232 203 304 275 + 1954 1 133 199 148 217 + 1955 1 392 446 363 436 + 1956 1 83 90 78 46 + 1957 1 312 268 425 402 + 1958 1 312 268 402 399 + 1959 1 478 397 439 306 + 1960 1 131 98 162 115 + 1961 1 286 238 198 294 + 1962 1 238 198 294 260 + 1963 1 238 198 260 219 + 1964 1 260 238 219 341 + 1965 1 219 260 341 253 + 1966 1 294 238 260 341 + 1967 1 219 260 253 229 + 1968 1 260 253 229 341 + 1969 1 198 260 219 229 + 1970 1 198 260 229 294 + 1971 1 286 238 294 383 + 1972 1 260 229 294 336 + 1973 1 260 229 336 341 + 1974 1 336 260 341 294 + 1975 1 294 286 383 274 + 1976 1 58 44 39 73 + 1977 1 306 402 268 399 + 1978 1 306 402 399 478 + 1979 1 501 443 353 466 + 1980 1 533 546 461 548 + 1981 1 231 344 264 318 + 1982 1 400 345 289 250 + 1983 1 391 291 383 350 + 1984 1 269 239 170 178 + 1985 1 266 337 367 382 + 1986 1 266 337 382 281 + 1987 1 337 382 281 392 + 1988 1 337 382 392 436 + 1989 1 337 382 436 367 + 1990 1 436 337 367 287 + 1991 1 392 337 436 363 + 1992 1 397 534 510 459 + 1993 1 510 397 459 410 + 1994 1 323 407 463 409 + 1995 1 323 407 409 370 + 1996 1 407 409 370 502 + 1997 1 409 370 502 399 + 1998 1 409 323 370 292 + 1999 1 409 370 399 292 + 2000 1 407 463 409 502 + 2001 1 463 409 502 447 + 2002 1 409 502 447 399 + 2003 1 463 409 447 323 + 2004 1 409 447 323 292 + 2005 1 585 531 482 556 + 2006 1 667 657 645 649 + 2007 1 442 389 414 297 + 2008 1 529 466 501 403 + 2009 1 70 57 33 59 + 2010 1 498 531 556 456 + 2011 1 556 498 456 419 + 2012 1 498 456 419 404 + 2013 1 456 419 404 451 + 2014 1 456 419 451 556 + 2015 1 531 556 456 482 + 2016 1 456 531 482 404 + 2017 1 482 456 404 451 + 2018 1 482 456 451 556 + 2019 1 456 531 404 498 + 2020 1 464 442 414 322 + 2021 1 411 323 463 447 + 2022 1 408 320 465 395 + 2023 1 329 360 233 348 + 2024 1 528 557 582 483 + 2025 1 32 60 69 56 + 2026 1 530 467 500 405 + 2027 1 34 61 71 58 + 2028 1 653 638 611 609 + 2029 1 360 412 275 387 + 2030 1 88 106 52 111 + 2031 1 88 106 111 178 + 2032 1 322 406 464 417 + 2033 1 322 406 417 297 + 2034 1 417 322 297 442 + 2035 1 297 417 442 398 + 2036 1 297 417 398 406 + 2037 1 417 442 398 499 + 2038 1 398 417 499 406 + 2039 1 417 442 499 464 + 2040 1 417 442 464 322 + 2041 1 499 417 464 406 + 2042 1 322 406 297 255 + 2043 1 358 280 414 389 + 2044 1 416 445 465 320 + 2045 1 71 100 129 99 + 2046 1 412 466 319 443 + 2047 1 359 391 416 278 + 2048 1 606 567 566 535 + 2049 1 566 606 535 600 + 2050 1 445 497 465 395 + 2051 1 445 497 395 508 + 2052 1 319 466 403 353 + 2053 1 403 319 353 247 + 2054 1 12 22 32 26 + 2055 1 636 651 607 608 + 2056 1 4 8 14 6 + 2057 1 8 25 14 17 + 2058 1 468 531 498 404 + 2059 1 655 665 646 648 + 2060 1 528 408 465 497 + 2061 1 444 468 498 379 + 2062 1 498 444 379 424 + 2063 1 379 498 424 419 + 2064 1 444 379 424 344 + 2065 1 444 379 344 318 + 2066 1 424 444 344 503 + 2067 1 379 424 344 264 + 2068 1 379 344 318 264 + 2069 1 498 444 424 503 + 2070 1 424 498 503 469 + 2071 1 468 498 379 404 + 2072 1 379 468 404 318 + 2073 1 404 379 318 264 + 2074 1 379 468 318 444 + 2075 1 424 379 419 264 + 2076 1 498 379 404 419 + 2077 1 379 404 419 264 + 2078 1 320 278 416 391 + 2079 1 463 526 502 407 + 2080 1 361 235 330 347 + 2081 1 637 610 652 612 + 2082 1 656 666 644 647 + 2083 1 33 13 23 21 + 2084 1 362 415 390 277 + 2085 1 497 557 528 440 + 2086 1 60 103 69 80 + 2087 1 127 174 211 173 + 2088 1 265 189 186 231 + 2089 1 265 189 231 318 + 2090 1 231 265 318 264 + 2091 1 231 265 264 186 + 2092 1 500 467 446 321 + 2093 1 628 651 608 594 + 2094 1 608 628 594 532 + 2095 1 628 651 594 625 + 2096 1 651 594 625 607 + 2097 1 594 625 607 572 + 2098 1 651 594 607 608 + 2099 1 594 628 625 593 + 2100 1 594 628 593 532 + 2101 1 593 594 532 512 + 2102 1 594 607 608 523 + 2103 1 594 607 523 572 + 2104 1 413 276 361 392 + 2105 1 656 651 628 625 + 2106 1 173 101 127 134 + 2107 1 173 101 134 196 + 2108 1 134 173 196 200 + 2109 1 196 134 200 124 + 2110 1 134 200 124 103 + 2111 1 124 134 103 101 + 2112 1 101 127 134 103 + 2113 1 127 134 103 174 + 2114 1 134 103 174 200 + 2115 1 174 134 200 173 + 2116 1 127 134 174 173 + 2117 1 196 134 124 138 + 2118 1 134 124 138 101 + 2119 1 196 134 138 101 + 2120 1 124 196 138 198 + 2121 1 196 138 198 170 + 2122 1 196 138 170 178 + 2123 1 128 70 98 102 + 2124 1 467 413 446 321 + 2125 1 483 408 528 440 + 2126 1 483 408 440 352 + 2127 1 69 103 127 101 + 2128 1 484 504 437 342 + 2129 1 59 33 23 37 + 2130 1 23 59 37 36 + 2131 1 37 23 36 21 + 2132 1 36 37 21 51 + 2133 1 36 37 51 72 + 2134 1 36 37 72 59 + 2135 1 37 21 51 57 + 2136 1 51 37 57 72 + 2137 1 51 36 72 46 + 2138 1 37 21 57 33 + 2139 1 21 36 51 35 + 2140 1 36 51 35 46 + 2141 1 57 37 33 59 + 2142 1 36 72 46 42 + 2143 1 46 36 42 23 + 2144 1 36 42 23 59 + 2145 1 42 23 59 50 + 2146 1 59 42 50 84 + 2147 1 42 50 84 46 + 2148 1 42 23 50 46 + 2149 1 36 42 59 72 + 2150 1 42 59 72 84 + 2151 1 21 51 57 53 + 2152 1 37 21 33 23 + 2153 1 84 42 46 72 + 2154 1 37 57 72 59 + 2155 1 57 51 72 83 + 2156 1 51 72 83 46 + 2157 1 447 388 411 292 + 2158 1 279 323 411 292 + 2159 1 464 406 527 499 + 2160 1 415 468 444 318 + 2161 1 610 626 652 569 + 2162 1 357 411 388 279 + 2163 1 318 415 277 344 + 2164 1 164 279 167 208 + 2165 1 167 164 208 109 + 2166 1 167 164 109 117 + 2167 1 56 26 32 40 + 2168 1 391 445 416 320 + 2169 1 625 656 644 593 + 2170 1 233 360 275 295 + 2171 1 275 233 295 232 + 2172 1 233 295 232 348 + 2173 1 295 232 348 304 + 2174 1 295 232 304 275 + 2175 1 348 295 304 387 + 2176 1 295 304 387 275 + 2177 1 348 295 387 360 + 2178 1 348 295 360 233 + 2179 1 295 387 360 275 + 2180 1 304 348 387 394 + 2181 1 387 304 394 439 + 2182 1 49 81 107 87 + 2183 1 14 34 24 25 + 2184 1 258 301 423 397 + 2185 1 75 65 118 119 + 2186 1 48 41 67 86 + 2187 1 601 588 548 517 + 2188 1 588 548 517 546 + 2189 1 80 55 56 40 + 2190 1 353 443 319 466 + 2191 1 425 334 433 461 + 2192 1 327 400 433 289 + 2193 1 433 327 289 401 + 2194 1 289 433 401 371 + 2195 1 324 258 410 296 + 2196 1 324 258 296 307 + 2197 1 324 258 307 217 + 2198 1 448 429 374 349 + 2199 1 639 605 654 645 + 2200 1 605 654 645 649 + 2201 1 255 375 284 283 + 2202 1 563 470 504 484 + 2203 1 470 504 484 342 + 2204 1 484 470 342 398 + 2205 1 489 352 483 440 + 2206 1 483 489 440 557 + 2207 1 136 189 92 162 + 2208 1 160 97 102 190 + 2209 1 630 586 611 567 + 2210 1 229 294 336 342 + 2211 1 595 629 578 602 + 2212 1 515 535 589 600 + 2213 1 131 98 115 72 + 2214 1 220 145 207 143 + 2215 1 220 145 143 209 + 2216 1 273 164 167 188 + 2217 1 164 167 188 117 + 2218 1 381 443 495 439 + 2219 1 263 232 304 348 + 2220 1 104 64 109 93 + 2221 1 536 544 513 576 + 2222 1 513 536 576 493 + 2223 1 617 562 603 627 + 2224 1 189 231 318 277 + 2225 1 231 318 277 344 + 2226 1 410 396 494 393 + 2227 1 441 375 453 308 + 2228 1 327 400 289 246 + 2229 1 45 41 52 93 + 2230 1 444 344 415 318 + 2231 1 594 608 532 523 + 2232 1 532 594 523 512 + 2233 1 523 532 512 393 + 2234 1 523 532 393 450 + 2235 1 523 532 450 539 + 2236 1 523 532 539 608 + 2237 1 532 539 608 568 + 2238 1 539 608 568 547 + 2239 1 539 608 547 523 + 2240 1 568 539 547 450 + 2241 1 532 539 568 450 + 2242 1 547 539 523 450 + 2243 1 493 470 563 545 + 2244 1 54 75 87 80 + 2245 1 297 322 414 442 + 2246 1 634 629 652 569 + 2247 1 590 536 496 493 + 2248 1 132 203 232 151 + 2249 1 203 232 151 275 + 2250 1 548 517 546 461 + 2251 1 548 517 461 433 + 2252 1 552 510 534 459 + 2253 1 169 143 110 209 + 2254 1 349 339 426 421 + 2255 1 349 339 421 309 + 2256 1 339 426 421 469 + 2257 1 90 144 78 165 + 2258 1 161 120 121 85 + 2259 1 218 172 165 135 + 2260 1 372 365 250 400 + 2261 1 449 515 365 480 + 2262 1 43 73 85 39 + 2263 1 363 302 251 237 + 2264 1 353 319 262 217 + 2265 1 206 217 307 258 + 2266 1 327 455 386 422 + 2267 1 327 455 422 509 + 2268 1 455 386 422 541 + 2269 1 455 422 509 541 + 2270 1 386 327 422 336 + 2271 1 422 386 336 492 + 2272 1 336 422 492 341 + 2273 1 336 422 341 327 + 2274 1 422 492 341 509 + 2275 1 422 341 327 509 + 2276 1 422 492 509 541 + 2277 1 386 342 271 229 + 2278 1 119 192 135 118 + 2279 1 222 214 236 371 + 2280 1 461 533 548 488 + 2281 1 152 170 178 269 + 2282 1 261 374 305 429 + 2283 1 285 284 209 201 + 2284 1 167 161 225 182 + 2285 1 225 167 182 263 + 2286 1 182 225 263 301 + 2287 1 298 245 243 168 + 2288 1 368 373 363 500 + 2289 1 223 264 317 221 + 2290 1 223 264 221 186 + 2291 1 264 221 186 265 + 2292 1 221 186 265 247 + 2293 1 221 186 247 217 + 2294 1 264 221 265 317 + 2295 1 221 223 186 217 + 2296 1 317 223 221 217 + 2297 1 265 221 247 317 + 2298 1 247 221 217 317 + 2299 1 261 282 216 205 + 2300 1 434 496 374 477 + 2301 1 245 256 165 250 + 2302 1 245 256 250 365 + 2303 1 256 250 365 246 + 2304 1 256 250 246 218 + 2305 1 256 250 218 165 + 2306 1 246 256 218 261 + 2307 1 250 246 218 135 + 2308 1 256 218 261 165 + 2309 1 250 218 165 135 + 2310 1 297 220 255 284 + 2311 1 220 255 284 209 + 2312 1 297 220 284 342 + 2313 1 284 220 209 201 + 2314 1 284 220 201 342 + 2315 1 475 455 553 541 + 2316 1 115 123 125 72 + 2317 1 125 115 72 131 + 2318 1 112 165 90 78 + 2319 1 90 112 78 46 + 2320 1 335 306 435 439 + 2321 1 41 64 67 86 + 2322 1 574 548 533 488 + 2323 1 107 87 77 49 + 2324 1 161 225 182 199 + 2325 1 225 182 199 301 + 2326 1 575 489 558 580 + 2327 1 309 365 421 349 + 2328 1 365 421 349 460 + 2329 1 421 349 460 426 + 2330 1 72 90 46 84 + 2331 1 498 556 551 419 + 2332 1 391 431 350 383 + 2333 1 181 123 194 125 + 2334 1 300 382 281 266 + 2335 1 344 424 503 343 + 2336 1 344 424 343 264 + 2337 1 424 503 343 469 + 2338 1 343 424 469 419 + 2339 1 343 424 419 264 + 2340 1 47 49 53 27 + 2341 1 47 49 27 20 + 2342 1 564 627 563 603 + 2343 1 490 488 578 595 + 2344 1 519 515 480 365 + 2345 1 430 390 344 356 + 2346 1 344 430 356 503 + 2347 1 430 390 356 382 + 2348 1 356 430 382 436 + 2349 1 52 41 86 93 + 2350 1 171 274 200 193 + 2351 1 274 200 193 198 + 2352 1 200 171 193 137 + 2353 1 171 193 137 204 + 2354 1 193 137 204 198 + 2355 1 204 193 198 274 + 2356 1 193 137 198 200 + 2357 1 204 193 274 171 + 2358 1 67 64 120 86 + 2359 1 645 605 641 639 + 2360 1 385 490 461 334 + 2361 1 308 368 283 375 + 2362 1 491 438 436 516 + 2363 1 491 438 516 567 + 2364 1 208 163 252 214 + 2365 1 394 263 304 348 + 2366 1 430 503 486 356 + 2367 1 486 430 356 436 + 2368 1 31 35 46 16 + 2369 1 31 35 16 20 + 2370 1 31 35 20 47 + 2371 1 613 568 552 494 + 2372 1 272 303 407 323 + 2373 1 424 469 419 498 + 2374 1 523 428 571 507 + 2375 1 571 523 507 547 + 2376 1 523 428 507 547 + 2377 1 301 199 304 182 + 2378 1 480 570 546 589 + 2379 1 108 148 73 105 + 2380 1 167 273 188 263 + 2381 1 273 188 263 355 + 2382 1 263 273 355 394 + 2383 1 355 263 394 348 + 2384 1 50 84 46 63 + 2385 1 108 150 148 105 + 2386 1 163 156 252 222 + 2387 1 436 337 287 363 + 2388 1 552 568 510 514 + 2389 1 552 568 514 494 + 2390 1 510 552 514 410 + 2391 1 568 510 514 495 + 2392 1 514 568 495 450 + 2393 1 514 568 450 532 + 2394 1 514 568 532 494 + 2395 1 425 488 461 433 + 2396 1 425 488 433 371 + 2397 1 51 57 53 96 + 2398 1 441 520 561 473 + 2399 1 497 555 557 440 + 2400 1 587 600 644 625 + 2401 1 299 228 303 312 + 2402 1 218 246 261 205 + 2403 1 218 246 205 135 + 2404 1 450 428 523 547 + 2405 1 642 615 647 613 + 2406 1 191 237 141 160 + 2407 1 203 132 148 151 + 2408 1 397 306 301 439 + 2409 1 247 186 150 217 + 2410 1 206 217 258 133 + 2411 1 215 165 250 245 + 2412 1 227 254 344 300 + 2413 1 227 254 300 266 + 2414 1 496 434 493 477 + 2415 1 62 46 78 112 + 2416 1 563 541 504 475 + 2417 1 565 613 615 642 + 2418 1 589 605 641 535 + 2419 1 19 52 29 26 + 2420 1 29 19 26 20 + 2421 1 52 29 26 56 + 2422 1 29 26 56 40 + 2423 1 26 29 20 40 + 2424 1 29 20 40 54 + 2425 1 20 40 54 49 + 2426 1 40 29 54 55 + 2427 1 40 54 49 87 + 2428 1 40 54 87 80 + 2429 1 40 29 55 56 + 2430 1 619 548 546 533 + 2431 1 285 284 201 342 + 2432 1 133 182 199 161 + 2433 1 640 619 659 660 + 2434 1 339 421 309 393 + 2435 1 339 421 393 469 + 2436 1 279 323 292 228 + 2437 1 173 249 200 211 + 2438 1 173 249 211 333 + 2439 1 399 435 447 292 + 2440 1 344 227 300 277 + 2441 1 227 300 277 162 + 2442 1 277 227 162 189 + 2443 1 167 109 104 117 + 2444 1 135 119 118 65 + 2445 1 403 454 369 317 + 2446 1 305 374 434 429 + 2447 1 238 294 383 338 + 2448 1 238 294 338 341 + 2449 1 294 383 338 437 + 2450 1 253 183 246 192 + 2451 1 51 57 96 83 + 2452 1 119 67 120 86 + 2453 1 217 148 150 195 + 2454 1 271 253 246 327 + 2455 1 271 253 327 386 + 2456 1 253 246 327 289 + 2457 1 327 253 289 341 + 2458 1 327 253 341 336 + 2459 1 253 341 336 229 + 2460 1 336 253 229 386 + 2461 1 229 336 386 342 + 2462 1 336 386 342 504 + 2463 1 253 327 386 336 + 2464 1 226 235 281 330 + 2465 1 226 235 330 212 + 2466 1 502 472 554 458 + 2467 1 546 560 480 589 + 2468 1 546 560 589 639 + 2469 1 30 48 31 20 + 2470 1 289 192 253 246 + 2471 1 274 280 297 204 + 2472 1 31 15 20 16 + 2473 1 229 198 294 204 + 2474 1 371 432 518 505 + 2475 1 459 490 534 602 + 2476 1 40 54 80 55 + 2477 1 190 267 276 237 + 2478 1 515 600 525 566 + 2479 1 485 534 578 506 + 2480 1 485 534 506 478 + 2481 1 126 179 224 192 + 2482 1 504 492 437 336 + 2483 1 428 384 454 507 + 2484 1 384 454 507 547 + 2485 1 428 384 507 547 + 2486 1 500 491 544 477 + 2487 1 626 574 569 579 + 2488 1 564 475 562 603 + 2489 1 280 171 207 204 + 2490 1 363 373 491 500 + 2491 1 140 74 132 105 + 2492 1 567 477 544 491 + 2493 1 17 15 6 8 + 2494 1 188 155 100 140 + 2495 1 188 155 140 154 + 2496 1 113 84 50 63 + 2497 1 397 423 439 301 + 2498 1 227 181 162 189 + 2499 1 301 258 311 397 + 2500 1 199 210 133 161 + 2501 1 470 563 545 484 + 2502 1 545 470 484 398 + 2503 1 261 256 349 365 + 2504 1 620 570 589 546 + 2505 1 338 294 437 341 + 2506 1 145 143 107 207 + 2507 1 18 6 17 28 + 2508 1 17 18 28 44 + 2509 1 95 116 110 209 + 2510 1 227 300 162 197 + 2511 1 227 300 197 184 + 2512 1 162 227 197 184 + 2513 1 227 300 184 266 + 2514 1 327 289 401 341 + 2515 1 76 130 118 135 + 2516 1 426 343 503 469 + 2517 1 18 6 28 16 + 2518 1 189 186 231 166 + 2519 1 145 87 107 81 + 2520 1 627 564 562 603 + 2521 1 408 528 440 497 + 2522 1 48 75 86 119 + 2523 1 311 306 268 210 + 2524 1 284 398 297 342 + 2525 1 398 297 342 442 + 2526 1 104 161 167 117 + 2527 1 25 17 24 14 + 2528 1 410 450 296 393 + 2529 1 532 514 494 450 + 2530 1 118 126 119 192 + 2531 1 199 262 304 203 + 2532 1 199 262 203 148 + 2533 1 262 304 203 275 + 2534 1 255 220 143 209 + 2535 1 255 284 209 283 + 2536 1 493 470 545 377 + 2537 1 336 386 504 492 + 2538 1 292 273 167 263 + 2539 1 292 273 263 394 + 2540 1 377 441 513 308 + 2541 1 377 441 308 375 + 2542 1 603 553 601 541 + 2543 1 603 553 541 475 + 2544 1 410 514 494 552 + 2545 1 140 99 74 105 + 2546 1 422 492 541 386 + 2547 1 313 440 408 352 + 2548 1 290 272 222 214 + 2549 1 222 290 214 371 + 2550 1 535 606 605 641 + 2551 1 644 587 625 593 + 2552 1 268 312 214 228 + 2553 1 116 83 78 68 + 2554 1 116 83 68 110 + 2555 1 83 78 68 46 + 2556 1 83 68 110 96 + 2557 1 83 68 96 51 + 2558 1 83 68 51 46 + 2559 1 353 384 403 247 + 2560 1 576 520 493 609 + 2561 1 29 48 30 20 + 2562 1 224 236 371 222 + 2563 1 625 594 593 512 + 2564 1 228 299 161 268 + 2565 1 105 73 132 148 + 2566 1 367 486 356 436 + 2567 1 356 367 436 382 + 2568 1 474 489 580 558 + 2569 1 493 434 380 477 + 2570 1 83 141 96 110 + 2571 1 523 469 393 512 + 2572 1 261 349 374 429 + 2573 1 306 311 301 210 + 2574 1 628 593 532 568 + 2575 1 528 483 440 557 + 2576 1 132 105 148 151 + 2577 1 251 368 363 321 + 2578 1 304 394 439 335 + 2579 1 140 188 154 233 + 2580 1 432 395 497 508 + 2581 1 410 450 393 494 + 2582 1 419 317 264 404 + 2583 1 558 575 580 632 + 2584 1 533 565 602 459 + 2585 1 182 117 167 161 + 2586 1 24 18 17 44 + 2587 1 518 521 554 612 + 2588 1 334 402 268 311 + 2589 1 258 199 133 217 + 2590 1 66 100 117 109 + 2591 1 275 233 232 151 + 2592 1 233 232 151 140 + 2593 1 232 151 140 132 + 2594 1 151 140 132 105 + 2595 1 409 447 292 399 + 2596 1 512 587 593 625 + 2597 1 488 461 433 505 + 2598 1 433 488 505 371 + 2599 1 461 433 505 548 + 2600 1 208 323 228 252 + 2601 1 15 30 20 19 + 2602 1 148 150 195 105 + 2603 1 419 451 369 404 + 2604 1 566 535 515 600 + 2605 1 595 569 488 578 + 2606 1 113 147 150 186 + 2607 1 512 525 572 469 + 2608 1 123 84 112 46 + 2609 1 401 327 341 509 + 2610 1 565 494 613 552 + 2611 1 613 565 552 602 + 2612 1 312 290 214 228 + 2613 1 310 237 363 321 + 2614 1 533 479 459 385 + 2615 1 246 256 261 365 + 2616 1 243 185 177 168 + 2617 1 301 304 439 335 + 2618 1 565 613 642 602 + 2619 1 161 176 268 210 + 2620 1 445 391 350 320 + 2621 1 156 222 259 252 + 2622 1 499 484 398 545 + 2623 1 429 476 434 365 + 2624 1 552 510 459 410 + 2625 1 48 29 54 20 + 2626 1 341 336 294 437 + 2627 1 336 294 437 342 + 2628 1 85 117 133 161 + 2629 1 138 196 101 159 + 2630 1 138 196 159 178 + 2631 1 101 138 159 88 + 2632 1 138 159 88 178 + 2633 1 534 552 459 602 + 2634 1 453 500 513 373 + 2635 1 224 289 326 371 + 2636 1 17 15 8 19 + 2637 1 154 242 233 188 + 2638 1 494 593 613 568 + 2639 1 466 403 353 501 + 2640 1 482 524 583 585 + 2641 1 482 524 585 556 + 2642 1 294 383 437 389 + 2643 1 251 237 191 321 + 2644 1 121 133 210 161 + 2645 1 421 512 393 469 + 2646 1 355 263 348 232 + 2647 1 93 86 120 64 + 2648 1 65 54 118 76 + 2649 1 65 54 76 31 + 2650 1 607 572 551 523 + 2651 1 7 16 27 20 + 2652 1 228 292 303 323 + 2653 1 118 135 65 76 + 2654 1 200 174 173 211 + 2655 1 200 174 211 331 + 2656 1 306 335 301 439 + 2657 1 235 347 281 330 + 2658 1 347 281 330 332 + 2659 1 217 148 195 262 + 2660 1 561 591 584 633 + 2661 1 561 591 633 596 + 2662 1 584 561 633 581 + 2663 1 573 585 631 583 + 2664 1 242 234 213 328 + 2665 1 242 234 328 355 + 2666 1 213 242 328 329 + 2667 1 330 226 212 332 + 2668 1 595 574 533 488 + 2669 1 342 484 398 442 + 2670 1 548 517 433 505 + 2671 1 78 76 31 65 + 2672 1 78 76 65 135 + 2673 1 594 625 572 512 + 2674 1 172 165 135 78 + 2675 1 245 349 365 309 + 2676 1 137 107 103 171 + 2677 1 137 107 171 207 + 2678 1 222 259 313 269 + 2679 1 313 222 269 224 + 2680 1 275 319 195 262 + 2681 1 408 259 320 269 + 2682 1 249 211 333 331 + 2683 1 45 64 93 109 + 2684 1 124 103 80 101 + 2685 1 661 664 668 670 + 2686 1 661 664 670 663 + 2687 1 664 670 663 669 + 2688 1 664 668 670 669 + 2689 1 147 217 150 186 + 2690 1 663 635 649 620 + 2691 1 338 238 341 350 + 2692 1 341 338 350 431 + 2693 1 338 350 431 383 + 2694 1 341 338 431 492 + 2695 1 431 338 383 437 + 2696 1 338 238 350 291 + 2697 1 350 341 431 508 + 2698 1 431 338 437 492 + 2699 1 105 151 195 148 + 2700 1 200 196 124 198 + 2701 1 326 401 289 341 + 2702 1 326 401 341 508 + 2703 1 612 569 610 652 + 2704 1 279 388 292 411 + 2705 1 317 419 369 404 + 2706 1 251 283 321 191 + 2707 1 492 336 341 437 + 2708 1 660 669 659 664 + 2709 1 90 72 123 84 + 2710 1 123 90 84 46 + 2711 1 91 44 63 50 + 2712 1 369 404 265 317 + 2713 1 11 26 20 22 + 2714 1 155 100 140 99 + 2715 1 150 247 217 195 + 2716 1 383 238 338 291 + 2717 1 272 303 323 228 + 2718 1 366 400 246 365 + 2719 1 250 365 246 400 + 2720 1 263 335 304 301 + 2721 1 434 429 365 305 + 2722 1 497 465 395 408 + 2723 1 380 377 493 513 + 2724 1 341 338 492 437 + 2725 1 48 67 119 86 + 2726 1 294 286 274 198 + 2727 1 587 600 625 572 + 2728 1 483 489 557 582 + 2729 1 483 489 582 580 + 2730 1 69 103 101 80 + 2731 1 259 313 269 408 + 2732 1 411 323 447 292 + 2733 1 4 8 6 5 + 2734 1 6 4 5 3 + 2735 1 4 8 5 2 + 2736 1 32 60 56 40 + 2737 1 644 656 647 593 + 2738 1 628 656 625 593 + 2739 1 22 32 26 40 + 2740 1 17 6 14 8 + 2741 1 445 465 320 395 + 2742 1 233 329 348 242 + 2743 1 280 414 389 297 + 2744 1 413 446 321 310 + 2745 1 60 69 56 80 + 2746 1 41 86 93 64 + 2747 1 415 390 277 344 + 2748 1 251 363 237 321 + 2749 1 3 9 7 6 + 2750 1 2 10 11 5 + 2751 1 11 2 5 8 + 2752 1 5 11 8 15 + 2753 1 8 5 15 6 + 2754 1 5 15 6 7 + 2755 1 5 15 7 10 + 2756 1 473 581 559 561 + 2757 1 160 97 190 141 + 2758 1 419 469 551 498 + 2759 1 203 262 275 195 + 2760 1 455 327 433 509 + 2761 1 232 233 348 242 + 2762 1 232 233 242 188 + 2763 1 242 232 188 355 + 2764 1 170 239 196 178 + 2765 1 313 371 222 224 + 2766 1 84 46 63 112 + 2767 1 182 263 304 301 + 2768 1 469 523 551 572 + 2769 1 481 473 561 581 + 2770 1 20 10 7 15 + 2771 1 574 505 579 540 + 2772 1 47 54 20 31 + 2773 1 578 595 602 490 + 2774 1 10 20 11 15 + 2775 1 659 662 664 669 + 2776 1 228 214 208 252 + 2777 1 332 248 351 281 + 2778 1 440 432 497 555 + 2779 1 551 469 572 503 + 2780 1 63 28 50 44 + 2781 1 269 395 320 408 + 2782 1 184 125 190 131 + 2783 1 477 373 513 500 + 2784 1 56 80 40 60 + 2785 1 175 226 248 332 + 2786 1 308 284 375 283 + 2787 1 246 183 135 192 + 2788 1 2 10 5 7 + 2789 1 5 4 2 1 + 2790 1 5 4 1 3 + 2791 1 2 5 1 3 + 2792 1 520 377 513 493 + 2793 1 520 377 493 545 + 2794 1 493 520 545 609 + 2795 1 626 574 579 601 + 2796 1 346 354 249 331 + 2797 1 249 200 211 331 + 2798 1 354 331 240 200 + 2799 1 640 659 664 660 + 2800 1 532 494 393 450 + 2801 1 281 226 330 332 + 2802 1 525 421 426 469 + 2803 1 169 209 283 255 + 2804 1 152 170 269 224 + 2805 1 151 203 275 195 + 2806 1 151 203 195 148 + 2807 1 113 84 63 112 + 2808 1 199 301 210 306 + 2809 1 199 301 306 225 + 2810 1 314 329 213 328 + 2811 1 622 631 585 583 + 2812 1 623 580 582 632 + 2813 1 315 330 212 332 + 2814 1 671 669 670 668 + 2815 1 333 211 316 331 + 2816 1 633 581 624 584 + 2817 1 373 477 491 500 + 2818 1 563 541 475 603 + 2819 1 216 209 116 205 + 2820 1 435 478 439 306 + 2821 1 442 484 437 342 + 2822 1 551 469 503 498 + 2823 1 28 15 16 6 + 2824 1 506 399 447 502 + 2825 1 562 590 496 493 + 2826 1 265 264 317 404 + 2827 1 233 329 242 213 + 2828 1 137 171 204 207 + 2829 1 97 131 190 125 + 2830 1 437 504 336 342 + 2831 1 203 262 195 148 + 2832 1 162 131 115 184 + 2833 1 294 229 204 342 + 2834 1 144 165 172 78 + 2835 1 178 152 269 259 + 2836 1 200 171 137 103 + 2837 1 520 559 561 473 + 2838 1 489 575 557 582 + 2839 1 563 493 545 609 + 2840 1 341 401 509 508 + 2841 1 380 477 513 493 + 2842 1 2 5 3 7 + 2843 1 5 3 7 6 + 2844 1 305 246 261 365 + 2845 1 214 222 163 252 + 2846 1 28 46 50 23 + 2847 1 294 383 389 274 + 2848 1 389 294 274 297 + 2849 1 217 148 262 199 + 2850 1 290 272 214 228 + 2851 1 426 503 538 572 + 2852 1 164 188 100 117 + 2853 1 368 321 467 500 + 2854 1 596 520 561 591 + 2855 1 187 141 116 110 + 2856 1 5 11 15 10 + 2857 1 18 28 44 50 + 2858 1 18 28 50 23 + 2859 1 91 63 113 50 + 2860 1 198 294 204 274 + 2861 1 633 561 596 559 + 2862 1 408 352 259 313 + 2863 1 308 373 453 513 + 2864 1 96 141 160 191 + 2865 1 386 475 504 541 + 2866 1 96 141 191 110 + 2867 1 46 31 78 68 + 2868 1 109 164 100 117 + 2869 1 268 244 311 210 + 2870 1 575 580 632 582 + 2871 1 328 242 355 348 + 2872 1 568 547 495 450 + 2873 1 182 117 161 133 + 2874 1 54 20 31 48 + 2875 1 575 489 580 582 + 2876 1 222 152 259 269 + 2877 1 222 152 269 224 + 2878 1 459 410 494 552 + 2879 1 488 461 505 548 + 2880 1 338 350 383 291 + 2881 1 377 398 470 545 + 2882 1 159 196 278 178 + 2883 1 18 28 23 16 + 2884 1 172 116 78 135 + 2885 1 356 266 382 300 + 2886 1 239 269 320 178 + 2887 1 608 628 532 568 + 2888 1 321 191 276 237 + 2889 1 191 276 237 160 + 2890 1 350 395 508 445 + 2891 1 350 395 445 320 + 2892 1 442 437 389 294 + 2893 1 265 369 317 247 + 2894 1 369 317 247 403 + 2895 1 594 523 512 572 + 2896 1 554 458 506 502 + 2897 1 494 565 459 552 + 2898 1 348 232 242 355 + 2899 1 329 348 242 328 + 2900 1 250 246 135 192 + 2901 1 508 555 497 432 + 2902 1 534 490 578 602 + 2903 1 581 559 561 633 + 2904 1 575 632 557 582 + 2905 1 217 247 317 384 + 2906 1 365 429 261 305 + 2907 1 281 226 332 248 + 2908 1 660 663 669 664 + 2909 1 160 190 276 237 + 2910 1 259 320 269 178 + 2911 1 341 326 253 289 + 2912 1 249 200 331 354 + 2913 1 30 29 20 19 + 2914 1 246 250 400 289 + 2915 1 606 535 600 641 + 2916 1 363 368 500 321 + 2917 1 641 600 644 589 + 2918 1 641 600 589 535 + 2919 1 517 433 505 540 + 2920 1 169 143 209 255 + 2921 1 196 239 278 178 + 2922 1 237 141 160 190 + 2923 1 297 204 342 294 + 2924 1 523 469 512 572 + 2925 1 130 205 135 116 + 2926 1 130 205 116 209 + 2927 1 525 572 469 426 + 2928 1 306 225 161 199 + 2929 1 247 217 195 319 + 2930 1 20 11 15 19 + 2931 1 297 274 204 294 + 2932 1 266 184 281 300 + 2933 1 442 389 297 294 + 2934 1 512 587 625 572 + 2935 1 209 187 116 110 + 2936 1 320 178 278 239 + 2937 1 278 320 239 350 + 2938 1 46 28 16 23 + 2939 1 247 317 384 403 + 2940 1 431 492 508 341 + 2941 1 503 426 469 572 + 2942 1 250 246 192 289 + 2943 1 565 459 552 602 + 2944 1 15 20 16 7 + 2945 1 16 15 7 6 + 2946 1 492 509 508 341 + 2947 1 319 195 262 217 + 2948 1 384 353 217 247 + 2949 1 306 268 210 161 + 2950 1 319 353 247 217 + 2951 1 320 278 391 350 + 2952 1 297 342 442 294 + 2953 1 210 199 306 161 + 2954 1 294 437 342 442 +End Elements + +Begin Conditions WallCondition3D3N// GUI group identifier: _HIDDEN__SKIN_ + 1 0 622 583 631 + 2 0 328 357 355 + 3 0 637 652 612 + 4 0 656 651 628 + 5 0 412 360 387 + 6 0 526 580 558 + 7 0 669 671 668 + 8 0 529 466 501 + 9 0 411 463 447 + 10 0 655 665 646 + 11 0 636 631 592 + 12 0 329 314 328 + 13 0 623 632 580 + 14 0 668 666 662 + 15 0 583 529 543 + 16 0 357 411 388 + 17 0 652 655 629 + 18 0 651 636 608 + 19 0 360 329 348 + 20 0 466 412 443 + 21 0 463 526 502 + 22 0 665 669 659 + 23 0 632 637 597 + 24 0 666 656 647 + 25 0 355 357 388 + 26 0 355 388 394 + 27 0 592 631 583 + 28 0 502 526 558 + 29 0 502 558 554 + 30 0 394 388 435 + 31 0 554 558 597 + 32 0 597 558 632 + 33 0 502 554 506 + 34 0 558 580 632 + 35 0 629 655 646 + 36 0 629 646 602 + 37 0 602 646 642 + 38 0 629 602 578 + 39 0 628 651 608 + 40 0 628 608 568 + 41 0 568 608 547 + 42 0 628 568 613 + 43 0 543 529 501 + 44 0 543 501 547 + 45 0 597 637 612 + 46 0 597 612 554 + 47 0 447 463 502 + 48 0 447 502 506 + 49 0 447 506 435 + 50 0 435 506 478 + 51 0 447 435 388 + 52 0 478 506 534 + 53 0 435 478 439 + 54 0 447 388 411 + 55 0 348 329 328 + 56 0 612 652 629 + 57 0 612 629 578 + 58 0 612 578 554 + 59 0 662 666 647 + 60 0 662 647 642 + 61 0 659 669 662 + 62 0 501 466 443 + 63 0 501 443 495 + 64 0 495 443 439 + 65 0 501 495 547 + 66 0 608 636 592 + 67 0 608 592 547 + 68 0 547 592 543 + 69 0 543 592 583 + 70 0 387 360 348 + 71 0 387 348 394 + 72 0 647 656 628 + 73 0 647 628 613 + 74 0 647 613 642 + 75 0 646 665 659 + 76 0 646 659 642 + 77 0 642 659 662 + 78 0 662 669 668 + 79 0 443 412 387 + 80 0 443 387 439 + 81 0 328 355 348 + 82 0 348 355 394 + 83 0 439 478 510 + 84 0 435 439 394 + 85 0 394 439 387 + 86 0 506 554 578 + 87 0 578 602 534 + 88 0 613 568 552 + 89 0 602 642 613 + 90 0 568 547 495 + 91 0 510 478 534 + 92 0 439 510 495 + 93 0 534 602 552 + 94 0 578 534 506 + 95 0 552 568 510 + 96 0 613 552 602 + 97 0 495 510 568 + 98 0 552 510 534 +End Conditions + +Begin SubModelPart FluidParts_Parts_Auto1 // Group Parts Auto1 // Subtree Parts + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart +Begin SubModelPart NoSlip3D_No_Slip_Auto1 // Group No Slip Auto1 // Subtree NoSlip3D + Begin SubModelPartNodes + 314 + 328 + 329 + 348 + 355 + 357 + 360 + 387 + 388 + 394 + 411 + 412 + 435 + 439 + 443 + 447 + 463 + 466 + 478 + 495 + 501 + 502 + 506 + 510 + 526 + 529 + 534 + 543 + 547 + 552 + 554 + 558 + 568 + 578 + 580 + 583 + 592 + 597 + 602 + 608 + 612 + 613 + 622 + 623 + 628 + 629 + 631 + 632 + 636 + 637 + 642 + 646 + 647 + 651 + 652 + 655 + 656 + 659 + 662 + 665 + 666 + 668 + 669 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + End SubModelPartConditions +End SubModelPart +Begin SubModelPart TEMPERATURE_Parts_Auto1 // Group Parts Auto1 // Subtree TEMPERATURE + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart diff --git a/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.msh b/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.msh new file mode 100644 index 000000000000..8965da5598c1 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square_clean/polimero_prueba_q.msh differ diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/BuoyancyMaterials.json b/applications/PfemMeltingApplication/test_examples/square_modified_new/BuoyancyMaterials.json new file mode 100644 index 000000000000..de92a352e22b --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/BuoyancyMaterials.json @@ -0,0 +1,13 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "CONDUCTIVITY" : 1000.0, + "SPECIFIC_HEAT" : 1920.0 + }, + "Tables" : {} + } + }] +} diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/FluidMaterials.json b/applications/PfemMeltingApplication/test_examples/square_modified_new/FluidMaterials.json new file mode 100644 index 000000000000..132994f6db49 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/FluidMaterials.json @@ -0,0 +1,32 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "ACTIVATION_ENERGY" : 0.0, + "ARRHENIUS_COEFFICIENT" : 0.0, + "HEAT_OF_VAPORIZATION" : 0.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "DYNAMIC_VISCOSITY", + "data": [ + [298.0, 1000000.0], + [374.0, 1000000.0], + [473.0, 500000.0], + [553.0, 8706.0], + [613.0, 3716.0], + [723.0, 500.0], + [798.0, 500.0], + [1373.0, 500.3] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/LaserSettings.json b/applications/PfemMeltingApplication/test_examples/square_modified_new/LaserSettings.json new file mode 100644 index 000000000000..cdf3f39a059d --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/LaserSettings.json @@ -0,0 +1,30 @@ +{ + "properties" : [{ + "model_part_name" : "FluidModelPart.FluidParts_Parts_Auto1", + "properties_id" : 1, + "Material" : { + "Variables" : { + "INITIAL_POSITION_X" : 0.57102, + "INITIAL_POSITION_Y" : 0.99997, + "INITIAL_POSITION_Z" : 0.5299, + "RADIOUS" : 0.8, + "FACE_HEAT_FLUX" : 10000000.0 + }, + "Tables": { + "Table1" : { + "input_variable": "TEMPERATURE", + "output_variable": "YOUNG_MODULUS", + "data": [ + [0.0, 2.0], + [1.0, 10.0], + [2.0, 12.0], + [3.5, 15.0] + ] + } + } + } + }] +} + + + diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/MainKratos.py b/applications/PfemMeltingApplication/test_examples/square_modified_new/MainKratos.py new file mode 100644 index 000000000000..274aa39f8643 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/MainKratos.py @@ -0,0 +1,36 @@ +from __future__ import print_function, absolute_import, division #makes KratosMultiphysics backward compatible with python 2.6 and 2.7 + +import KratosMultiphysics +import KratosMultiphysics.PfemMeltingApplication + + +#from convection_diffusion_analysis import ConvectionDiffusionAnalysis +from KratosMultiphysics.PfemMeltingApplication.pfem_melting_analysis import PfemMeltingAnalysis +import sys +import time + +class PfemMeltingAnalysisWithFlush(PfemMeltingAnalysis): + + def __init__(self,model,project_parameters,flush_frequency=10.0): + super(PfemMeltingAnalysisWithFlush,self).__init__(model,project_parameters) + + self.flush_frequency = flush_frequency + self.last_flush = time.time() + + def FinalizeSolutionStep(self): + super(PfemMeltingAnalysisWithFlush,self).FinalizeSolutionStep() + + if self.parallel_type == "OpenMP": + now = time.time() + if now - self.last_flush > self.flush_frequency: + sys.stdout.flush() + self.last_flush = now + +if __name__ == "__main__": + + with open("ProjectParameters.json",'r') as parameter_file: + parameters = KratosMultiphysics.Parameters(parameter_file.read()) + + model = KratosMultiphysics.Model() + simulation = PfemMeltingAnalysisWithFlush(model,parameters) + simulation.Run() diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/ProjectParameters.json b/applications/PfemMeltingApplication/test_examples/square_modified_new/ProjectParameters.json new file mode 100644 index 000000000000..f0eb05eb10fa --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/ProjectParameters.json @@ -0,0 +1,198 @@ +{ + "problem_data" : { + "problem_name" : "polimero_prueba_q", + "domain_size" : 3, + "parallel_type" : "OpenMP", + "echo_level" : 0, + "start_time" : 0.0, + "end_time" : 100.0, + "laser_import_settings" : { + "laser_filename": "LaserSettings.json" + }, + "material_settings" : { + "material_filename": "MateralCharacterization.json" + }, + "environment_settings" : { + "gravity": [0,-10.0, 0], + "ambient_temperature" : 293.15 + } + }, + "output_processes" : { + "gid_output" : [{ + "python_module" : "gid_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "GiDOutputProcess", + "help" : "This process writes postprocessing files for GiD", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_name" : "polimero_prueba_q", + "postprocess_parameters" : { + "result_file_configuration" : { + "gidpost_flags" : { + "GiDPostMode" : "GiD_PostBinary", + "WriteDeformedMeshFlag" : "WriteDeformed", + "WriteConditionsFlag" : "WriteConditions", + "MultiFileFlag" : "MultipleFiles" + }, + "file_label" : "time", + "output_control_type" : "time", + "output_frequency" : 0.1, + "body_output" : true, + "node_output" : false, + "skin_output" : false, + "plane_output" : [], + "nodal_results" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT", "VISCOSITY", "CONDUCTIVITY", "SPECIFIC_HEAT", "IS_STRUCTURE","IS_FREE_SURFACE" ], + "gauss_point_results" : [] + }, + "point_data_configuration" : [] + } + } + }], + "vtk_output" : [{ + "python_module" : "vtk_output_process", + "kratos_module" : "KratosMultiphysics", + "process_name" : "VtkOutputProcess", + "help" : "This process writes postprocessing files for Paraview", + "Parameters" : { + "model_part_name" : "FluidModelPart.fluid_computational_model_part", + "output_control_type" : "step", + "output_frequency" : 1, + "file_format" : "ascii", + "output_precision" : 7, + "output_sub_model_parts" : true, + "folder_name" : "vtk_output", + "save_output_files_in_folder" : true, + "nodal_solution_step_data_variables" : ["VELOCITY","PRESSURE","TEMPERATURE","FACE_HEAT_FLUX","BODY_FORCE","ARRHENIUS_COEFFICIENT"], + "nodal_data_value_variables" : [], + "element_data_value_variables" : [], + "condition_data_value_variables" : [] + } + }] + }, + "restart_options" : { + "SaveRestart" : "False", + "RestartFrequency" : 0, + "LoadRestart" : "False", + "Restart_Step" : 0 + }, + "solver_settings" : { + "solver_type" : "ThermallyCoupledPfem2", + "domain_size" : 3, + "echo_level" : 0, + "fluid_solver_settings" : { + "model_part_name" : "FluidModelPart", + "domain_size" : 3, + "solver_type" : "Monolithic", + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "echo_level" : 0, + "compute_reactions" : true, + "maximum_iterations" : 10, + "reform_dofs_at_each_step": true, + "relative_velocity_tolerance" : 0.001, + "absolute_velocity_tolerance" : 1e-5, + "relative_pressure_tolerance" : 0.001, + "absolute_pressure_tolerance" : 1e-5, + "volume_model_part_name" : "FluidParts_Parts_Auto1", + "skin_parts" : ["NoSlip3D_No_Slip_Auto1"], + "no_skin_parts" : [], + "time_stepping" : { + "automatic_time_step" : false, + "time_step" : 0.005 + }, + "alpha":0.0, + "move_mesh_strategy": 2, + "formulation" : { + "element_type" : "vms", + "use_orthogonal_subscales" : false, + "dynamic_tau" : 0.0 + } + }, + "thermal_solver_settings" : { + "solver_type" : "transient", + "analysis_type" : "non_linear", + "model_part_name" : "ThermalModelPart", + "domain_size" : 3, + "model_import_settings" : { + "input_type" : "mdpa", + "input_filename" : "polimero_prueba_q" + }, + "material_import_settings" : { + "materials_filename" : "BuoyancyMaterials.json" + }, + "time_integration_method" : "implicit", + "transient_parameters" : { + "dynamic_tau": 0.0, + "theta" : 0.5 + }, + "reform_dofs_at_each_step": true, + "line_search" : false, + "echo_level" : 0, + "compute_reactions" : false, + "max_iteration" : 10, + "convergence_criterion" : "residual_criterion", + "solution_relative_tolerance" : 1e-5, + "solution_absolute_tolerance" : 1e-7, + "residual_relative_tolerance" : 1e-5, + "residual_absolute_tolerance" : 1e-7, + "problem_domain_sub_model_part_list" : ["FluidParts_Parts_Auto1"], + "processes_sub_model_part_list" : ["TEMPERATURE_Parts_Auto1","HeatFlux3D_Thermal_face_conditions_Auto3","ImposedTemperature3D_Imposed_temperature_Auto1","ThermalFace3D_Thermal_face_conditions_Auto3"], + "time_stepping" : { + "time_step" : 0.01 + } + } + }, + "processes" : { + "constraints_process_list" : [{ + "python_module" : "apply_noslip_process", + "kratos_module" : "KratosMultiphysics.FluidDynamicsApplication", + "Parameters" : { + "model_part_name" : "FluidModelPart.NoSlip3D_No_Slip_Auto1" + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.TEMPERATURE_Parts_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : false, + "value" : 298.0, + "interval" : [0.0,0.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.HeatFlux3D_Thermal_face_conditions_Auto3", + "variable_name" : "FACE_HEAT_FLUX", + "constrained" : false, + "value" : 1000000.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "assign_scalar_variable_process", + "kratos_module" : "KratosMultiphysics", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ImposedTemperature3D_Imposed_temperature_Auto1", + "variable_name" : "TEMPERATURE", + "constrained" : true, + "value" : 298.0, + "interval" : [0.0,1000.0] + } + },{ + "python_module" : "apply_thermal_face_process", + "kratos_module" : "KratosMultiphysics.ConvectionDiffusionApplication", + "Parameters" : { + "model_part_name" : "ThermalModelPart.ThermalFace3D_Thermal_face_conditions_Auto3", + "ambient_temperature" : 273.15, + "add_ambient_radiation" : true, + "emissivity" : 0.9, + "add_ambient_convection" : true, + "convection_coefficient" : 4.0, + "interval" : [0.0,100.0] + } + }] + } +} diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.mdpa b/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.mdpa new file mode 100644 index 000000000000..ce1e03bf8fa3 --- /dev/null +++ b/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.mdpa @@ -0,0 +1,8542 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties + +Begin Properties 1 + DENSITY 900.0 + DYNAMIC_VISCOSITY 1000000.0 + EMISSIVITY 1.0 + AMBIENT_TEMPERATURE 298.0 + CONVECTION_COEFFICIENT 0.0 +End Properties + + + +Begin Nodes + 1 0.0000000000 1.0000000000 1.0000000000 + 2 0.1428571429 1.0000000000 1.0000000000 + 3 0.0000000000 1.0000000000 0.8571428571 + 4 0.0000000000 0.8571428571 1.0000000000 + 5 0.0918312382 0.8977829983 0.9081687618 + 6 0.0000000000 0.7857142857 0.8700961894 + 7 0.1299038106 1.0000000000 0.7857142857 + 8 0.1299038106 0.7857142857 1.0000000000 + 9 0.0000000000 0.8796728280 0.7610710800 + 10 0.2402664764 1.0000000000 0.8792005708 + 11 0.2402664764 0.8792005708 1.0000000000 + 12 0.2857142857 1.0000000000 1.0000000000 + 13 0.0000000000 1.0000000000 0.7142857143 + 14 0.0000000000 0.7142857143 1.0000000000 + 15 0.1608404886 0.8216039701 0.8321262122 + 16 0.1118033989 0.9165896725 0.7060713124 + 17 0.1202269179 0.6951396157 0.8654024038 + 18 0.0000000000 0.7432260441 0.7462161530 + 19 0.2544826993 0.7431520015 1.0000000000 + 20 0.3148384622 0.8881966011 0.8294925583 + 21 0.1423525250 1.0000000000 0.6508229884 + 22 0.3571428571 1.0000000000 0.8700961894 + 23 0.0000000000 0.8700961894 0.6428571429 + 24 0.0000000000 0.6428571429 0.8700961894 + 25 0.1299038106 0.6428571429 1.0000000000 + 26 0.3571428571 0.8700961894 1.0000000000 + 27 0.2857142857 1.0000000000 0.7401923789 + 28 0.1302490828 0.7314095989 0.7337435852 + 29 0.3625443322 0.8112247873 0.9247177002 + 30 0.2434367607 0.7148639933 0.8090084010 + 31 0.2414803888 0.8068748947 0.7076172444 + 32 0.4285714286 1.0000000000 1.0000000000 + 33 0.0000000000 1.0000000000 0.5714285714 + 34 0.0000000000 0.5714285714 1.0000000000 + 35 0.2641065112 0.8978450333 0.6681982371 + 36 0.1483675190 0.8630817082 0.6024168980 + 37 0.1118033989 0.9133974596 0.5714285714 + 38 0.2244831600 0.6125960305 0.8980703166 + 39 0.0986597483 0.5609629943 0.8821801112 + 40 0.4308006892 0.8881966011 0.8275820146 + 41 0.3332474118 0.6641866373 0.9329203997 + 42 0.0401521754 0.8040192414 0.5591250126 + 43 0.1684346856 0.6060048352 0.7733100479 + 44 0.0000000000 0.5781163534 0.7425536650 + 45 0.2574463350 0.5781163534 1.0000000000 + 46 0.1610578152 0.7435501318 0.6042723356 + 47 0.3814272016 0.9083694779 0.6894370587 + 48 0.3581023656 0.6948379371 0.8246441040 + 49 0.4352592105 1.0000000000 0.7425536650 + 50 0.0000000000 0.7028994652 0.5906226515 + 51 0.2096362978 0.9279945446 0.5450819545 + 52 0.4122329062 0.7029274666 1.0000000000 + 53 0.3085932432 1.0000000000 0.5933169800 + 54 0.4161788811 0.8174378438 0.7580960863 + 55 0.4526992579 0.7771013607 0.8936484006 + 56 0.5000000000 0.8700961894 1.0000000000 + 57 0.1299038106 1.0000000000 0.5000000000 + 58 0.0000000000 0.5000000000 0.8700961894 + 59 0.0000000000 0.8700961894 0.5000000000 + 60 0.5000000000 1.0000000000 0.8700961894 + 61 0.1299038106 0.5000000000 1.0000000000 + 62 0.2411867682 0.6730460025 0.6786389522 + 63 0.1164769303 0.6254429644 0.6481199892 + 64 0.2971185674 0.5496574680 0.8867533212 + 65 0.3705302124 0.6960105757 0.7172770396 + 66 0.1826058134 0.4751246223 0.9100737663 + 67 0.3035928210 0.5860928846 0.7640476159 + 68 0.3366682592 0.8985449485 0.5572756393 + 69 0.5714285714 1.0000000000 1.0000000000 + 70 0.0000000000 1.0000000000 0.4285714286 + 71 0.0000000000 0.4285714286 1.0000000000 + 72 0.1497434089 0.8262454996 0.4712203478 + 73 0.0957430913 0.5067544878 0.7131826776 + 74 0.0983897244 0.4588541658 0.8033269031 + 75 0.4757598692 0.7206713031 0.8074380590 + 76 0.4079909077 0.8035934732 0.6254467266 + 77 0.5575928444 0.9153315388 0.8086200022 + 78 0.3320454923 0.7214490877 0.5883514470 + 79 0.0798581784 0.8923881345 0.4161402244 + 80 0.5643883815 0.8234712246 0.8880606516 + 81 0.4679285218 1.0000000000 0.6140426985 + 82 0.2204831733 0.5382529359 0.6663024076 + 83 0.2852453101 0.8423036320 0.4826820730 + 84 0.0653321511 0.6804437154 0.4804014154 + 85 0.2316596541 0.4715444765 0.7853615010 + 86 0.4627745622 0.6040705565 0.9052835634 + 87 0.5283775967 0.8489553622 0.7133767894 + 88 0.5647407895 0.7425536650 1.0000000000 + 89 0.0785421295 0.3862224345 0.9174520853 + 90 0.2296883572 0.7290888606 0.4862186241 + 91 0.0000000000 0.5053947920 0.6114854020 + 92 0.0000000000 0.7425536650 0.4218836466 + 93 0.4289820831 0.5298954759 1.0000000000 + 94 0.3417404894 0.5922563802 0.6326826027 + 95 0.4727503219 0.9095655802 0.5677741092 + 96 0.2801902718 1.0000000000 0.4151972535 + 97 0.2150289585 0.9162287681 0.3912778159 + 98 0.0000000000 0.8700961894 0.3571428571 + 99 0.0000000000 0.3571428571 0.8700961894 + 100 0.1299038106 0.3571428571 1.0000000000 + 101 0.6428571429 0.8700961894 1.0000000000 + 102 0.1299038106 1.0000000000 0.3571428571 + 103 0.6428571429 1.0000000000 0.8700961894 + 104 0.2914511191 0.4279991273 0.8638797512 + 105 0.0000000000 0.4141502988 0.7031170417 + 106 0.5320714782 0.6140426985 1.0000000000 + 107 0.5877670938 1.0000000000 0.7029274666 + 108 0.1200341110 0.5076287569 0.5784266684 + 109 0.2971005348 0.4093773485 1.0000000000 + 110 0.4195639639 1.0000000000 0.4863943903 + 111 0.5736782513 0.6745739495 0.9235859254 + 112 0.2416075575 0.5999099981 0.5225143091 + 113 0.0983144447 0.5657881727 0.4965974642 + 114 0.0000000000 0.5710179169 0.4701045241 + 115 0.0949008109 0.7395780955 0.3760872381 + 116 0.4178395941 0.8118495555 0.4891204985 + 117 0.1854030710 0.3595557819 0.8363352453 + 118 0.5291681909 0.6957499291 0.6838400158 + 119 0.4420613958 0.5552795535 0.7182304254 + 120 0.4126368344 0.4741770081 0.8245627926 + 121 0.3360242209 0.4713554646 0.6967161319 + 122 0.6118571829 0.7514445299 0.7639650247 + 123 0.1682869744 0.6334362955 0.4242253341 + 124 0.6637659248 0.8573121501 0.8149971816 + 125 0.2326126656 0.7818563400 0.3716598697 + 126 0.5637855365 0.6171607713 0.7904954594 + 127 0.7142857143 1.0000000000 1.0000000000 + 128 0.0000000000 1.0000000000 0.2857142857 + 129 0.0000000000 0.2857142857 1.0000000000 + 130 0.5290522900 0.7847941242 0.5642852502 + 131 0.0848490054 0.8881966011 0.2924900097 + 132 0.1547442855 0.3540941482 0.7152087626 + 133 0.2260905078 0.4020271996 0.6536096319 + 134 0.7142857143 0.9133974596 0.8881966011 + 135 0.4674360458 0.6228528396 0.5877996019 + 136 0.0660067933 0.6154879006 0.3835611728 + 137 0.6599837487 0.8935345708 0.6991894201 + 138 0.6912854347 0.7720352465 0.8892763932 + 139 0.5103162719 0.4746445208 0.9205237686 + 140 0.1118033989 0.2916994270 0.8307742275 + 141 0.3388478806 0.8673469938 0.3591928247 + 142 0.2952391016 0.4818169692 0.5664198126 + 143 0.5710179169 1.0000000000 0.5298954759 + 144 0.3820689833 0.7613750639 0.4127521058 + 145 0.6078926684 0.8949480383 0.5842929967 + 146 0.4030052426 0.3787088081 0.9064756846 + 147 0.1640952756 0.4646445118 0.4976538405 + 148 0.1248289012 0.3765766192 0.5928197359 + 149 0.6332281519 0.7792309039 0.6529782053 + 150 0.0000000000 0.4195639639 0.5136056097 + 151 0.0000000000 0.2790265038 0.7425536650 + 152 0.6174516033 0.5564014450 0.9008506022 + 153 0.5431049532 0.4962652552 0.7893466127 + 154 0.0000000000 0.2389289200 0.8796728280 + 155 0.1203271720 0.2389289200 1.0000000000 + 156 0.5804360361 0.4863943903 1.0000000000 + 157 0.1246432057 1.0000000000 0.2346128863 + 158 0.4281860325 0.4920329401 0.5975766228 + 159 0.7381390670 0.7473058372 1.0000000000 + 160 0.2533860264 1.0000000000 0.2606072627 + 161 0.3758757013 0.3478506371 0.7866119419 + 162 0.0000000000 0.7455173007 0.2568479985 + 163 0.4946052080 0.3885145980 1.0000000000 + 164 0.2567739559 0.2537838470 1.0000000000 + 165 0.4024001403 0.5673366526 0.4750353905 + 166 0.1622587241 0.5464078430 0.3730192933 + 167 0.3149904891 0.2789262430 0.9171839663 + 168 0.3086689264 0.6119479922 0.3832700661 + 169 0.5053947920 1.0000000000 0.3885145980 + 170 0.6909237277 0.6482489745 0.8307372778 + 171 0.7505012691 1.0000000000 0.7381680330 + 172 0.4750966725 0.6972212996 0.4382510052 + 173 0.7857142857 0.8700961894 1.0000000000 + 174 0.7857142857 1.0000000000 0.8700961894 + 175 0.0000000000 0.8700961894 0.2142857143 + 176 0.4624406108 0.4201889250 0.7089995167 + 177 0.3514095478 0.7297719478 0.3340668111 + 178 0.6914067568 0.5933169800 1.0000000000 + 179 0.6582665059 0.6522965320 0.6978195472 + 180 0.2779867090 0.5035133640 0.4323242686 + 181 0.1506199474 0.6475560752 0.2926383499 + 182 0.2263332095 0.2542990165 0.7785937620 + 183 0.6056893971 0.6716438577 0.5728742449 + 184 0.2049414743 0.7347652737 0.2607479809 + 185 0.4338662279 0.6460207443 0.4120361941 + 186 0.0000000000 0.4679285218 0.3859573015 + 187 0.4734934183 0.9213897714 0.3416049778 + 188 0.1856086811 0.2122473683 0.9049671110 + 189 0.0000000000 0.5877670938 0.2970725334 + 190 0.2058304721 0.9049671110 0.2162095446 + 191 0.4141502988 1.0000000000 0.2968829583 + 192 0.5524344721 0.5069788144 0.6531549106 + 193 0.7582585398 0.8573978346 0.7133046360 + 194 0.2544120991 0.6459854226 0.3003366254 + 195 0.0000000000 0.2801902718 0.5848027465 + 196 0.7992908635 0.7941056277 0.8881966011 + 197 0.0882717643 0.8087571834 0.1910566375 + 198 0.7629675743 0.7639630524 0.7495646413 + 199 0.2401548315 0.2734783307 0.6514261273 + 200 0.8184548252 0.9062641435 0.8245217490 + 201 0.6580926537 0.7858628135 0.5184874129 + 202 0.3899068740 0.5962844614 0.3705241786 + 203 0.1240643770 0.2217603840 0.6951650193 + 204 0.7370900264 0.8552337130 0.6062204917 + 205 0.5733718032 0.7075399539 0.4447452563 + 206 0.2680201506 0.3766962800 0.4830005741 + 207 0.7425536650 1.0000000000 0.5781163534 + 208 0.4218836466 0.2574463350 1.0000000000 + 209 0.5663474479 0.8600848434 0.3757621146 + 210 0.3631126111 0.3495756490 0.5777206388 + 211 0.8571428571 1.0000000000 1.0000000000 + 212 0.0000000000 1.0000000000 0.1428571429 + 213 0.0000000000 0.1428571429 1.0000000000 + 214 0.5334119498 0.3368159105 0.8870709588 + 215 0.3899337148 0.4387871753 0.4773616238 + 216 0.4651991484 0.7630905101 0.3149144033 + 217 0.1389028238 0.3327328617 0.4709207741 + 218 0.4993311016 0.5710559125 0.4319793980 + 219 0.7328344454 0.5967099407 0.7511673921 + 220 0.7021554142 0.9114654714 0.4863557254 + 221 0.0571090190 0.4090181672 0.3568832999 + 222 0.6196206372 0.3944527186 0.8628832923 + 223 0.1932189164 0.4130285371 0.3742132116 + 224 0.6732876247 0.5071029905 0.7175327023 + 225 0.3424231519 0.2090554015 0.7972486544 + 226 0.0984275637 0.9265545962 0.1221654702 + 227 0.1089777116 0.6803657167 0.1795864989 + 228 0.4785461946 0.2602078500 0.8934349987 + 229 0.7374143074 0.6973568063 0.6027284979 + 230 0.2663848754 0.5212958027 0.2968967135 + 231 0.0833873539 0.5555634987 0.2297876512 + 232 0.1443979439 0.1404717281 0.7968285055 + 233 0.0000000000 0.1299038106 0.7857142857 + 234 0.2142857143 0.1299038106 1.0000000000 + 235 0.2142857143 1.0000000000 0.1299038106 + 236 0.6015557307 0.3895544685 0.7349210011 + 237 0.4083628975 0.8603664097 0.2130235245 + 238 0.8259966467 0.7053733146 0.7841148252 + 239 0.8153521368 0.6348165111 0.8565635035 + 240 0.8740192379 1.0000000000 0.7649148565 + 241 0.8740192379 0.7649148565 1.0000000000 + 242 0.1019286424 0.1045153339 0.9058246626 + 243 0.4051802292 0.6473592335 0.2699846546 + 244 0.5312064098 0.3842970885 0.5961587397 + 245 0.4109775955 0.5142997548 0.3498344785 + 246 0.5970492987 0.5736404988 0.4608794307 + 247 0.0000000000 0.3085932432 0.4066830200 + 248 0.0000000000 0.7597335236 0.1207994292 + 249 0.9006446193 0.8776837457 0.9263611454 + 250 0.5189817150 0.4799725700 0.4573522613 + 251 0.5128207032 0.8825169652 0.2516695133 + 252 0.5858497012 0.2968829583 1.0000000000 + 253 0.7134653334 0.5840279930 0.6046691755 + 254 0.2122879818 0.5902908712 0.2084632057 + 255 0.7028994652 1.0000000000 0.4093773485 + 256 0.4974089063 0.5441452940 0.3710596662 + 257 0.2966223492 0.8213145692 0.1424875243 + 258 0.2832192827 0.2552220495 0.5269877177 + 259 0.7198097282 0.4151972535 1.0000000000 + 260 0.7925318502 0.6424344930 0.6752601582 + 261 0.5084323535 0.6349987124 0.3118909049 + 262 0.1591775161 0.1902149014 0.5703995675 + 263 0.2574220686 0.1264792590 0.8007984464 + 264 0.1414811963 0.4572234497 0.2553859875 + 265 0.0000000000 0.4352592105 0.2574463350 + 266 0.3010620513 0.6885122027 0.1735098857 + 267 0.2706029869 0.9277920737 0.1081791955 + 268 0.5200118318 0.2889756007 0.6839674543 + 269 0.7804359159 0.5024872208 0.8609994101 + 270 0.3287209267 0.3975145845 0.3620381087 + 271 0.6997072897 0.6633497872 0.4736682384 + 272 0.5687082086 0.2561130512 0.9324802593 + 273 0.2943745398 0.1118033989 0.9164322534 + 274 0.8881966011 0.9164322534 0.7056254602 + 275 0.0000000000 0.1299038106 0.6428571429 + 276 0.3571428571 1.0000000000 0.1299038106 + 277 0.0000000000 0.6428571429 0.1299038106 + 278 0.8700961894 0.6428571429 1.0000000000 + 279 0.3571428571 0.1299038106 1.0000000000 + 280 0.8700961894 1.0000000000 0.6428571429 + 281 0.1810232132 0.8245758961 0.0938613819 + 282 0.5758001119 0.7459362140 0.3007238740 + 283 0.5781163534 1.0000000000 0.2574463350 + 284 0.7186037175 0.8977932075 0.3936212074 + 285 0.6817585737 0.7661910170 0.3850597820 + 286 0.9088772695 0.8074112153 0.8090959939 + 287 0.4039105443 0.7773066524 0.1702833700 + 288 0.4939531800 0.3546266382 0.5064640707 + 289 0.6577146182 0.4364455278 0.6012786510 + 290 0.6363886613 0.2986307000 0.8730275839 + 291 0.9013988681 0.7070556827 0.8725843347 + 292 0.3940217778 0.1405878164 0.8558807498 + 293 0.6850910304 0.3332136618 0.9561387544 + 294 0.8689857661 0.7447453223 0.6757170759 + 295 0.1118033989 0.0866025404 0.7142857143 + 296 0.3797966787 0.3051518304 0.4492754654 + 297 0.8326073373 0.9113015541 0.5210676136 + 298 0.3469590538 0.5591755481 0.2140065840 + 299 0.4685509906 0.1859564102 0.7629093756 + 300 0.1118033989 0.7056254602 0.0835677466 + 301 0.3040356524 0.1567058801 0.6190180408 + 302 0.4880843385 0.7265004696 0.1973885227 + 303 0.5922080045 0.2311441758 0.8527370916 + 304 0.1968038414 0.0977127553 0.6640884781 + 305 0.6451325779 0.6388575469 0.3504950331 + 306 0.4231337062 0.1790077432 0.6594407524 + 307 0.2472399409 0.2875162580 0.3653677135 + 308 0.6621397462 0.8498565702 0.2784522075 + 309 0.4642806981 0.3842727850 0.3761158921 + 310 0.4066196862 0.8975320181 0.1003029371 + 311 0.4630038792 0.2363622307 0.5571228021 + 312 0.6172916484 0.2581980228 0.7462873239 + 313 0.7590800951 0.3684652807 0.8428754672 + 314 0.0000000000 0.0000000000 1.0000000000 + 315 0.0000000000 1.0000000000 0.0000000000 + 316 1.0000000000 1.0000000000 1.0000000000 + 317 0.1326201078 0.3037999851 0.2924614044 + 318 0.0000000000 0.5000000000 0.1299038106 + 319 0.0000000000 0.1299038106 0.5000000000 + 320 0.8700961894 0.5000000000 1.0000000000 + 321 0.5000000000 1.0000000000 0.1299038106 + 322 0.8700961894 1.0000000000 0.5000000000 + 323 0.5000000000 0.1299038106 1.0000000000 + 324 0.2376416141 0.1873354832 0.4582162634 + 325 0.2468211141 0.3697422278 0.2558817100 + 326 0.7983181020 0.4463925404 0.7373753203 + 327 0.7443884476 0.5021471867 0.5332896758 + 328 0.1428571429 0.0000000000 1.0000000000 + 329 0.0000000000 0.0000000000 0.8571428571 + 330 0.1428571429 1.0000000000 0.0000000000 + 331 1.0000000000 1.0000000000 0.8571428571 + 332 0.0000000000 0.8571428571 0.0000000000 + 333 1.0000000000 0.8571428571 1.0000000000 + 334 0.6116719747 0.2926927649 0.6127266417 + 335 0.3723071459 0.0894922104 0.7508510762 + 336 0.8545452726 0.6390648610 0.5785242361 + 337 0.3482277766 0.7754299424 0.0686769988 + 338 0.9074020863 0.6431290356 0.6988578098 + 339 0.3673186209 0.4313693917 0.2350987079 + 340 0.0907819701 0.0720916742 0.5813060987 + 341 0.8451578033 0.5413242304 0.6505192122 + 342 0.8329741319 0.7470603444 0.4612461137 + 343 0.2575449412 0.4694501611 0.1626449758 + 344 0.1526375824 0.5314296278 0.1001711000 + 345 0.6212937377 0.3552415996 0.4972140485 + 346 1.0000000000 0.7857142857 0.8700961894 + 347 0.2142857143 0.8700961894 0.0000000000 + 348 0.1299038106 0.0000000000 0.7857142857 + 349 0.4988546850 0.5152073116 0.2388461922 + 350 0.9017055166 0.5367643820 0.7949630459 + 351 0.1246432057 0.7653871137 0.0000000000 + 352 0.7209734962 0.2574463350 1.0000000000 + 353 0.1152846814 0.1258652893 0.4577827840 + 354 1.0000000000 0.8792005708 0.7597335236 + 355 0.2402664764 0.0000000000 0.8792005708 + 356 0.2790228551 0.5829529553 0.0891207990 + 357 0.2857142857 0.0000000000 1.0000000000 + 358 1.0000000000 1.0000000000 0.7142857143 + 359 1.0000000000 0.7142857143 1.0000000000 + 360 0.0000000000 0.0000000000 0.7142857143 + 361 0.2857142857 1.0000000000 0.0000000000 + 362 0.0000000000 0.7142857143 0.0000000000 + 363 0.4912634559 0.8276383189 0.0955786189 + 364 0.8041160820 0.9254167870 0.3375521024 + 365 0.5847916710 0.4440869215 0.3354604904 + 366 0.7332642628 0.5495466815 0.4053148603 + 367 0.4055016857 0.6331523070 0.1043893772 + 368 0.6274048324 0.9140246909 0.1625818576 + 369 0.0000000000 0.2618609330 0.2526941628 + 370 0.5978677424 0.1453629298 0.8619161247 + 371 0.7626800273 0.3320336612 0.7180383769 + 372 0.5937503536 0.3589457801 0.4128058158 + 373 0.6124345428 0.7783001227 0.1728157206 + 374 0.5989165635 0.6469302810 0.2089989888 + 375 0.7432260441 1.0000000000 0.2537838470 + 376 0.6845086822 0.2044666743 0.8961963550 + 377 0.7855105566 0.8163448941 0.3173878686 + 378 0.7776937327 0.6713922074 0.3614041997 + 379 0.0866025404 0.4285714286 0.1118033989 + 380 0.7033498019 0.7209439446 0.2576372019 + 381 0.2181731911 0.0730605477 0.5311011969 + 382 0.2487998785 0.7382420757 0.0000000000 + 383 1.0000000000 0.7431520015 0.7455173007 + 384 0.1648158382 0.1805999720 0.3424547234 + 385 0.5861923233 0.2541489328 0.5185541941 + 386 0.8389177377 0.6104076051 0.4676230200 + 387 0.1423525250 0.0000000000 0.6508229884 + 388 0.3571428571 0.0000000000 0.8700961894 + 389 1.0000000000 0.8700961894 0.6428571429 + 390 0.1299038106 0.6428571429 0.0000000000 + 391 1.0000000000 0.6428571429 0.8700961894 + 392 0.3571428571 0.8700961894 0.0000000000 + 393 0.3552772555 0.2901669398 0.2813000101 + 394 0.2857142857 0.0000000000 0.7401923789 + 395 0.8863619126 0.4186821327 0.8385207364 + 396 0.5020866704 0.2572469887 0.4105419673 + 397 0.4128222942 0.1169969405 0.5499121223 + 398 0.8723687080 0.8289469964 0.3979679815 + 399 0.5159073379 0.0942850657 0.7408303988 + 400 0.7067139547 0.4180159613 0.4321050682 + 401 0.8163583072 0.3976037392 0.6351276134 + 402 0.5463563693 0.1553633041 0.6046035772 + 403 0.0000000000 0.1299038106 0.3571428571 + 404 0.0000000000 0.3571428571 0.1299038106 + 405 0.6428571429 1.0000000000 0.1299038106 + 406 0.8700961894 1.0000000000 0.3571428571 + 407 0.6428571429 0.1299038106 1.0000000000 + 408 0.8700961894 0.3571428571 1.0000000000 + 409 0.5714285714 0.0866025404 0.8881966011 + 410 0.3959314882 0.1716909197 0.4232398516 + 411 0.4285714286 0.0000000000 1.0000000000 + 412 0.0000000000 0.0000000000 0.5714285714 + 413 0.4285714286 1.0000000000 0.0000000000 + 414 1.0000000000 1.0000000000 0.5714285714 + 415 0.0000000000 0.5714285714 0.0000000000 + 416 1.0000000000 0.5714285714 1.0000000000 + 417 0.9263878407 0.9049671110 0.4285714286 + 418 0.5047641834 0.5809661432 0.1247801815 + 419 0.1643255429 0.3174425177 0.1599887728 + 420 0.7624189129 0.2349400895 0.8140295238 + 421 0.4707987357 0.3934828841 0.2138829257 + 422 0.8823165614 0.5076188401 0.5595731619 + 423 0.3362954051 0.0925937057 0.4646512487 + 424 0.2197272608 0.4285714286 0.0776464423 + 425 0.6865978541 0.2059391318 0.6430842091 + 426 0.3646452810 0.4588228894 0.1028323339 + 427 0.6107458184 0.1064645092 0.7482703712 + 428 0.2142588570 0.2150117661 0.2408713813 + 429 0.6161510675 0.4928408186 0.2229047974 + 430 0.2574463350 0.5781163534 0.0000000000 + 431 1.0000000000 0.5781163534 0.7425536650 + 432 0.8486623384 0.3198713625 0.7515725523 + 433 0.7590379555 0.3295947106 0.5294508690 + 434 0.7376860679 0.5765061112 0.2711519964 + 435 0.4352592105 0.0000000000 0.7425536650 + 436 0.4093773485 0.7028994652 0.0000000000 + 437 1.0000000000 0.7029274666 0.5877670938 + 438 0.5317245845 0.6518843345 0.0753482600 + 439 0.3085932432 0.0000000000 0.5933169800 + 440 0.8643946392 0.2916323905 0.8846246654 + 441 0.8025974428 0.8900792666 0.2214302051 + 442 1.0000000000 0.8700961894 0.5000000000 + 443 0.1299038106 0.0000000000 0.5000000000 + 444 0.1299038106 0.5000000000 0.0000000000 + 445 1.0000000000 0.5000000000 0.8700961894 + 446 0.5000000000 0.8700961894 0.0000000000 + 447 0.5000000000 0.0000000000 0.8700961894 + 448 0.5629394113 0.5394954849 0.1408910361 + 449 0.5461252983 0.3123504018 0.2931783742 + 450 0.2936118042 0.1396483763 0.3271459266 + 451 0.1118033989 0.2007091365 0.2058943723 + 452 0.2215550991 0.0672930010 0.3943340739 + 453 0.7073525712 0.9147051424 0.1118033989 + 454 0.0848490054 0.1118033989 0.2924900097 + 455 0.8352882579 0.4643273308 0.4381505397 + 456 0.0866025404 0.2857142857 0.1118033989 + 457 0.4737142310 0.5591484059 0.0575041756 + 458 0.6898194484 0.1254330646 0.7405604935 + 459 0.5335285841 0.1376889880 0.4694256705 + 460 0.5068368426 0.4787743480 0.1149793985 + 461 0.6986501423 0.2815194385 0.4423245248 + 462 0.9096156500 0.9049671110 0.3034108131 + 463 0.5714285714 0.0000000000 1.0000000000 + 464 1.0000000000 1.0000000000 0.4285714286 + 465 1.0000000000 0.4285714286 1.0000000000 + 466 0.0000000000 0.0000000000 0.4285714286 + 467 0.5714285714 1.0000000000 0.0000000000 + 468 0.0000000000 0.4285714286 0.0000000000 + 469 0.2975237889 0.2985242184 0.1350543951 + 470 0.9137918863 0.6779451662 0.3749816129 + 471 0.0000000000 0.1259807621 0.2350851435 + 472 0.7060713124 0.0834103275 0.8881966011 + 473 0.8796728280 1.0000000000 0.2389289200 + 474 0.7610710800 0.1203271720 1.0000000000 + 475 0.8539609310 0.5594366787 0.3414282554 + 476 0.7722276377 0.4522984169 0.3172424606 + 477 0.6909209670 0.6826871555 0.1140956926 + 478 0.4679285218 0.0000000000 0.6140426985 + 479 0.6067736003 0.2390689477 0.3506860715 + 480 0.6899621484 0.3432824284 0.3202098307 + 481 0.7857142857 1.0000000000 0.1299038106 + 482 0.0000000000 0.2142857143 0.1299038106 + 483 0.8700961894 0.2142857143 1.0000000000 + 484 1.0000000000 0.7425536650 0.4352592105 + 485 0.6355287616 0.0793068216 0.6213893816 + 486 0.3885145980 0.5053947920 0.0000000000 + 487 0.9126226845 0.3275104492 0.6646444956 + 488 0.7531075685 0.1975019910 0.5669170830 + 489 0.8293682459 0.1613970716 0.9079098599 + 490 0.6577745322 0.1377232982 0.5269838428 + 491 0.5781163534 0.7425536650 0.0000000000 + 492 1.0000000000 0.5298954759 0.5710179169 + 493 0.8580470752 0.6621070150 0.2509184965 + 494 0.5044974959 0.1857589299 0.2944278806 + 495 0.2801902718 0.0000000000 0.4151972535 + 496 0.7277281278 0.5504419719 0.1646977452 + 497 1.0000000000 0.3571428571 0.8700961894 + 498 0.1299038106 0.3571428571 0.0000000000 + 499 1.0000000000 0.8700961894 0.3571428571 + 500 0.6428571429 0.8700961894 0.0000000000 + 501 0.1299038106 0.0000000000 0.3571428571 + 502 0.6428571429 0.0000000000 0.8700961894 + 503 0.2968829583 0.4141502988 0.0000000000 + 504 1.0000000000 0.6140426985 0.4679285218 + 505 0.8436883566 0.2623643961 0.5789982525 + 506 0.5877670938 0.0000000000 0.7029274666 + 507 0.1926225362 0.1167497299 0.2144466855 + 508 1.0000000000 0.4093773485 0.7028994652 + 509 0.9166783358 0.3754802490 0.5434377472 + 510 0.4195639639 0.0000000000 0.4863943903 + 511 0.2090512855 0.2070675614 0.1194348452 + 512 0.4886627049 0.2618067491 0.1819717756 + 513 0.7910596930 0.8034115976 0.1118033989 + 514 0.4025467239 0.0679743059 0.3497566185 + 515 0.5933042105 0.3494889839 0.1717616720 + 516 0.5298954759 0.5710179169 0.0000000000 + 517 0.8093886077 0.3401793439 0.3865635056 + 518 0.8128372784 0.1603813244 0.6800094812 + 519 0.7032551756 0.4156573491 0.2048486710 + 520 0.8881966011 0.7941056277 0.2007091365 + 521 0.8034115976 0.1118033989 0.7910596930 + 522 0.8881966011 0.1959095995 0.7912417929 + 523 0.3203812693 0.1584712994 0.1820334376 + 524 0.0824110185 0.1124878906 0.1669249207 + 525 0.4890081970 0.3567063477 0.0833338902 + 526 0.7142857143 0.0000000000 1.0000000000 + 527 1.0000000000 1.0000000000 0.2857142857 + 528 1.0000000000 0.2857142857 1.0000000000 + 529 0.0000000000 0.0000000000 0.2857142857 + 530 0.7142857143 1.0000000000 0.0000000000 + 531 0.0000000000 0.2857142857 0.0000000000 + 532 0.4092623695 0.1462540614 0.2092047263 + 533 0.6860721974 0.1508013948 0.4165753259 + 534 0.5710179169 0.0000000000 0.5298954759 + 535 0.6684200288 0.4423296829 0.1075659661 + 536 0.7739746194 0.6418033684 0.0851291945 + 537 0.7556714954 0.0674329032 0.6441247927 + 538 0.4863943903 0.4195639639 0.0000000000 + 539 0.3331984407 0.0659522273 0.2266505226 + 540 0.9302773492 0.3618011874 0.4436554082 + 541 1.0000000000 0.4863943903 0.4195639639 + 542 0.7649148565 0.8740192379 0.0000000000 + 543 0.1246432057 0.0000000000 0.2346128863 + 544 0.7381680330 0.7505012691 0.0000000000 + 545 1.0000000000 0.7473058372 0.2618609330 + 546 0.7195488763 0.2242700064 0.2999001763 + 547 0.2533860264 0.0000000000 0.2606072627 + 548 0.8287404904 0.2408816236 0.4062296914 + 549 1.0000000000 0.3885145980 0.5053947920 + 550 0.9357203312 0.2058388124 0.6629715181 + 551 0.2606072627 0.2533860264 0.0000000000 + 552 0.5053947920 0.0000000000 0.3885145980 + 553 0.9027395461 0.4108993965 0.3156002036 + 554 0.7505012691 0.0000000000 0.7381680330 + 555 1.0000000000 0.2487998785 0.7382420757 + 556 0.1299038106 0.2142857143 0.0000000000 + 557 1.0000000000 0.2142857143 0.8700961894 + 558 0.7857142857 0.0000000000 0.8700961894 + 559 1.0000000000 0.8700961894 0.2142857143 + 560 0.6233136772 0.2131799834 0.2076398895 + 561 0.8768899949 0.9022821017 0.0726213811 + 562 0.8453220784 0.4608810330 0.2017791220 + 563 1.0000000000 0.5933169800 0.3085932432 + 564 0.9340782375 0.5729295009 0.2276749749 + 565 0.6202521884 0.1152160379 0.3025265270 + 566 0.6140426985 0.4679285218 0.0000000000 + 567 0.7029274666 0.5877670938 0.0000000000 + 568 0.4141502988 0.0000000000 0.2968829583 + 569 0.8610749644 0.1265441373 0.5799225560 + 570 0.8169312078 0.3185976075 0.2560693152 + 571 0.2733196479 0.1064669247 0.0980360066 + 572 0.4151972535 0.2801902718 0.0000000000 + 573 0.1235352417 0.0995451620 0.0662844770 + 574 0.8737480045 0.1998281870 0.4557545900 + 575 0.9036347417 0.0691230399 0.8422688190 + 576 0.8881966011 0.7073525712 0.0852948576 + 577 0.8881966011 0.0848490054 0.7075099903 + 578 0.7425536650 0.0000000000 0.5781163534 + 579 1.0000000000 0.2574463350 0.5781163534 + 580 0.8571428571 0.0000000000 1.0000000000 + 581 1.0000000000 1.0000000000 0.1428571429 + 582 1.0000000000 0.1428571429 1.0000000000 + 583 0.0000000000 0.0000000000 0.1428571429 + 584 0.8571428571 1.0000000000 0.0000000000 + 585 0.0000000000 0.1428571429 0.0000000000 + 586 0.7945863909 0.4876388217 0.0774418200 + 587 0.5866593537 0.2410457687 0.0886884953 + 588 0.8925621662 0.2839718675 0.3276610655 + 589 0.6901663350 0.2852715344 0.1186914084 + 590 0.8916214175 0.5759313597 0.0999372130 + 591 0.8700961894 0.7857142857 0.0000000000 + 592 0.2142857143 0.0000000000 0.1299038106 + 593 0.5604683023 0.1134109320 0.1598502358 + 594 0.4285714286 0.1118033989 0.0866025404 + 595 0.8080257238 0.0819525889 0.4405949847 + 596 1.0000000000 0.7649148565 0.1259807621 + 597 0.8740192379 0.0000000000 0.7649148565 + 598 1.0000000000 0.1246432057 0.7653871137 + 599 0.2346128863 0.1246432057 0.0000000000 + 600 0.5933169800 0.3085932432 0.0000000000 + 601 1.0000000000 0.2968829583 0.4141502988 + 602 0.7028994652 0.0000000000 0.4093773485 + 603 1.0000000000 0.4151972535 0.2801902718 + 604 0.8651164213 0.2249503531 0.2815158422 + 605 0.8196398569 0.3583036636 0.1147862940 + 606 0.7425536650 0.4352592105 0.0000000000 + 607 0.3571428571 0.1299038106 0.0000000000 + 608 0.3571428571 0.0000000000 0.1299038106 + 609 1.0000000000 0.6428571429 0.1299038106 + 610 1.0000000000 0.1299038106 0.6428571429 + 611 0.8700961894 0.6428571429 0.0000000000 + 612 0.8700961894 0.0000000000 0.6428571429 + 613 0.5781163534 0.0000000000 0.2574463350 + 614 0.7661463877 0.0810222879 0.3257376068 + 615 0.7052499282 0.1143362578 0.2099741560 + 616 0.6646381774 0.1617522176 0.1228599815 + 617 0.9311848082 0.3544918128 0.1941155706 + 618 0.9568906009 0.1955350755 0.3913367986 + 619 0.8691472708 0.1366130489 0.3348942898 + 620 0.8785773717 0.2625015694 0.1804773350 + 621 0.9236946706 0.4440107826 0.0907702424 + 622 0.0000000000 0.0000000000 0.0000000000 + 623 1.0000000000 0.0000000000 1.0000000000 + 624 1.0000000000 1.0000000000 0.0000000000 + 625 0.5000000000 0.1299038106 0.0000000000 + 626 1.0000000000 0.1299038106 0.5000000000 + 627 1.0000000000 0.5000000000 0.1299038106 + 628 0.5000000000 0.0000000000 0.1299038106 + 629 0.8700961894 0.0000000000 0.5000000000 + 630 0.8700961894 0.5000000000 0.0000000000 + 631 0.1428571429 0.0000000000 0.0000000000 + 632 1.0000000000 0.0000000000 0.8571428571 + 633 1.0000000000 0.8571428571 0.0000000000 + 634 0.9430500179 0.0832301418 0.4372418225 + 635 1.0000000000 0.2574463350 0.2790265038 + 636 0.2857142857 0.0000000000 0.0000000000 + 637 1.0000000000 0.0000000000 0.7142857143 + 638 1.0000000000 0.7142857143 0.0000000000 + 639 0.8027737366 0.1977844742 0.1039073982 + 640 0.8324403947 0.1130819648 0.2122473683 + 641 0.7473058372 0.2618609330 0.0000000000 + 642 0.7432260441 0.0000000000 0.2537838470 + 643 0.7121236295 0.0909193384 0.1114085988 + 644 0.6428571429 0.1299038106 0.0000000000 + 645 0.8700961894 0.3571428571 0.0000000000 + 646 0.8700961894 0.0000000000 0.3571428571 + 647 0.6428571429 0.0000000000 0.1299038106 + 648 1.0000000000 0.1299038106 0.3571428571 + 649 1.0000000000 0.3571428571 0.1299038106 + 650 0.9187747007 0.1754071846 0.1898600241 + 651 0.4285714286 0.0000000000 0.0000000000 + 652 1.0000000000 0.0000000000 0.5714285714 + 653 1.0000000000 0.5714285714 0.0000000000 + 654 0.9293994114 0.2744055413 0.0576340671 + 655 1.0000000000 0.0000000000 0.4285714286 + 656 0.5714285714 0.0000000000 0.0000000000 + 657 1.0000000000 0.4285714286 0.0000000000 + 658 0.7649148565 0.1259807621 0.0000000000 + 659 0.8796728280 0.0000000000 0.2389289200 + 660 1.0000000000 0.1203271720 0.2389289200 + 661 0.8700961894 0.2142857143 0.0000000000 + 662 0.7857142857 0.0000000000 0.1299038106 + 663 1.0000000000 0.2142857143 0.1299038106 + 664 0.8664618417 0.1012225834 0.0937238553 + 665 1.0000000000 0.0000000000 0.2857142857 + 666 0.7142857143 0.0000000000 0.0000000000 + 667 1.0000000000 0.2857142857 0.0000000000 + 668 0.8571428571 0.0000000000 0.0000000000 + 669 1.0000000000 0.0000000000 0.1428571429 + 670 1.0000000000 0.1428571429 0.0000000000 + 671 1.0000000000 0.0000000000 0.0000000000 +End Nodes + + +Begin Elements Element3D4N// GUI group identifier: Parts Auto1 + 1 1 10 22 12 11 + 2 1 277 362 248 300 + 3 1 248 277 300 162 + 4 1 389 354 358 274 + 5 1 389 354 274 383 + 6 1 355 357 388 273 + 7 1 388 355 273 394 + 8 1 26 11 12 22 + 9 1 407 474 526 472 + 10 1 407 474 472 352 + 11 1 648 660 665 659 + 12 1 99 129 154 155 + 13 1 646 665 659 648 + 14 1 23 13 9 16 + 15 1 9 23 16 18 + 16 1 100 155 129 99 + 17 1 406 473 527 462 + 18 1 406 473 462 375 + 19 1 355 357 273 234 + 20 1 362 248 300 351 + 21 1 300 362 351 390 + 22 1 351 300 390 382 + 23 1 300 362 390 277 + 24 1 351 300 382 281 + 25 1 351 300 281 248 + 26 1 382 351 281 347 + 27 1 351 281 347 332 + 28 1 281 382 347 392 + 29 1 13 9 16 7 + 30 1 354 358 274 240 + 31 1 358 274 240 280 + 32 1 274 240 280 171 + 33 1 274 240 171 200 + 34 1 274 240 200 354 + 35 1 358 274 280 389 + 36 1 240 171 200 174 + 37 1 200 240 174 331 + 38 1 171 200 174 103 + 39 1 474 526 472 558 + 40 1 473 527 462 559 + 41 1 544 591 542 513 + 42 1 542 544 513 500 + 43 1 554 558 597 521 + 44 1 597 554 521 612 + 45 1 555 598 557 522 + 46 1 555 598 522 610 + 47 1 526 472 558 502 + 48 1 472 558 502 554 + 49 1 526 472 502 407 + 50 1 527 462 559 499 + 51 1 462 559 499 545 + 52 1 527 462 499 406 + 53 1 16 13 7 21 + 54 1 7 16 21 27 + 55 1 16 13 21 23 + 56 1 357 273 234 279 + 57 1 273 234 279 164 + 58 1 357 273 279 388 + 59 1 543 529 501 454 + 60 1 501 543 454 547 + 61 1 599 636 607 571 + 62 1 607 599 571 551 + 63 1 551 556 599 511 + 64 1 599 551 511 571 + 65 1 160 157 235 190 + 66 1 160 157 190 102 + 67 1 157 102 128 131 + 68 1 157 102 131 190 + 69 1 598 610 637 577 + 70 1 598 610 577 522 + 71 1 547 592 543 507 + 72 1 543 547 507 454 + 73 1 658 661 641 639 + 74 1 661 641 639 645 + 75 1 471 482 369 451 + 76 1 482 369 451 404 + 77 1 596 545 559 520 + 78 1 545 559 520 462 + 79 1 559 520 462 473 + 80 1 241 159 173 196 + 81 1 159 173 196 101 + 82 1 403 529 471 454 + 83 1 471 403 454 369 + 84 1 529 471 454 543 + 85 1 403 529 454 501 + 86 1 542 530 500 453 + 87 1 500 542 453 513 + 88 1 609 596 638 576 + 89 1 609 596 576 520 + 90 1 577 598 522 575 + 91 1 577 598 575 637 + 92 1 542 453 513 481 + 93 1 278 241 359 291 + 94 1 278 241 291 196 + 95 1 597 637 612 577 + 96 1 612 597 577 521 + 97 1 597 577 521 575 + 98 1 597 577 575 637 + 99 1 521 597 575 558 + 100 1 577 521 575 522 + 101 1 521 575 522 489 + 102 1 577 521 522 518 + 103 1 522 521 489 420 + 104 1 521 522 518 420 + 105 1 597 575 558 632 + 106 1 597 575 632 637 + 107 1 521 575 489 558 + 108 1 577 521 518 612 + 109 1 637 612 577 610 + 110 1 521 489 420 472 + 111 1 518 521 420 458 + 112 1 518 521 458 554 + 113 1 521 420 458 472 + 114 1 489 522 420 440 + 115 1 522 420 440 432 + 116 1 522 420 432 518 + 117 1 644 666 658 643 + 118 1 658 644 643 639 + 119 1 128 157 131 175 + 120 1 131 128 175 98 + 121 1 175 131 98 162 + 122 1 131 128 98 102 + 123 1 599 636 571 592 + 124 1 636 571 592 608 + 125 1 571 592 608 547 + 126 1 636 571 608 607 + 127 1 598 522 575 557 + 128 1 489 522 440 557 + 129 1 575 522 489 557 + 130 1 131 157 190 175 + 131 1 507 543 454 524 + 132 1 543 454 524 471 + 133 1 454 524 471 451 + 134 1 471 454 451 369 + 135 1 524 471 451 482 + 136 1 524 471 482 583 + 137 1 524 471 583 543 + 138 1 454 524 451 507 + 139 1 524 451 507 511 + 140 1 451 507 511 428 + 141 1 451 507 428 454 + 142 1 451 524 482 556 + 143 1 507 511 428 571 + 144 1 511 451 428 419 + 145 1 451 428 419 317 + 146 1 451 428 317 454 + 147 1 511 451 419 556 + 148 1 507 511 571 592 + 149 1 571 507 592 547 + 150 1 511 599 571 592 + 151 1 596 638 576 591 + 152 1 638 576 591 611 + 153 1 576 591 611 544 + 154 1 638 576 611 609 + 155 1 440 522 432 555 + 156 1 557 555 522 440 + 157 1 241 359 291 346 + 158 1 359 291 346 391 + 159 1 291 346 391 383 + 160 1 359 291 391 278 + 161 1 666 658 643 662 + 162 1 643 666 662 647 + 163 1 662 643 647 642 + 164 1 643 666 647 644 + 165 1 542 530 453 481 + 166 1 530 453 481 405 + 167 1 453 481 405 375 + 168 1 530 453 405 500 + 169 1 419 451 317 369 + 170 1 544 591 513 576 + 171 1 591 513 576 520 + 172 1 507 543 524 592 + 173 1 554 558 521 472 + 174 1 558 521 472 489 + 175 1 428 511 419 469 + 176 1 551 556 511 419 + 177 1 428 419 317 325 + 178 1 420 440 432 313 + 179 1 432 420 313 371 + 180 1 432 420 371 518 + 181 1 235 160 190 276 + 182 1 317 428 325 307 + 183 1 317 428 307 384 + 184 1 317 428 384 454 + 185 1 420 489 440 352 + 186 1 419 428 469 325 + 187 1 428 511 469 523 + 188 1 428 511 523 571 + 189 1 511 523 571 551 + 190 1 420 440 313 352 + 191 1 591 542 513 561 + 192 1 542 513 561 481 + 193 1 596 545 520 609 + 194 1 428 325 307 393 + 195 1 428 325 393 469 + 196 1 511 419 469 551 + 197 1 641 658 639 644 + 198 1 511 469 523 551 + 199 1 583 524 543 592 + 200 1 241 159 196 278 + 201 1 428 307 384 450 + 202 1 420 313 371 290 + 203 1 420 313 290 352 + 204 1 371 420 290 458 + 205 1 469 428 523 393 + 206 1 522 577 518 550 + 207 1 518 522 550 432 + 208 1 577 518 550 569 + 209 1 577 518 569 612 + 210 1 569 577 612 610 + 211 1 518 550 569 505 + 212 1 518 550 505 432 + 213 1 569 518 505 488 + 214 1 569 518 488 537 + 215 1 569 518 537 612 + 216 1 518 505 488 371 + 217 1 518 488 537 458 + 218 1 488 569 537 578 + 219 1 569 537 578 612 + 220 1 537 578 612 554 + 221 1 537 578 554 506 + 222 1 612 537 554 518 + 223 1 325 307 393 270 + 224 1 325 307 270 223 + 225 1 325 307 223 317 + 226 1 658 661 639 664 + 227 1 661 639 664 663 + 228 1 384 428 450 547 + 229 1 440 432 313 395 + 230 1 432 313 395 326 + 231 1 313 440 395 408 + 232 1 440 432 395 497 + 233 1 432 313 326 371 + 234 1 395 432 326 508 + 235 1 270 325 223 230 + 236 1 270 325 230 339 + 237 1 325 223 230 264 + 238 1 325 223 264 317 + 239 1 325 230 339 343 + 240 1 325 230 343 264 + 241 1 230 339 343 298 + 242 1 343 230 298 254 + 243 1 343 230 254 264 + 244 1 298 343 254 356 + 245 1 298 343 356 426 + 246 1 298 343 426 339 + 247 1 343 254 356 344 + 248 1 343 254 344 264 + 249 1 230 339 298 245 + 250 1 339 298 245 349 + 251 1 339 298 349 426 + 252 1 254 356 344 300 + 253 1 230 339 245 270 + 254 1 270 325 339 393 + 255 1 223 270 230 180 + 256 1 270 230 180 245 + 257 1 223 270 180 206 + 258 1 223 270 206 307 + 259 1 230 223 180 166 + 260 1 180 223 206 147 + 261 1 223 180 166 147 + 262 1 230 223 166 264 + 263 1 270 180 206 215 + 264 1 270 180 215 245 + 265 1 206 270 215 296 + 266 1 206 270 296 307 + 267 1 180 206 215 142 + 268 1 215 206 296 210 + 269 1 180 206 142 147 + 270 1 206 215 142 210 + 271 1 270 215 296 309 + 272 1 270 215 309 245 + 273 1 296 270 309 393 + 274 1 215 296 309 288 + 275 1 309 215 288 250 + 276 1 309 215 250 245 + 277 1 215 296 288 210 + 278 1 296 309 288 396 + 279 1 309 288 396 372 + 280 1 296 309 396 393 + 281 1 396 309 372 449 + 282 1 309 372 449 365 + 283 1 309 372 365 250 + 284 1 288 296 396 311 + 285 1 296 396 311 410 + 286 1 296 396 410 393 + 287 1 288 296 311 210 + 288 1 309 288 372 250 + 289 1 396 309 449 393 + 290 1 215 180 142 165 + 291 1 215 180 165 245 + 292 1 180 142 165 112 + 293 1 180 142 112 147 + 294 1 165 180 112 168 + 295 1 165 180 168 245 + 296 1 180 112 168 166 + 297 1 142 215 165 158 + 298 1 215 165 158 250 + 299 1 142 215 158 210 + 300 1 165 142 158 94 + 301 1 158 165 94 135 + 302 1 158 165 135 250 + 303 1 165 142 94 112 + 304 1 142 158 94 121 + 305 1 142 158 121 210 + 306 1 158 94 121 119 + 307 1 158 94 119 135 + 308 1 121 158 119 176 + 309 1 121 158 176 210 + 310 1 158 119 176 192 + 311 1 158 119 192 135 + 312 1 119 176 192 153 + 313 1 119 176 153 120 + 314 1 176 192 153 236 + 315 1 119 176 120 121 + 316 1 176 192 236 244 + 317 1 176 192 244 158 + 318 1 192 236 244 289 + 319 1 192 236 289 224 + 320 1 192 236 224 153 + 321 1 236 244 289 334 + 322 1 244 289 334 345 + 323 1 244 289 345 250 + 324 1 236 244 334 268 + 325 1 289 334 345 433 + 326 1 289 334 433 371 + 327 1 236 244 268 176 + 328 1 244 334 268 311 + 329 1 94 142 121 82 + 330 1 142 121 82 133 + 331 1 94 142 82 112 + 332 1 82 142 133 147 + 333 1 121 94 82 67 + 334 1 82 121 67 85 + 335 1 82 121 85 133 + 336 1 121 94 67 119 + 337 1 94 82 67 62 + 338 1 82 67 62 43 + 339 1 82 67 43 85 + 340 1 94 82 62 112 + 341 1 62 82 43 63 + 342 1 62 82 63 112 + 343 1 82 43 63 73 + 344 1 82 43 73 85 + 345 1 43 62 63 28 + 346 1 43 63 73 44 + 347 1 62 63 28 46 + 348 1 62 63 46 112 + 349 1 63 28 46 50 + 350 1 43 62 28 30 + 351 1 62 28 30 31 + 352 1 62 28 31 46 + 353 1 43 62 30 67 + 354 1 28 43 30 17 + 355 1 30 28 17 15 + 356 1 30 28 15 31 + 357 1 28 43 17 44 + 358 1 43 30 17 38 + 359 1 43 30 38 67 + 360 1 30 17 38 19 + 361 1 142 121 133 210 + 362 1 244 192 289 250 + 363 1 67 94 62 65 + 364 1 62 67 65 30 + 365 1 94 62 65 78 + 366 1 67 94 65 119 + 367 1 62 65 78 31 + 368 1 94 62 78 112 + 369 1 65 94 78 135 + 370 1 17 30 15 19 + 371 1 298 230 245 168 + 372 1 396 288 311 385 + 373 1 396 288 385 372 + 374 1 311 396 385 459 + 375 1 311 396 459 410 + 376 1 288 311 385 244 + 377 1 385 288 244 345 + 378 1 288 244 345 250 + 379 1 385 288 345 372 + 380 1 345 385 372 461 + 381 1 372 345 461 400 + 382 1 372 345 400 250 + 383 1 288 345 372 250 + 384 1 345 385 461 334 + 385 1 345 385 334 244 + 386 1 345 461 400 433 + 387 1 345 461 433 334 + 388 1 461 372 400 480 + 389 1 372 400 480 365 + 390 1 461 372 480 479 + 391 1 461 372 479 385 + 392 1 400 345 433 289 + 393 1 372 480 479 449 + 394 1 479 372 449 396 + 395 1 449 479 396 494 + 396 1 449 479 494 560 + 397 1 449 479 560 480 + 398 1 479 396 494 459 + 399 1 479 372 396 385 + 400 1 479 494 560 565 + 401 1 479 494 565 459 + 402 1 560 479 565 546 + 403 1 560 479 546 480 + 404 1 494 449 560 512 + 405 1 449 560 512 515 + 406 1 449 560 515 480 + 407 1 494 449 512 393 + 408 1 479 565 546 533 + 409 1 479 565 533 459 + 410 1 396 449 494 393 + 411 1 546 479 533 461 + 412 1 479 533 461 385 + 413 1 512 449 515 421 + 414 1 288 244 250 158 + 415 1 512 449 421 393 + 416 1 449 515 421 365 + 417 1 565 560 546 615 + 418 1 560 546 615 639 + 419 1 560 512 515 587 + 420 1 494 560 565 593 + 421 1 565 494 593 613 + 422 1 593 565 613 615 + 423 1 515 560 587 589 + 424 1 515 560 589 480 + 425 1 560 512 587 593 + 426 1 560 494 512 593 + 427 1 565 560 615 593 + 428 1 400 461 480 517 + 429 1 480 400 517 476 + 430 1 480 400 476 365 + 431 1 560 587 589 616 + 432 1 565 546 533 614 + 433 1 533 565 614 602 + 434 1 614 533 602 595 + 435 1 602 614 595 646 + 436 1 614 595 646 619 + 437 1 614 595 619 533 + 438 1 595 646 619 634 + 439 1 595 646 634 629 + 440 1 634 595 629 569 + 441 1 595 646 629 602 + 442 1 619 595 634 574 + 443 1 619 595 574 533 + 444 1 646 634 629 655 + 445 1 634 629 655 652 + 446 1 646 634 655 648 + 447 1 634 655 648 626 + 448 1 634 655 626 652 + 449 1 648 634 626 574 + 450 1 634 626 574 569 + 451 1 595 634 574 569 + 452 1 587 515 589 600 + 453 1 480 461 479 546 + 454 1 546 533 614 619 + 455 1 560 587 616 593 + 456 1 546 565 615 614 + 457 1 517 480 476 570 + 458 1 480 476 570 519 + 459 1 480 476 519 365 + 460 1 517 480 570 546 + 461 1 515 512 421 525 + 462 1 512 421 525 469 + 463 1 634 619 574 648 + 464 1 634 619 648 646 + 465 1 400 517 476 455 + 466 1 476 400 455 366 + 467 1 400 517 455 433 + 468 1 476 400 366 365 + 469 1 589 560 616 639 + 470 1 616 589 639 644 + 471 1 512 515 587 525 + 472 1 455 476 366 475 + 473 1 476 366 475 434 + 474 1 476 366 434 365 + 475 1 476 517 570 553 + 476 1 517 570 553 588 + 477 1 517 570 588 546 + 478 1 385 311 459 402 + 479 1 311 459 402 397 + 480 1 311 459 397 410 + 481 1 385 311 402 334 + 482 1 476 517 553 455 + 483 1 587 589 616 644 + 484 1 455 476 475 553 + 485 1 570 476 553 562 + 486 1 570 476 562 519 + 487 1 553 570 562 617 + 488 1 570 562 617 605 + 489 1 570 562 605 519 + 490 1 476 553 562 475 + 491 1 562 617 605 621 + 492 1 605 562 621 586 + 493 1 605 562 586 519 + 494 1 562 617 621 627 + 495 1 617 605 621 649 + 496 1 621 617 649 627 + 497 1 649 621 627 657 + 498 1 621 627 657 653 + 499 1 649 621 657 645 + 500 1 621 657 645 630 + 501 1 621 657 630 653 + 502 1 645 621 630 586 + 503 1 621 630 586 590 + 504 1 630 586 590 611 + 505 1 621 630 590 653 + 506 1 590 630 611 653 + 507 1 586 621 590 562 + 508 1 617 649 627 603 + 509 1 617 649 603 635 + 510 1 553 570 617 588 + 511 1 562 553 617 603 + 512 1 553 617 603 588 + 513 1 396 385 459 479 + 514 1 366 475 434 378 + 515 1 434 366 378 305 + 516 1 366 475 378 386 + 517 1 366 475 386 455 + 518 1 366 378 305 271 + 519 1 366 378 271 386 + 520 1 475 378 386 470 + 521 1 475 378 470 493 + 522 1 475 378 493 434 + 523 1 378 305 271 285 + 524 1 378 386 470 342 + 525 1 386 470 342 504 + 526 1 305 271 285 205 + 527 1 305 271 205 246 + 528 1 305 271 246 366 + 529 1 271 285 205 201 + 530 1 271 285 201 342 + 531 1 205 271 201 183 + 532 1 205 271 183 246 + 533 1 271 201 183 229 + 534 1 271 201 229 342 + 535 1 201 183 229 149 + 536 1 201 183 149 130 + 537 1 201 183 130 205 + 538 1 183 229 149 179 + 539 1 183 229 179 253 + 540 1 183 229 253 271 + 541 1 149 183 179 118 + 542 1 179 149 118 122 + 543 1 179 149 122 198 + 544 1 179 149 198 229 + 545 1 149 183 118 130 + 546 1 378 386 342 271 + 547 1 378 305 285 380 + 548 1 378 305 380 434 + 549 1 305 285 380 282 + 550 1 285 380 282 308 + 551 1 285 380 308 377 + 552 1 285 380 377 378 + 553 1 380 282 308 373 + 554 1 380 282 373 374 + 555 1 380 282 374 305 + 556 1 282 308 373 251 + 557 1 308 373 251 368 + 558 1 308 373 368 453 + 559 1 373 368 453 500 + 560 1 368 453 500 405 + 561 1 368 453 405 375 + 562 1 282 308 251 209 + 563 1 308 251 209 283 + 564 1 282 308 209 285 + 565 1 305 285 282 205 + 566 1 282 373 374 302 + 567 1 374 282 302 261 + 568 1 282 373 302 251 + 569 1 373 374 302 438 + 570 1 373 374 438 477 + 571 1 373 374 477 380 + 572 1 302 373 438 363 + 573 1 302 373 363 251 + 574 1 373 438 363 491 + 575 1 438 363 491 436 + 576 1 374 282 261 305 + 577 1 374 302 438 418 + 578 1 374 302 418 261 + 579 1 438 374 418 448 + 580 1 302 438 418 436 + 581 1 374 418 448 349 + 582 1 374 438 477 448 + 583 1 418 438 448 516 + 584 1 434 366 305 365 + 585 1 386 475 470 504 + 586 1 149 201 130 145 + 587 1 149 201 145 204 + 588 1 201 130 145 209 + 589 1 201 145 204 220 + 590 1 201 145 220 209 + 591 1 204 201 220 342 + 592 1 130 149 145 87 + 593 1 130 149 87 118 + 594 1 145 130 87 95 + 595 1 145 130 95 209 + 596 1 130 87 95 76 + 597 1 87 95 76 47 + 598 1 87 95 47 81 + 599 1 95 47 81 53 + 600 1 87 95 81 145 + 601 1 130 87 76 118 + 602 1 149 145 87 137 + 603 1 149 145 137 204 + 604 1 145 87 137 107 + 605 1 145 204 220 207 + 606 1 95 130 76 116 + 607 1 95 130 116 209 + 608 1 130 76 116 135 + 609 1 76 95 116 68 + 610 1 76 95 68 47 + 611 1 95 116 68 110 + 612 1 116 76 68 78 + 613 1 149 201 204 229 + 614 1 87 149 137 122 + 615 1 271 378 285 342 + 616 1 380 308 377 513 + 617 1 621 605 586 645 + 618 1 621 605 645 649 + 619 1 205 305 246 261 + 620 1 165 94 135 78 + 621 1 617 570 605 620 + 622 1 617 570 620 588 + 623 1 570 605 620 589 + 624 1 605 617 620 649 + 625 1 378 470 493 377 + 626 1 251 282 209 216 + 627 1 251 282 216 302 + 628 1 209 251 216 187 + 629 1 209 251 187 283 + 630 1 216 209 187 116 + 631 1 282 209 216 205 + 632 1 251 216 187 237 + 633 1 251 216 237 302 + 634 1 216 187 237 141 + 635 1 237 216 141 177 + 636 1 237 216 177 302 + 637 1 216 187 141 116 + 638 1 187 251 237 191 + 639 1 237 187 191 141 + 640 1 187 191 141 110 + 641 1 216 141 177 144 + 642 1 216 141 144 116 + 643 1 141 177 144 125 + 644 1 144 141 125 83 + 645 1 144 141 83 116 + 646 1 83 144 116 78 + 647 1 125 144 83 90 + 648 1 125 144 90 168 + 649 1 144 90 168 165 + 650 1 144 83 90 78 + 651 1 141 177 125 190 + 652 1 177 216 144 261 + 653 1 177 144 125 168 + 654 1 141 125 83 97 + 655 1 141 125 97 190 + 656 1 125 83 97 72 + 657 1 125 83 72 90 + 658 1 97 125 72 131 + 659 1 83 141 97 96 + 660 1 141 97 96 160 + 661 1 83 97 72 57 + 662 1 141 237 177 190 + 663 1 223 206 147 217 + 664 1 223 206 217 307 + 665 1 147 223 217 186 + 666 1 206 147 217 133 + 667 1 118 179 122 126 + 668 1 118 179 126 192 + 669 1 179 122 126 170 + 670 1 179 122 170 198 + 671 1 122 126 170 111 + 672 1 170 122 111 138 + 673 1 122 118 126 75 + 674 1 122 126 111 75 + 675 1 122 118 75 87 + 676 1 170 122 138 198 + 677 1 111 170 138 178 + 678 1 126 170 111 152 + 679 1 170 111 152 178 + 680 1 126 170 152 224 + 681 1 111 126 152 86 + 682 1 111 126 86 75 + 683 1 126 152 86 153 + 684 1 126 152 153 224 + 685 1 152 111 86 106 + 686 1 111 86 106 52 + 687 1 86 152 106 156 + 688 1 152 106 156 178 + 689 1 156 152 178 259 + 690 1 126 179 170 224 + 691 1 118 126 75 119 + 692 1 122 111 138 80 + 693 1 122 111 80 75 + 694 1 138 122 80 124 + 695 1 138 122 124 198 + 696 1 122 80 124 87 + 697 1 111 138 80 88 + 698 1 80 111 88 55 + 699 1 111 88 55 52 + 700 1 88 55 52 56 + 701 1 80 111 55 75 + 702 1 111 55 75 86 + 703 1 88 80 55 56 + 704 1 80 138 124 101 + 705 1 289 236 334 371 + 706 1 236 334 371 268 + 707 1 215 288 250 158 + 708 1 553 517 588 601 + 709 1 282 302 261 216 + 710 1 372 449 365 480 + 711 1 173 241 196 249 + 712 1 196 173 249 200 + 713 1 249 196 200 286 + 714 1 196 200 286 198 + 715 1 200 249 286 354 + 716 1 249 196 286 291 + 717 1 196 286 291 238 + 718 1 286 291 238 383 + 719 1 196 286 238 198 + 720 1 343 356 426 503 + 721 1 373 251 368 363 + 722 1 428 307 450 393 + 723 1 179 183 253 192 + 724 1 176 153 120 214 + 725 1 120 176 214 161 + 726 1 176 214 161 268 + 727 1 176 153 214 236 + 728 1 120 176 161 121 + 729 1 153 120 214 139 + 730 1 153 120 139 86 + 731 1 120 214 139 146 + 732 1 214 153 139 222 + 733 1 153 139 222 152 + 734 1 214 153 222 236 + 735 1 214 139 146 163 + 736 1 139 146 163 93 + 737 1 163 139 93 156 + 738 1 163 139 156 222 + 739 1 139 93 156 86 + 740 1 139 93 86 120 + 741 1 139 156 222 152 + 742 1 139 156 152 86 + 743 1 152 139 86 153 + 744 1 214 120 161 146 + 745 1 139 120 146 93 + 746 1 139 214 222 163 + 747 1 206 296 210 258 + 748 1 206 296 258 307 + 749 1 210 206 258 133 + 750 1 296 210 258 311 + 751 1 30 62 31 65 + 752 1 550 569 505 579 + 753 1 311 296 410 258 + 754 1 339 325 343 469 + 755 1 76 87 47 54 + 756 1 76 87 54 118 + 757 1 87 47 54 49 + 758 1 47 76 54 31 + 759 1 63 82 73 108 + 760 1 63 82 108 112 + 761 1 82 73 108 133 + 762 1 73 63 108 91 + 763 1 108 73 91 105 + 764 1 73 91 105 44 + 765 1 313 395 326 269 + 766 1 313 395 269 408 + 767 1 326 313 269 224 + 768 1 395 326 269 350 + 769 1 269 395 350 320 + 770 1 326 269 350 219 + 771 1 326 269 219 224 + 772 1 219 326 224 253 + 773 1 269 350 219 239 + 774 1 269 350 239 320 + 775 1 219 269 239 170 + 776 1 239 219 170 238 + 777 1 170 239 238 196 + 778 1 239 219 238 350 + 779 1 239 238 196 291 + 780 1 239 238 291 350 + 781 1 395 326 350 508 + 782 1 350 326 219 341 + 783 1 326 219 341 253 + 784 1 350 326 341 508 + 785 1 219 350 341 238 + 786 1 236 289 224 371 + 787 1 245 339 349 309 + 788 1 459 402 397 534 + 789 1 570 480 519 589 + 790 1 470 378 342 377 + 791 1 559 596 520 561 + 792 1 475 476 434 562 + 793 1 307 393 270 296 + 794 1 438 302 363 436 + 795 1 229 179 253 219 + 796 1 192 119 153 126 + 797 1 254 298 356 266 + 798 1 298 356 266 367 + 799 1 356 254 266 300 + 800 1 356 266 367 382 + 801 1 254 298 266 194 + 802 1 298 266 194 243 + 803 1 298 266 243 367 + 804 1 254 298 194 230 + 805 1 266 194 243 177 + 806 1 194 243 177 168 + 807 1 266 194 177 184 + 808 1 194 177 184 125 + 809 1 243 266 177 302 + 810 1 177 194 168 125 + 811 1 177 184 125 190 + 812 1 177 266 184 257 + 813 1 177 243 302 216 + 814 1 177 266 257 287 + 815 1 184 177 257 190 + 816 1 177 266 287 302 + 817 1 257 184 190 281 + 818 1 190 257 281 267 + 819 1 190 257 267 237 + 820 1 257 281 267 392 + 821 1 281 190 267 235 + 822 1 190 267 235 276 + 823 1 267 235 276 361 + 824 1 267 235 361 347 + 825 1 276 267 361 392 + 826 1 257 177 287 237 + 827 1 177 287 237 302 + 828 1 287 257 237 310 + 829 1 237 287 310 363 + 830 1 287 237 302 363 + 831 1 302 287 363 436 + 832 1 257 237 310 267 + 833 1 310 257 267 392 + 834 1 267 310 392 276 + 835 1 267 310 276 237 + 836 1 257 177 237 190 + 837 1 287 257 310 337 + 838 1 310 287 337 363 + 839 1 266 194 184 254 + 840 1 310 392 276 413 + 841 1 266 257 287 337 + 842 1 287 266 337 367 + 843 1 177 243 216 261 + 844 1 266 184 257 281 + 845 1 298 356 367 426 + 846 1 194 298 243 168 + 847 1 17 43 38 39 + 848 1 17 43 39 44 + 849 1 43 38 39 85 + 850 1 38 17 39 25 + 851 1 313 371 290 222 + 852 1 121 67 85 120 + 853 1 400 455 366 327 + 854 1 400 455 327 433 + 855 1 366 400 327 246 + 856 1 455 366 327 386 + 857 1 298 245 349 243 + 858 1 438 373 477 491 + 859 1 356 343 344 503 + 860 1 149 122 198 137 + 861 1 112 165 168 90 + 862 1 168 112 90 123 + 863 1 112 90 123 46 + 864 1 90 168 123 125 + 865 1 168 112 123 166 + 866 1 123 168 166 194 + 867 1 459 385 402 490 + 868 1 459 385 490 533 + 869 1 402 459 490 534 + 870 1 385 402 490 334 + 871 1 419 317 325 264 + 872 1 449 309 365 421 + 873 1 183 179 118 192 + 874 1 421 515 525 460 + 875 1 421 515 460 365 + 876 1 525 421 460 426 + 877 1 515 525 460 566 + 878 1 251 308 368 283 + 879 1 307 384 450 324 + 880 1 450 307 324 296 + 881 1 384 450 324 452 + 882 1 384 450 452 547 + 883 1 307 384 324 217 + 884 1 324 384 452 353 + 885 1 324 384 353 217 + 886 1 452 324 353 381 + 887 1 452 324 381 423 + 888 1 452 324 423 450 + 889 1 324 353 381 262 + 890 1 353 381 262 340 + 891 1 324 381 423 258 + 892 1 381 262 340 304 + 893 1 381 262 304 301 + 894 1 381 262 301 258 + 895 1 262 301 258 199 + 896 1 301 258 199 210 + 897 1 262 301 199 304 + 898 1 304 381 301 439 + 899 1 262 340 304 275 + 900 1 353 381 340 443 + 901 1 381 340 443 387 + 902 1 340 443 387 412 + 903 1 340 443 412 319 + 904 1 340 353 443 319 + 905 1 353 381 443 452 + 906 1 387 340 412 275 + 907 1 340 412 275 319 + 908 1 340 353 319 262 + 909 1 275 340 319 262 + 910 1 381 340 387 304 + 911 1 340 387 304 275 + 912 1 387 381 304 439 + 913 1 381 443 452 495 + 914 1 452 381 495 423 + 915 1 495 452 423 450 + 916 1 381 495 423 439 + 917 1 324 353 262 217 + 918 1 384 452 353 454 + 919 1 381 324 262 258 + 920 1 324 262 258 217 + 921 1 149 118 122 87 + 922 1 153 119 120 86 + 923 1 180 230 166 168 + 924 1 285 205 201 209 + 925 1 307 317 384 217 + 926 1 308 380 373 513 + 927 1 63 43 28 44 + 928 1 28 17 15 6 + 929 1 505 569 488 574 + 930 1 308 285 377 284 + 931 1 308 285 284 209 + 932 1 285 377 284 342 + 933 1 377 308 284 375 + 934 1 402 311 397 306 + 935 1 311 397 306 301 + 936 1 402 311 306 268 + 937 1 397 402 306 478 + 938 1 470 475 493 563 + 939 1 289 192 224 253 + 940 1 495 452 450 547 + 941 1 495 452 547 501 + 942 1 495 452 501 443 + 943 1 400 461 517 433 + 944 1 99 154 151 140 + 945 1 99 154 140 155 + 946 1 152 111 106 178 + 947 1 461 480 517 546 + 948 1 648 635 660 619 + 949 1 55 80 75 54 + 950 1 658 661 664 668 + 951 1 556 599 511 573 + 952 1 599 511 573 592 + 953 1 266 257 337 281 + 954 1 591 542 561 584 + 955 1 173 241 249 333 + 956 1 112 123 166 113 + 957 1 123 166 113 136 + 958 1 123 166 136 181 + 959 1 123 166 181 194 + 960 1 113 123 136 84 + 961 1 113 123 84 112 + 962 1 136 123 181 115 + 963 1 123 136 84 115 + 964 1 84 123 115 72 + 965 1 136 84 115 92 + 966 1 84 115 92 72 + 967 1 136 84 92 114 + 968 1 115 136 92 162 + 969 1 136 84 114 113 + 970 1 114 136 113 186 + 971 1 84 114 113 50 + 972 1 123 181 115 125 + 973 1 114 136 186 189 + 974 1 114 136 189 92 + 975 1 136 186 189 166 + 976 1 166 136 181 189 + 977 1 136 181 189 162 + 978 1 181 136 115 162 + 979 1 166 113 136 186 + 980 1 477 438 491 567 + 981 1 157 235 190 226 + 982 1 190 157 226 175 + 983 1 144 216 116 172 + 984 1 116 144 172 78 + 985 1 144 216 172 261 + 986 1 550 577 569 610 + 987 1 550 577 610 522 + 988 1 569 550 610 579 + 989 1 550 610 579 555 + 990 1 550 610 555 522 + 991 1 555 550 522 432 + 992 1 579 550 555 487 + 993 1 550 555 487 432 + 994 1 579 550 487 505 + 995 1 550 487 505 432 + 996 1 639 658 664 643 + 997 1 10 27 22 20 + 998 1 22 10 20 11 + 999 1 511 556 573 524 + 1000 1 241 196 249 291 + 1001 1 235 190 226 281 + 1002 1 190 226 281 197 + 1003 1 281 190 197 184 + 1004 1 226 281 197 248 + 1005 1 190 226 197 175 + 1006 1 226 197 175 248 + 1007 1 197 175 248 162 + 1008 1 197 175 162 131 + 1009 1 197 175 131 190 + 1010 1 248 197 162 300 + 1011 1 248 197 300 281 + 1012 1 131 197 190 184 + 1013 1 537 488 578 485 + 1014 1 578 537 485 506 + 1015 1 537 488 485 458 + 1016 1 157 235 226 212 + 1017 1 18 9 6 16 + 1018 1 513 591 561 520 + 1019 1 438 448 516 567 + 1020 1 375 481 473 441 + 1021 1 375 481 441 453 + 1022 1 481 441 453 513 + 1023 1 441 453 513 308 + 1024 1 473 375 441 462 + 1025 1 441 473 462 520 + 1026 1 462 441 520 377 + 1027 1 441 520 377 513 + 1028 1 441 520 513 561 + 1029 1 556 599 573 631 + 1030 1 75 55 54 48 + 1031 1 75 55 48 86 + 1032 1 54 75 48 65 + 1033 1 75 48 65 119 + 1034 1 48 54 65 31 + 1035 1 54 75 65 118 + 1036 1 642 659 662 640 + 1037 1 662 642 640 643 + 1038 1 640 662 643 664 + 1039 1 642 659 640 614 + 1040 1 640 642 614 615 + 1041 1 640 642 615 643 + 1042 1 615 640 643 639 + 1043 1 643 615 639 616 + 1044 1 643 615 616 593 + 1045 1 639 643 616 644 + 1046 1 643 616 644 593 + 1047 1 615 639 616 560 + 1048 1 616 615 560 593 + 1049 1 615 640 639 546 + 1050 1 615 640 546 614 + 1051 1 642 614 615 565 + 1052 1 642 615 643 647 + 1053 1 615 643 647 593 + 1054 1 642 659 614 646 + 1055 1 614 642 646 602 + 1056 1 614 642 602 565 + 1057 1 164 234 155 188 + 1058 1 164 234 188 273 + 1059 1 234 188 273 355 + 1060 1 155 164 188 100 + 1061 1 290 313 222 293 + 1062 1 222 290 293 252 + 1063 1 290 313 293 352 + 1064 1 111 55 86 52 + 1065 1 55 86 52 48 + 1066 1 573 511 524 507 + 1067 1 524 573 507 592 + 1068 1 113 114 186 150 + 1069 1 73 91 44 63 + 1070 1 123 168 194 125 + 1071 1 137 145 107 207 + 1072 1 383 346 354 286 + 1073 1 383 346 286 291 + 1074 1 346 286 291 249 + 1075 1 346 354 286 249 + 1076 1 354 383 286 274 + 1077 1 286 354 274 200 + 1078 1 267 235 347 281 + 1079 1 347 267 281 392 + 1080 1 626 634 652 569 + 1081 1 19 8 11 15 + 1082 1 640 643 639 664 + 1083 1 603 553 588 601 + 1084 1 243 302 216 261 + 1085 1 243 302 261 418 + 1086 1 243 302 418 367 + 1087 1 418 243 367 298 + 1088 1 367 418 298 426 + 1089 1 261 243 418 349 + 1090 1 302 418 367 436 + 1091 1 418 261 349 374 + 1092 1 243 302 367 266 + 1093 1 367 418 426 457 + 1094 1 367 418 457 436 + 1095 1 457 367 436 486 + 1096 1 457 367 486 426 + 1097 1 486 457 426 460 + 1098 1 490 459 533 602 + 1099 1 257 310 337 392 + 1100 1 310 337 392 363 + 1101 1 119 153 126 86 + 1102 1 596 576 520 591 + 1103 1 116 76 78 135 + 1104 1 361 267 347 392 + 1105 1 187 251 191 283 + 1106 1 243 418 349 298 + 1107 1 418 349 298 426 + 1108 1 621 562 627 590 + 1109 1 627 621 590 653 + 1110 1 367 486 426 356 + 1111 1 486 426 356 503 + 1112 1 486 426 503 538 + 1113 1 486 426 538 460 + 1114 1 660 648 619 659 + 1115 1 555 487 432 508 + 1116 1 87 47 49 81 + 1117 1 47 49 81 53 + 1118 1 485 537 458 506 + 1119 1 87 137 107 77 + 1120 1 137 107 77 103 + 1121 1 87 137 77 124 + 1122 1 137 77 124 103 + 1123 1 77 124 103 80 + 1124 1 77 124 80 87 + 1125 1 87 137 124 122 + 1126 1 137 124 122 198 + 1127 1 513 576 520 493 + 1128 1 542 561 584 481 + 1129 1 420 518 458 371 + 1130 1 95 81 145 143 + 1131 1 95 81 143 110 + 1132 1 95 81 110 53 + 1133 1 145 95 143 209 + 1134 1 599 573 631 592 + 1135 1 368 308 453 375 + 1136 1 226 157 212 175 + 1137 1 487 432 508 326 + 1138 1 451 317 369 454 + 1139 1 191 187 283 169 + 1140 1 191 187 169 110 + 1141 1 187 169 110 209 + 1142 1 187 169 209 283 + 1143 1 561 584 481 581 + 1144 1 238 196 198 170 + 1145 1 198 238 170 219 + 1146 1 293 290 352 252 + 1147 1 352 293 252 259 + 1148 1 352 293 259 313 + 1149 1 293 252 259 222 + 1150 1 259 293 222 313 + 1151 1 137 124 198 200 + 1152 1 26 19 11 20 + 1153 1 97 83 96 57 + 1154 1 258 262 199 217 + 1155 1 452 501 443 353 + 1156 1 611 590 653 609 + 1157 1 487 505 432 401 + 1158 1 432 487 401 326 + 1159 1 401 432 326 371 + 1160 1 487 505 401 509 + 1161 1 401 487 509 508 + 1162 1 487 505 509 579 + 1163 1 326 401 371 289 + 1164 1 487 401 326 508 + 1165 1 111 138 88 178 + 1166 1 617 620 649 635 + 1167 1 204 220 207 297 + 1168 1 220 207 297 255 + 1169 1 204 220 297 342 + 1170 1 452 501 353 454 + 1171 1 88 80 56 101 + 1172 1 68 95 110 53 + 1173 1 110 68 53 96 + 1174 1 241 249 333 346 + 1175 1 154 151 140 233 + 1176 1 573 631 592 583 + 1177 1 423 324 258 410 + 1178 1 423 324 410 450 + 1179 1 410 423 450 514 + 1180 1 410 423 514 510 + 1181 1 450 410 514 494 + 1182 1 423 514 510 495 + 1183 1 510 423 495 439 + 1184 1 423 514 495 450 + 1185 1 410 423 510 397 + 1186 1 423 510 397 439 + 1187 1 410 423 397 258 + 1188 1 664 658 668 662 + 1189 1 537 518 458 554 + 1190 1 212 226 175 332 + 1191 1 156 222 152 259 + 1192 1 513 441 561 481 + 1193 1 562 553 603 475 + 1194 1 249 333 346 331 + 1195 1 224 219 253 179 + 1196 1 224 219 179 170 + 1197 1 219 179 170 198 + 1198 1 659 662 640 664 + 1199 1 668 664 662 669 + 1200 1 481 473 441 561 + 1201 1 234 155 188 242 + 1202 1 188 234 242 355 + 1203 1 155 188 242 154 + 1204 1 310 276 237 321 + 1205 1 509 487 579 508 + 1206 1 418 448 349 460 + 1207 1 349 418 460 426 + 1208 1 418 448 460 457 + 1209 1 448 349 460 429 + 1210 1 460 448 429 535 + 1211 1 460 448 535 566 + 1212 1 429 460 535 515 + 1213 1 349 460 429 365 + 1214 1 460 448 566 516 + 1215 1 448 535 566 567 + 1216 1 535 460 566 515 + 1217 1 448 566 516 567 + 1218 1 429 349 365 261 + 1219 1 460 448 516 457 + 1220 1 448 516 457 418 + 1221 1 516 457 418 438 + 1222 1 516 457 438 436 + 1223 1 516 460 457 538 + 1224 1 457 516 538 486 + 1225 1 457 516 486 436 + 1226 1 538 457 486 460 + 1227 1 429 460 515 365 + 1228 1 448 429 535 496 + 1229 1 535 448 496 567 + 1230 1 429 535 496 519 + 1231 1 429 535 519 515 + 1232 1 535 519 515 589 + 1233 1 535 496 519 586 + 1234 1 496 429 519 434 + 1235 1 535 496 586 567 + 1236 1 519 429 515 365 + 1237 1 519 429 365 476 + 1238 1 496 429 434 374 + 1239 1 519 535 586 605 + 1240 1 519 515 589 480 + 1241 1 146 214 163 208 + 1242 1 163 146 208 109 + 1243 1 524 573 592 583 + 1244 1 524 573 583 585 + 1245 1 224 219 170 269 + 1246 1 257 337 281 392 + 1247 1 368 251 283 321 + 1248 1 124 137 103 200 + 1249 1 630 645 586 606 + 1250 1 586 630 606 567 + 1251 1 606 586 567 535 + 1252 1 606 586 535 605 + 1253 1 606 586 605 645 + 1254 1 234 155 242 213 + 1255 1 155 242 213 154 + 1256 1 395 440 497 408 + 1257 1 573 511 507 592 + 1258 1 184 194 125 181 + 1259 1 184 194 181 254 + 1260 1 181 184 254 227 + 1261 1 181 184 227 162 + 1262 1 254 181 227 231 + 1263 1 254 181 231 166 + 1264 1 181 227 231 189 + 1265 1 194 181 254 166 + 1266 1 231 181 189 166 + 1267 1 125 184 181 115 + 1268 1 184 181 115 162 + 1269 1 227 254 231 344 + 1270 1 254 231 344 264 + 1271 1 254 231 264 166 + 1272 1 639 640 664 650 + 1273 1 639 640 650 620 + 1274 1 650 639 620 663 + 1275 1 620 650 663 635 + 1276 1 640 650 620 604 + 1277 1 650 620 604 635 + 1278 1 639 640 620 546 + 1279 1 650 663 635 660 + 1280 1 650 663 660 664 + 1281 1 640 650 604 660 + 1282 1 664 639 650 663 + 1283 1 604 650 635 660 + 1284 1 620 640 604 546 + 1285 1 84 92 114 50 + 1286 1 84 92 50 59 + 1287 1 646 614 619 659 + 1288 1 640 546 614 619 + 1289 1 614 640 619 659 + 1290 1 448 429 496 374 + 1291 1 310 392 413 446 + 1292 1 310 392 446 363 + 1293 1 261 243 349 245 + 1294 1 300 390 382 356 + 1295 1 353 384 454 403 + 1296 1 384 454 403 317 + 1297 1 450 428 393 523 + 1298 1 106 86 156 93 + 1299 1 106 86 93 52 + 1300 1 469 419 325 343 + 1301 1 28 31 46 16 + 1302 1 130 201 205 209 + 1303 1 298 194 230 168 + 1304 1 142 206 210 133 + 1305 1 339 270 393 309 + 1306 1 271 366 386 327 + 1307 1 68 76 47 31 + 1308 1 380 377 378 493 + 1309 1 236 224 153 222 + 1310 1 343 325 264 419 + 1311 1 438 477 448 567 + 1312 1 28 15 31 16 + 1313 1 198 179 229 219 + 1314 1 120 161 146 104 + 1315 1 120 161 104 85 + 1316 1 146 120 104 93 + 1317 1 246 305 366 365 + 1318 1 161 214 146 228 + 1319 1 214 146 228 208 + 1320 1 161 214 228 268 + 1321 1 146 228 208 167 + 1322 1 228 208 167 279 + 1323 1 146 228 167 161 + 1324 1 223 166 264 186 + 1325 1 85 82 133 73 + 1326 1 458 537 554 506 + 1327 1 374 477 380 434 + 1328 1 72 125 90 123 + 1329 1 253 183 271 246 + 1330 1 288 215 210 158 + 1331 1 204 149 229 198 + 1332 1 206 142 147 133 + 1333 1 493 475 434 562 + 1334 1 244 268 176 210 + 1335 1 137 149 204 198 + 1336 1 180 166 147 112 + 1337 1 145 137 204 207 + 1338 1 192 244 158 250 + 1339 1 183 205 246 135 + 1340 1 94 165 112 78 + 1341 1 67 121 119 120 + 1342 1 285 282 205 209 + 1343 1 475 386 455 541 + 1344 1 83 72 90 46 + 1345 1 313 326 371 224 + 1346 1 229 253 271 386 + 1347 1 31 62 46 78 + 1348 1 194 254 230 166 + 1349 1 307 450 393 296 + 1350 1 201 204 229 342 + 1351 1 378 493 434 380 + 1352 1 377 285 378 342 + 1353 1 224 192 153 126 + 1354 1 477 374 448 496 + 1355 1 15 30 31 20 + 1356 1 339 245 270 309 + 1357 1 183 118 130 135 + 1358 1 183 118 135 192 + 1359 1 214 176 236 268 + 1360 1 166 230 264 254 + 1361 1 396 459 410 494 + 1362 1 476 562 519 434 + 1363 1 343 426 339 469 + 1364 1 477 373 380 513 + 1365 1 94 119 135 65 + 1366 1 271 246 366 327 + 1367 1 166 223 147 186 + 1368 1 374 380 305 434 + 1369 1 325 339 393 469 + 1370 1 95 68 47 53 + 1371 1 68 47 53 35 + 1372 1 53 68 35 51 + 1373 1 53 68 51 96 + 1374 1 68 35 51 46 + 1375 1 35 53 51 21 + 1376 1 121 85 133 161 + 1377 1 244 176 158 210 + 1378 1 183 130 205 135 + 1379 1 67 43 85 38 + 1380 1 282 305 205 261 + 1381 1 505 569 574 579 + 1382 1 222 153 152 224 + 1383 1 280 274 171 204 + 1384 1 92 115 162 98 + 1385 1 92 115 98 72 + 1386 1 307 223 317 217 + 1387 1 47 54 49 20 + 1388 1 405 368 375 283 + 1389 1 405 368 283 321 + 1390 1 405 368 321 467 + 1391 1 10 27 20 7 + 1392 1 517 553 455 540 + 1393 1 455 517 540 433 + 1394 1 517 553 540 601 + 1395 1 553 540 601 541 + 1396 1 385 334 244 311 + 1397 1 462 441 377 364 + 1398 1 441 377 364 375 + 1399 1 364 441 375 462 + 1400 1 38 17 25 19 + 1401 1 208 146 167 109 + 1402 1 595 629 569 578 + 1403 1 220 207 255 143 + 1404 1 197 300 281 184 + 1405 1 619 646 659 648 + 1406 1 288 311 244 210 + 1407 1 244 288 210 158 + 1408 1 80 56 101 69 + 1409 1 261 243 245 202 + 1410 1 245 261 202 256 + 1411 1 202 245 256 165 + 1412 1 256 202 165 261 + 1413 1 202 245 165 168 + 1414 1 165 202 168 185 + 1415 1 202 168 185 243 + 1416 1 165 202 185 261 + 1417 1 202 245 168 243 + 1418 1 202 185 261 243 + 1419 1 245 261 256 349 + 1420 1 168 165 185 144 + 1421 1 185 168 144 177 + 1422 1 185 261 243 177 + 1423 1 144 185 177 261 + 1424 1 616 587 644 593 + 1425 1 274 286 200 198 + 1426 1 587 515 600 525 + 1427 1 600 587 525 572 + 1428 1 224 289 253 326 + 1429 1 535 519 589 605 + 1430 1 587 512 525 572 + 1431 1 256 245 349 365 + 1432 1 9 16 7 6 + 1433 1 105 73 44 58 + 1434 1 472 474 558 489 + 1435 1 472 474 489 352 + 1436 1 505 401 509 433 + 1437 1 505 401 433 371 + 1438 1 97 96 160 102 + 1439 1 97 96 102 57 + 1440 1 162 197 131 184 + 1441 1 526 474 580 558 + 1442 1 129 213 154 155 + 1443 1 207 204 297 280 + 1444 1 390 300 277 344 + 1445 1 665 660 669 659 + 1446 1 273 279 388 292 + 1447 1 273 279 292 167 + 1448 1 388 273 292 394 + 1449 1 397 402 478 534 + 1450 1 478 397 534 510 + 1451 1 478 397 510 439 + 1452 1 13 3 9 7 + 1453 1 39 38 25 61 + 1454 1 25 39 61 34 + 1455 1 274 280 389 297 + 1456 1 527 473 581 559 + 1457 1 27 22 20 49 + 1458 1 524 573 585 556 + 1459 1 472 502 407 370 + 1460 1 472 502 370 458 + 1461 1 407 472 370 376 + 1462 1 472 370 376 458 + 1463 1 407 472 376 352 + 1464 1 376 407 352 272 + 1465 1 352 376 272 290 + 1466 1 376 272 290 303 + 1467 1 290 376 303 458 + 1468 1 376 272 303 407 + 1469 1 272 290 303 228 + 1470 1 352 376 290 420 + 1471 1 376 290 420 458 + 1472 1 352 376 420 489 + 1473 1 376 420 489 472 + 1474 1 489 376 472 352 + 1475 1 376 420 472 458 + 1476 1 462 499 406 398 + 1477 1 462 499 398 545 + 1478 1 406 462 398 364 + 1479 1 406 462 364 375 + 1480 1 364 406 375 255 + 1481 1 398 406 364 297 + 1482 1 375 364 255 284 + 1483 1 364 255 284 297 + 1484 1 375 364 284 377 + 1485 1 364 284 377 398 + 1486 1 377 364 398 462 + 1487 1 398 377 462 545 + 1488 1 364 406 255 297 + 1489 1 364 284 398 297 + 1490 1 284 377 398 342 + 1491 1 377 398 342 470 + 1492 1 590 653 609 627 + 1493 1 609 590 627 564 + 1494 1 609 590 564 493 + 1495 1 590 627 564 562 + 1496 1 627 609 564 563 + 1497 1 407 352 272 252 + 1498 1 352 272 252 290 + 1499 1 272 252 290 222 + 1500 1 272 407 252 323 + 1501 1 252 272 323 228 + 1502 1 252 272 228 214 + 1503 1 362 332 248 351 + 1504 1 538 566 516 460 + 1505 1 328 357 355 234 + 1506 1 541 492 504 386 + 1507 1 125 184 115 131 + 1508 1 2 10 12 11 + 1509 1 358 354 331 240 + 1510 1 324 410 450 296 + 1511 1 68 47 35 31 + 1512 1 151 99 140 105 + 1513 1 165 185 144 172 + 1514 1 185 144 172 261 + 1515 1 172 185 261 218 + 1516 1 172 185 218 165 + 1517 1 185 218 165 261 + 1518 1 385 490 533 461 + 1519 1 490 533 461 488 + 1520 1 490 533 488 595 + 1521 1 253 224 179 192 + 1522 1 194 230 168 166 + 1523 1 272 252 222 214 + 1524 1 470 475 563 504 + 1525 1 184 266 254 227 + 1526 1 102 97 57 79 + 1527 1 102 97 79 131 + 1528 1 79 102 131 98 + 1529 1 131 79 98 72 + 1530 1 79 98 72 59 + 1531 1 79 98 59 70 + 1532 1 79 98 70 102 + 1533 1 72 79 59 57 + 1534 1 59 79 70 57 + 1535 1 70 79 102 57 + 1536 1 102 97 131 190 + 1537 1 571 608 607 523 + 1538 1 571 608 523 547 + 1539 1 607 571 523 551 + 1540 1 161 146 104 167 + 1541 1 52 55 48 29 + 1542 1 52 55 29 56 + 1543 1 55 48 29 54 + 1544 1 291 391 278 350 + 1545 1 17 39 25 24 + 1546 1 17 39 24 44 + 1547 1 454 403 501 353 + 1548 1 576 611 609 590 + 1549 1 576 611 590 536 + 1550 1 576 611 536 544 + 1551 1 611 590 536 586 + 1552 1 590 576 536 493 + 1553 1 609 576 590 493 + 1554 1 590 536 586 496 + 1555 1 536 586 496 567 + 1556 1 496 536 567 477 + 1557 1 536 567 477 544 + 1558 1 496 536 477 493 + 1559 1 477 536 544 513 + 1560 1 477 536 513 493 + 1561 1 104 120 85 64 + 1562 1 85 104 64 66 + 1563 1 85 104 66 117 + 1564 1 85 104 117 161 + 1565 1 104 64 66 109 + 1566 1 104 66 117 109 + 1567 1 66 85 117 74 + 1568 1 85 117 74 133 + 1569 1 66 85 74 39 + 1570 1 74 66 39 58 + 1571 1 39 74 58 73 + 1572 1 39 74 73 85 + 1573 1 74 73 85 133 + 1574 1 117 66 74 89 + 1575 1 74 117 89 140 + 1576 1 117 89 140 100 + 1577 1 74 117 140 132 + 1578 1 117 140 132 182 + 1579 1 117 140 182 188 + 1580 1 140 182 188 232 + 1581 1 182 188 232 263 + 1582 1 182 188 263 167 + 1583 1 132 117 182 133 + 1584 1 117 140 188 100 + 1585 1 140 182 232 132 + 1586 1 188 140 232 233 + 1587 1 232 182 263 304 + 1588 1 188 232 263 355 + 1589 1 74 117 132 133 + 1590 1 182 117 188 167 + 1591 1 66 74 89 58 + 1592 1 74 89 58 99 + 1593 1 89 58 99 71 + 1594 1 99 89 71 100 + 1595 1 89 71 100 61 + 1596 1 99 89 100 140 + 1597 1 99 89 140 74 + 1598 1 100 89 61 66 + 1599 1 89 61 66 58 + 1600 1 100 89 66 117 + 1601 1 61 100 66 109 + 1602 1 104 120 64 93 + 1603 1 74 58 73 105 + 1604 1 73 74 105 132 + 1605 1 73 74 132 133 + 1606 1 89 58 71 61 + 1607 1 64 85 66 38 + 1608 1 66 64 38 45 + 1609 1 64 38 45 41 + 1610 1 64 38 41 67 + 1611 1 38 45 41 19 + 1612 1 64 38 67 85 + 1613 1 45 64 41 93 + 1614 1 67 64 85 120 + 1615 1 38 66 45 61 + 1616 1 66 45 61 109 + 1617 1 66 64 45 109 + 1618 1 41 38 19 30 + 1619 1 41 38 30 67 + 1620 1 58 74 99 105 + 1621 1 45 41 19 52 + 1622 1 41 19 52 29 + 1623 1 52 41 29 48 + 1624 1 52 41 48 86 + 1625 1 41 29 48 30 + 1626 1 48 41 30 67 + 1627 1 30 48 67 65 + 1628 1 48 67 65 119 + 1629 1 30 48 65 31 + 1630 1 66 39 58 61 + 1631 1 66 39 61 38 + 1632 1 66 39 38 85 + 1633 1 41 19 29 30 + 1634 1 647 643 644 593 + 1635 1 97 79 131 72 + 1636 1 97 79 72 57 + 1637 1 301 381 258 423 + 1638 1 143 95 110 209 + 1639 1 555 487 508 579 + 1640 1 609 564 563 493 + 1641 1 564 563 493 475 + 1642 1 493 564 475 562 + 1643 1 564 563 475 603 + 1644 1 276 310 413 321 + 1645 1 452 547 501 454 + 1646 1 553 455 540 541 + 1647 1 443 381 387 439 + 1648 1 603 617 635 588 + 1649 1 617 635 588 620 + 1650 1 384 452 454 547 + 1651 1 231 264 166 186 + 1652 1 457 418 438 436 + 1653 1 423 381 439 301 + 1654 1 521 458 554 472 + 1655 1 519 496 434 562 + 1656 1 446 310 363 321 + 1657 1 266 287 302 367 + 1658 1 287 302 367 436 + 1659 1 370 407 376 303 + 1660 1 376 370 303 458 + 1661 1 370 303 458 427 + 1662 1 370 303 427 399 + 1663 1 370 407 303 323 + 1664 1 370 303 399 292 + 1665 1 458 370 427 502 + 1666 1 303 370 323 292 + 1667 1 303 458 427 312 + 1668 1 458 427 312 425 + 1669 1 458 427 425 485 + 1670 1 458 427 485 506 + 1671 1 427 425 485 402 + 1672 1 485 427 402 399 + 1673 1 427 485 506 399 + 1674 1 506 427 399 502 + 1675 1 427 402 399 312 + 1676 1 425 485 402 490 + 1677 1 425 485 490 488 + 1678 1 490 425 488 461 + 1679 1 425 485 488 458 + 1680 1 485 490 488 578 + 1681 1 485 402 490 534 + 1682 1 427 425 402 312 + 1683 1 402 425 490 334 + 1684 1 488 425 458 518 + 1685 1 488 425 518 371 + 1686 1 312 458 425 371 + 1687 1 458 427 506 502 + 1688 1 485 506 399 478 + 1689 1 399 427 312 303 + 1690 1 425 458 518 371 + 1691 1 427 370 399 502 + 1692 1 402 485 399 478 + 1693 1 490 485 534 578 + 1694 1 425 490 334 461 + 1695 1 506 399 478 435 + 1696 1 506 399 435 447 + 1697 1 399 478 435 306 + 1698 1 303 458 312 290 + 1699 1 312 303 290 228 + 1700 1 485 402 534 478 + 1701 1 590 586 562 496 + 1702 1 586 562 496 519 + 1703 1 402 425 334 268 + 1704 1 261 172 218 205 + 1705 1 172 218 205 135 + 1706 1 533 602 595 490 + 1707 1 458 312 290 371 + 1708 1 312 290 371 214 + 1709 1 146 167 109 104 + 1710 1 109 146 104 93 + 1711 1 589 587 600 644 + 1712 1 590 564 493 562 + 1713 1 258 199 210 133 + 1714 1 658 643 662 664 + 1715 1 176 161 121 210 + 1716 1 401 509 433 327 + 1717 1 142 82 112 147 + 1718 1 570 620 588 604 + 1719 1 620 588 604 635 + 1720 1 588 604 635 618 + 1721 1 588 604 618 548 + 1722 1 588 604 548 546 + 1723 1 635 588 618 601 + 1724 1 588 618 601 548 + 1725 1 588 570 604 546 + 1726 1 635 588 601 603 + 1727 1 618 635 601 648 + 1728 1 618 635 648 619 + 1729 1 648 618 619 574 + 1730 1 618 619 574 548 + 1731 1 574 618 548 601 + 1732 1 619 574 548 533 + 1733 1 648 618 574 626 + 1734 1 648 618 626 601 + 1735 1 574 618 601 626 + 1736 1 618 619 548 604 + 1737 1 618 619 604 635 + 1738 1 619 548 604 546 + 1739 1 604 619 546 640 + 1740 1 604 619 640 660 + 1741 1 619 604 635 660 + 1742 1 570 620 604 546 + 1743 1 548 574 601 540 + 1744 1 548 574 540 505 + 1745 1 548 574 505 488 + 1746 1 80 122 75 87 + 1747 1 284 308 209 283 + 1748 1 397 311 410 258 + 1749 1 126 86 75 119 + 1750 1 230 180 245 168 + 1751 1 291 241 346 249 + 1752 1 192 158 135 250 + 1753 1 365 309 250 245 + 1754 1 605 570 519 589 + 1755 1 88 80 101 138 + 1756 1 583 529 543 471 + 1757 1 632 598 637 575 + 1758 1 632 598 575 557 + 1759 1 631 636 599 592 + 1760 1 401 432 371 505 + 1761 1 544 477 513 500 + 1762 1 212 157 128 175 + 1763 1 536 567 544 611 + 1764 1 536 567 611 586 + 1765 1 540 517 601 548 + 1766 1 540 517 548 505 + 1767 1 63 108 91 113 + 1768 1 108 91 113 150 + 1769 1 63 108 113 112 + 1770 1 108 113 112 147 + 1771 1 108 113 147 150 + 1772 1 108 91 150 105 + 1773 1 112 108 147 82 + 1774 1 113 112 147 166 + 1775 1 147 113 166 186 + 1776 1 108 147 82 133 + 1777 1 146 163 93 109 + 1778 1 605 606 645 641 + 1779 1 6 24 18 17 + 1780 1 6 24 17 14 + 1781 1 92 84 72 59 + 1782 1 73 43 44 39 + 1783 1 448 477 496 567 + 1784 1 519 429 476 434 + 1785 1 47 53 35 27 + 1786 1 53 35 27 21 + 1787 1 35 47 27 20 + 1788 1 227 231 189 277 + 1789 1 227 231 277 344 + 1790 1 54 75 118 87 + 1791 1 405 368 467 500 + 1792 1 460 418 457 426 + 1793 1 228 167 161 225 + 1794 1 228 167 225 292 + 1795 1 225 228 292 299 + 1796 1 292 225 299 335 + 1797 1 292 225 335 263 + 1798 1 225 335 263 301 + 1799 1 228 292 299 303 + 1800 1 292 225 263 167 + 1801 1 299 292 335 399 + 1802 1 335 299 399 306 + 1803 1 299 399 306 268 + 1804 1 335 299 306 225 + 1805 1 306 299 268 161 + 1806 1 225 228 299 161 + 1807 1 299 306 225 161 + 1808 1 335 292 263 394 + 1809 1 263 335 394 304 + 1810 1 228 167 292 279 + 1811 1 399 335 306 435 + 1812 1 399 335 435 292 + 1813 1 299 292 399 303 + 1814 1 399 299 303 312 + 1815 1 299 399 268 312 + 1816 1 268 299 312 228 + 1817 1 306 335 225 301 + 1818 1 335 435 292 388 + 1819 1 335 435 388 394 + 1820 1 335 435 394 439 + 1821 1 388 335 394 292 + 1822 1 21 16 23 36 + 1823 1 21 16 36 35 + 1824 1 16 23 36 46 + 1825 1 16 36 35 46 + 1826 1 21 16 35 27 + 1827 1 540 601 541 549 + 1828 1 540 601 549 579 + 1829 1 541 540 549 509 + 1830 1 540 549 509 579 + 1831 1 549 509 579 508 + 1832 1 549 541 509 492 + 1833 1 509 549 492 508 + 1834 1 541 540 509 455 + 1835 1 540 509 455 433 + 1836 1 509 540 579 505 + 1837 1 509 540 505 433 + 1838 1 524 451 511 556 + 1839 1 261 172 205 216 + 1840 1 172 205 216 116 + 1841 1 172 205 116 135 + 1842 1 8 19 25 17 + 1843 1 81 145 143 107 + 1844 1 196 239 291 278 + 1845 1 239 291 278 350 + 1846 1 35 68 31 46 + 1847 1 279 273 164 167 + 1848 1 76 68 78 31 + 1849 1 141 83 116 110 + 1850 1 425 312 371 334 + 1851 1 312 371 334 268 + 1852 1 334 312 268 425 + 1853 1 371 425 334 433 + 1854 1 312 371 268 236 + 1855 1 268 312 236 214 + 1856 1 312 371 236 214 + 1857 1 666 668 658 662 + 1858 1 638 596 633 591 + 1859 1 496 434 562 493 + 1860 1 584 530 542 481 + 1861 1 147 108 150 148 + 1862 1 147 108 148 133 + 1863 1 108 148 133 73 + 1864 1 573 585 556 631 + 1865 1 359 241 333 346 + 1866 1 640 664 650 660 + 1867 1 27 35 20 16 + 1868 1 494 512 593 532 + 1869 1 494 512 532 393 + 1870 1 593 494 532 568 + 1871 1 242 213 154 233 + 1872 1 148 147 133 217 + 1873 1 148 147 217 150 + 1874 1 391 431 445 350 + 1875 1 431 445 350 508 + 1876 1 390 444 430 344 + 1877 1 390 444 344 415 + 1878 1 444 430 344 503 + 1879 1 318 265 404 264 + 1880 1 612 629 578 569 + 1881 1 612 629 569 652 + 1882 1 24 58 44 39 + 1883 1 24 58 39 34 + 1884 1 58 39 34 61 + 1885 1 39 24 34 25 + 1886 1 280 207 322 297 + 1887 1 207 322 297 255 + 1888 1 322 280 297 414 + 1889 1 449 309 421 393 + 1890 1 279 208 323 228 + 1891 1 610 579 626 569 + 1892 1 98 59 92 72 + 1893 1 60 22 49 40 + 1894 1 60 22 40 32 + 1895 1 49 60 40 77 + 1896 1 60 40 77 80 + 1897 1 40 77 80 87 + 1898 1 49 60 77 107 + 1899 1 77 60 80 103 + 1900 1 77 60 103 107 + 1901 1 22 49 40 20 + 1902 1 40 22 20 26 + 1903 1 40 49 77 87 + 1904 1 647 628 613 593 + 1905 1 628 613 593 568 + 1906 1 647 628 593 656 + 1907 1 613 647 593 615 + 1908 1 25 45 61 38 + 1909 1 25 45 38 19 + 1910 1 500 446 491 363 + 1911 1 446 491 363 436 + 1912 1 500 446 363 321 + 1913 1 447 435 388 292 + 1914 1 442 499 484 398 + 1915 1 574 595 569 488 + 1916 1 474 489 352 483 + 1917 1 474 489 483 580 + 1918 1 574 601 540 579 + 1919 1 520 462 377 545 + 1920 1 113 114 150 91 + 1921 1 113 114 91 50 + 1922 1 301 258 210 311 + 1923 1 605 620 589 639 + 1924 1 620 589 639 546 + 1925 1 605 620 639 654 + 1926 1 620 639 654 663 + 1927 1 654 620 663 649 + 1928 1 605 620 654 649 + 1929 1 589 605 639 641 + 1930 1 639 589 641 644 + 1931 1 663 654 649 667 + 1932 1 663 654 667 670 + 1933 1 654 667 670 661 + 1934 1 654 667 661 645 + 1935 1 661 654 645 639 + 1936 1 661 654 639 663 + 1937 1 670 654 661 663 + 1938 1 654 667 645 649 + 1939 1 538 566 460 525 + 1940 1 460 538 525 426 + 1941 1 538 566 525 600 + 1942 1 525 538 600 572 + 1943 1 525 538 572 426 + 1944 1 390 300 344 356 + 1945 1 182 132 133 199 + 1946 1 132 133 199 148 + 1947 1 132 133 148 73 + 1948 1 182 132 199 203 + 1949 1 199 182 203 304 + 1950 1 132 199 203 148 + 1951 1 182 132 203 232 + 1952 1 203 182 232 304 + 1953 1 232 203 304 275 + 1954 1 133 199 148 217 + 1955 1 392 446 363 436 + 1956 1 83 90 78 46 + 1957 1 312 268 425 402 + 1958 1 312 268 402 399 + 1959 1 478 397 439 306 + 1960 1 131 98 162 115 + 1961 1 286 238 198 294 + 1962 1 238 198 294 260 + 1963 1 238 198 260 219 + 1964 1 260 238 219 341 + 1965 1 219 260 341 253 + 1966 1 294 238 260 341 + 1967 1 219 260 253 229 + 1968 1 260 253 229 341 + 1969 1 198 260 219 229 + 1970 1 198 260 229 294 + 1971 1 286 238 294 383 + 1972 1 260 229 294 336 + 1973 1 260 229 336 341 + 1974 1 336 260 341 294 + 1975 1 294 286 383 274 + 1976 1 58 44 39 73 + 1977 1 306 402 268 399 + 1978 1 306 402 399 478 + 1979 1 501 443 353 466 + 1980 1 533 546 461 548 + 1981 1 231 344 264 318 + 1982 1 400 345 289 250 + 1983 1 391 291 383 350 + 1984 1 269 239 170 178 + 1985 1 266 337 367 382 + 1986 1 266 337 382 281 + 1987 1 337 382 281 392 + 1988 1 337 382 392 436 + 1989 1 337 382 436 367 + 1990 1 436 337 367 287 + 1991 1 392 337 436 363 + 1992 1 397 534 510 459 + 1993 1 510 397 459 410 + 1994 1 323 407 463 409 + 1995 1 323 407 409 370 + 1996 1 407 409 370 502 + 1997 1 409 370 502 399 + 1998 1 409 323 370 292 + 1999 1 409 370 399 292 + 2000 1 407 463 409 502 + 2001 1 463 409 502 447 + 2002 1 409 502 447 399 + 2003 1 463 409 447 323 + 2004 1 409 447 323 292 + 2005 1 585 531 482 556 + 2006 1 667 657 645 649 + 2007 1 442 389 414 297 + 2008 1 529 466 501 403 + 2009 1 70 57 33 59 + 2010 1 498 531 556 456 + 2011 1 556 498 456 419 + 2012 1 498 456 419 404 + 2013 1 456 419 404 451 + 2014 1 456 419 451 556 + 2015 1 531 556 456 482 + 2016 1 456 531 482 404 + 2017 1 482 456 404 451 + 2018 1 482 456 451 556 + 2019 1 456 531 404 498 + 2020 1 464 442 414 322 + 2021 1 411 323 463 447 + 2022 1 408 320 465 395 + 2023 1 329 360 233 348 + 2024 1 528 557 582 483 + 2025 1 32 60 69 56 + 2026 1 530 467 500 405 + 2027 1 34 61 71 58 + 2028 1 653 638 611 609 + 2029 1 360 412 275 387 + 2030 1 88 106 52 111 + 2031 1 88 106 111 178 + 2032 1 322 406 464 417 + 2033 1 322 406 417 297 + 2034 1 417 322 297 442 + 2035 1 297 417 442 398 + 2036 1 297 417 398 406 + 2037 1 417 442 398 499 + 2038 1 398 417 499 406 + 2039 1 417 442 499 464 + 2040 1 417 442 464 322 + 2041 1 499 417 464 406 + 2042 1 322 406 297 255 + 2043 1 358 280 414 389 + 2044 1 416 445 465 320 + 2045 1 71 100 129 99 + 2046 1 412 466 319 443 + 2047 1 359 391 416 278 + 2048 1 606 567 566 535 + 2049 1 566 606 535 600 + 2050 1 445 497 465 395 + 2051 1 445 497 395 508 + 2052 1 319 466 403 353 + 2053 1 403 319 353 247 + 2054 1 12 22 32 26 + 2055 1 636 651 607 608 + 2056 1 4 8 14 6 + 2057 1 8 25 14 17 + 2058 1 468 531 498 404 + 2059 1 655 665 646 648 + 2060 1 528 408 465 497 + 2061 1 444 468 498 379 + 2062 1 498 444 379 424 + 2063 1 379 498 424 419 + 2064 1 444 379 424 344 + 2065 1 444 379 344 318 + 2066 1 424 444 344 503 + 2067 1 379 424 344 264 + 2068 1 379 344 318 264 + 2069 1 498 444 424 503 + 2070 1 424 498 503 469 + 2071 1 468 498 379 404 + 2072 1 379 468 404 318 + 2073 1 404 379 318 264 + 2074 1 379 468 318 444 + 2075 1 424 379 419 264 + 2076 1 498 379 404 419 + 2077 1 379 404 419 264 + 2078 1 320 278 416 391 + 2079 1 463 526 502 407 + 2080 1 361 235 330 347 + 2081 1 637 610 652 612 + 2082 1 656 666 644 647 + 2083 1 33 13 23 21 + 2084 1 362 415 390 277 + 2085 1 497 557 528 440 + 2086 1 60 103 69 80 + 2087 1 127 174 211 173 + 2088 1 265 189 186 231 + 2089 1 265 189 231 318 + 2090 1 231 265 318 264 + 2091 1 231 265 264 186 + 2092 1 500 467 446 321 + 2093 1 628 651 608 594 + 2094 1 608 628 594 532 + 2095 1 628 651 594 625 + 2096 1 651 594 625 607 + 2097 1 594 625 607 572 + 2098 1 651 594 607 608 + 2099 1 594 628 625 593 + 2100 1 594 628 593 532 + 2101 1 593 594 532 512 + 2102 1 594 607 608 523 + 2103 1 594 607 523 572 + 2104 1 413 276 361 392 + 2105 1 656 651 628 625 + 2106 1 173 101 127 134 + 2107 1 173 101 134 196 + 2108 1 134 173 196 200 + 2109 1 196 134 200 124 + 2110 1 134 200 124 103 + 2111 1 124 134 103 101 + 2112 1 101 127 134 103 + 2113 1 127 134 103 174 + 2114 1 134 103 174 200 + 2115 1 174 134 200 173 + 2116 1 127 134 174 173 + 2117 1 196 134 124 138 + 2118 1 134 124 138 101 + 2119 1 196 134 138 101 + 2120 1 124 196 138 198 + 2121 1 196 138 198 170 + 2122 1 196 138 170 178 + 2123 1 128 70 98 102 + 2124 1 467 413 446 321 + 2125 1 483 408 528 440 + 2126 1 483 408 440 352 + 2127 1 69 103 127 101 + 2128 1 484 504 437 342 + 2129 1 59 33 23 37 + 2130 1 23 59 37 36 + 2131 1 37 23 36 21 + 2132 1 36 37 21 51 + 2133 1 36 37 51 72 + 2134 1 36 37 72 59 + 2135 1 37 21 51 57 + 2136 1 51 37 57 72 + 2137 1 51 36 72 46 + 2138 1 37 21 57 33 + 2139 1 21 36 51 35 + 2140 1 36 51 35 46 + 2141 1 57 37 33 59 + 2142 1 36 72 46 42 + 2143 1 46 36 42 23 + 2144 1 36 42 23 59 + 2145 1 42 23 59 50 + 2146 1 59 42 50 84 + 2147 1 42 50 84 46 + 2148 1 42 23 50 46 + 2149 1 36 42 59 72 + 2150 1 42 59 72 84 + 2151 1 21 51 57 53 + 2152 1 37 21 33 23 + 2153 1 84 42 46 72 + 2154 1 37 57 72 59 + 2155 1 57 51 72 83 + 2156 1 51 72 83 46 + 2157 1 447 388 411 292 + 2158 1 279 323 411 292 + 2159 1 464 406 527 499 + 2160 1 415 468 444 318 + 2161 1 610 626 652 569 + 2162 1 357 411 388 279 + 2163 1 318 415 277 344 + 2164 1 164 279 167 208 + 2165 1 167 164 208 109 + 2166 1 167 164 109 117 + 2167 1 56 26 32 40 + 2168 1 391 445 416 320 + 2169 1 625 656 644 593 + 2170 1 233 360 275 295 + 2171 1 275 233 295 232 + 2172 1 233 295 232 348 + 2173 1 295 232 348 304 + 2174 1 295 232 304 275 + 2175 1 348 295 304 387 + 2176 1 295 304 387 275 + 2177 1 348 295 387 360 + 2178 1 348 295 360 233 + 2179 1 295 387 360 275 + 2180 1 304 348 387 394 + 2181 1 387 304 394 439 + 2182 1 49 81 107 87 + 2183 1 14 34 24 25 + 2184 1 258 301 423 397 + 2185 1 75 65 118 119 + 2186 1 48 41 67 86 + 2187 1 601 588 548 517 + 2188 1 588 548 517 546 + 2189 1 80 55 56 40 + 2190 1 353 443 319 466 + 2191 1 425 334 433 461 + 2192 1 327 400 433 289 + 2193 1 433 327 289 401 + 2194 1 289 433 401 371 + 2195 1 324 258 410 296 + 2196 1 324 258 296 307 + 2197 1 324 258 307 217 + 2198 1 448 429 374 349 + 2199 1 639 605 654 645 + 2200 1 605 654 645 649 + 2201 1 255 375 284 283 + 2202 1 563 470 504 484 + 2203 1 470 504 484 342 + 2204 1 484 470 342 398 + 2205 1 489 352 483 440 + 2206 1 483 489 440 557 + 2207 1 136 189 92 162 + 2208 1 160 97 102 190 + 2209 1 630 586 611 567 + 2210 1 229 294 336 342 + 2211 1 595 629 578 602 + 2212 1 515 535 589 600 + 2213 1 131 98 115 72 + 2214 1 220 145 207 143 + 2215 1 220 145 143 209 + 2216 1 273 164 167 188 + 2217 1 164 167 188 117 + 2218 1 381 443 495 439 + 2219 1 263 232 304 348 + 2220 1 104 64 109 93 + 2221 1 536 544 513 576 + 2222 1 513 536 576 493 + 2223 1 617 562 603 627 + 2224 1 189 231 318 277 + 2225 1 231 318 277 344 + 2226 1 410 396 494 393 + 2227 1 441 375 453 308 + 2228 1 327 400 289 246 + 2229 1 45 41 52 93 + 2230 1 444 344 415 318 + 2231 1 594 608 532 523 + 2232 1 532 594 523 512 + 2233 1 523 532 512 393 + 2234 1 523 532 393 450 + 2235 1 523 532 450 539 + 2236 1 523 532 539 608 + 2237 1 532 539 608 568 + 2238 1 539 608 568 547 + 2239 1 539 608 547 523 + 2240 1 568 539 547 450 + 2241 1 532 539 568 450 + 2242 1 547 539 523 450 + 2243 1 493 470 563 545 + 2244 1 54 75 87 80 + 2245 1 297 322 414 442 + 2246 1 634 629 652 569 + 2247 1 590 536 496 493 + 2248 1 132 203 232 151 + 2249 1 203 232 151 275 + 2250 1 548 517 546 461 + 2251 1 548 517 461 433 + 2252 1 552 510 534 459 + 2253 1 169 143 110 209 + 2254 1 349 339 426 421 + 2255 1 349 339 421 309 + 2256 1 339 426 421 469 + 2257 1 90 144 78 165 + 2258 1 161 120 121 85 + 2259 1 218 172 165 135 + 2260 1 372 365 250 400 + 2261 1 449 515 365 480 + 2262 1 43 73 85 39 + 2263 1 363 302 251 237 + 2264 1 353 319 262 217 + 2265 1 206 217 307 258 + 2266 1 327 455 386 422 + 2267 1 327 455 422 509 + 2268 1 455 386 422 541 + 2269 1 455 422 509 541 + 2270 1 386 327 422 336 + 2271 1 422 386 336 492 + 2272 1 336 422 492 341 + 2273 1 336 422 341 327 + 2274 1 422 492 341 509 + 2275 1 422 341 327 509 + 2276 1 422 492 509 541 + 2277 1 386 342 271 229 + 2278 1 119 192 135 118 + 2279 1 222 214 236 371 + 2280 1 461 533 548 488 + 2281 1 152 170 178 269 + 2282 1 261 374 305 429 + 2283 1 285 284 209 201 + 2284 1 167 161 225 182 + 2285 1 225 167 182 263 + 2286 1 182 225 263 301 + 2287 1 298 245 243 168 + 2288 1 368 373 363 500 + 2289 1 223 264 317 221 + 2290 1 223 264 221 186 + 2291 1 264 221 186 265 + 2292 1 221 186 265 247 + 2293 1 221 186 247 217 + 2294 1 264 221 265 317 + 2295 1 221 223 186 217 + 2296 1 317 223 221 217 + 2297 1 265 221 247 317 + 2298 1 247 221 217 317 + 2299 1 261 282 216 205 + 2300 1 434 496 374 477 + 2301 1 245 256 165 250 + 2302 1 245 256 250 365 + 2303 1 256 250 365 246 + 2304 1 256 250 246 218 + 2305 1 256 250 218 165 + 2306 1 246 256 218 261 + 2307 1 250 246 218 135 + 2308 1 256 218 261 165 + 2309 1 250 218 165 135 + 2310 1 297 220 255 284 + 2311 1 220 255 284 209 + 2312 1 297 220 284 342 + 2313 1 284 220 209 201 + 2314 1 284 220 201 342 + 2315 1 475 455 553 541 + 2316 1 115 123 125 72 + 2317 1 125 115 72 131 + 2318 1 112 165 90 78 + 2319 1 90 112 78 46 + 2320 1 335 306 435 439 + 2321 1 41 64 67 86 + 2322 1 574 548 533 488 + 2323 1 107 87 77 49 + 2324 1 161 225 182 199 + 2325 1 225 182 199 301 + 2326 1 575 489 558 580 + 2327 1 309 365 421 349 + 2328 1 365 421 349 460 + 2329 1 421 349 460 426 + 2330 1 72 90 46 84 + 2331 1 498 556 551 419 + 2332 1 391 431 350 383 + 2333 1 181 123 194 125 + 2334 1 300 382 281 266 + 2335 1 344 424 503 343 + 2336 1 344 424 343 264 + 2337 1 424 503 343 469 + 2338 1 343 424 469 419 + 2339 1 343 424 419 264 + 2340 1 47 49 53 27 + 2341 1 47 49 27 20 + 2342 1 564 627 563 603 + 2343 1 490 488 578 595 + 2344 1 519 515 480 365 + 2345 1 430 390 344 356 + 2346 1 344 430 356 503 + 2347 1 430 390 356 382 + 2348 1 356 430 382 436 + 2349 1 52 41 86 93 + 2350 1 171 274 200 193 + 2351 1 274 200 193 198 + 2352 1 200 171 193 137 + 2353 1 171 193 137 204 + 2354 1 193 137 204 198 + 2355 1 204 193 198 274 + 2356 1 193 137 198 200 + 2357 1 204 193 274 171 + 2358 1 67 64 120 86 + 2359 1 645 605 641 639 + 2360 1 385 490 461 334 + 2361 1 308 368 283 375 + 2362 1 491 438 436 516 + 2363 1 491 438 516 567 + 2364 1 208 163 252 214 + 2365 1 394 263 304 348 + 2366 1 430 503 486 356 + 2367 1 486 430 356 436 + 2368 1 31 35 46 16 + 2369 1 31 35 16 20 + 2370 1 31 35 20 47 + 2371 1 613 568 552 494 + 2372 1 272 303 407 323 + 2373 1 424 469 419 498 + 2374 1 523 428 571 507 + 2375 1 571 523 507 547 + 2376 1 523 428 507 547 + 2377 1 301 199 304 182 + 2378 1 480 570 546 589 + 2379 1 108 148 73 105 + 2380 1 167 273 188 263 + 2381 1 273 188 263 355 + 2382 1 263 273 355 394 + 2383 1 355 263 394 348 + 2384 1 50 84 46 63 + 2385 1 108 150 148 105 + 2386 1 163 156 252 222 + 2387 1 436 337 287 363 + 2388 1 552 568 510 514 + 2389 1 552 568 514 494 + 2390 1 510 552 514 410 + 2391 1 568 510 514 495 + 2392 1 514 568 495 450 + 2393 1 514 568 450 532 + 2394 1 514 568 532 494 + 2395 1 425 488 461 433 + 2396 1 425 488 433 371 + 2397 1 51 57 53 96 + 2398 1 441 520 561 473 + 2399 1 497 555 557 440 + 2400 1 587 600 644 625 + 2401 1 299 228 303 312 + 2402 1 218 246 261 205 + 2403 1 218 246 205 135 + 2404 1 450 428 523 547 + 2405 1 642 615 647 613 + 2406 1 191 237 141 160 + 2407 1 203 132 148 151 + 2408 1 397 306 301 439 + 2409 1 247 186 150 217 + 2410 1 206 217 258 133 + 2411 1 215 165 250 245 + 2412 1 227 254 344 300 + 2413 1 227 254 300 266 + 2414 1 496 434 493 477 + 2415 1 62 46 78 112 + 2416 1 563 541 504 475 + 2417 1 565 613 615 642 + 2418 1 589 605 641 535 + 2419 1 19 52 29 26 + 2420 1 29 19 26 20 + 2421 1 52 29 26 56 + 2422 1 29 26 56 40 + 2423 1 26 29 20 40 + 2424 1 29 20 40 54 + 2425 1 20 40 54 49 + 2426 1 40 29 54 55 + 2427 1 40 54 49 87 + 2428 1 40 54 87 80 + 2429 1 40 29 55 56 + 2430 1 619 548 546 533 + 2431 1 285 284 201 342 + 2432 1 133 182 199 161 + 2433 1 640 619 659 660 + 2434 1 339 421 309 393 + 2435 1 339 421 393 469 + 2436 1 279 323 292 228 + 2437 1 173 249 200 211 + 2438 1 173 249 211 333 + 2439 1 399 435 447 292 + 2440 1 344 227 300 277 + 2441 1 227 300 277 162 + 2442 1 277 227 162 189 + 2443 1 167 109 104 117 + 2444 1 135 119 118 65 + 2445 1 403 454 369 317 + 2446 1 305 374 434 429 + 2447 1 238 294 383 338 + 2448 1 238 294 338 341 + 2449 1 294 383 338 437 + 2450 1 253 183 246 192 + 2451 1 51 57 96 83 + 2452 1 119 67 120 86 + 2453 1 217 148 150 195 + 2454 1 271 253 246 327 + 2455 1 271 253 327 386 + 2456 1 253 246 327 289 + 2457 1 327 253 289 341 + 2458 1 327 253 341 336 + 2459 1 253 341 336 229 + 2460 1 336 253 229 386 + 2461 1 229 336 386 342 + 2462 1 336 386 342 504 + 2463 1 253 327 386 336 + 2464 1 226 235 281 330 + 2465 1 226 235 330 212 + 2466 1 502 472 554 458 + 2467 1 546 560 480 589 + 2468 1 546 560 589 639 + 2469 1 30 48 31 20 + 2470 1 289 192 253 246 + 2471 1 274 280 297 204 + 2472 1 31 15 20 16 + 2473 1 229 198 294 204 + 2474 1 371 432 518 505 + 2475 1 459 490 534 602 + 2476 1 40 54 80 55 + 2477 1 190 267 276 237 + 2478 1 515 600 525 566 + 2479 1 485 534 578 506 + 2480 1 485 534 506 478 + 2481 1 126 179 224 192 + 2482 1 504 492 437 336 + 2483 1 428 384 454 507 + 2484 1 384 454 507 547 + 2485 1 428 384 507 547 + 2486 1 500 491 544 477 + 2487 1 626 574 569 579 + 2488 1 564 475 562 603 + 2489 1 280 171 207 204 + 2490 1 363 373 491 500 + 2491 1 140 74 132 105 + 2492 1 567 477 544 491 + 2493 1 17 15 6 8 + 2494 1 188 155 100 140 + 2495 1 188 155 140 154 + 2496 1 113 84 50 63 + 2497 1 397 423 439 301 + 2498 1 227 181 162 189 + 2499 1 301 258 311 397 + 2500 1 199 210 133 161 + 2501 1 470 563 545 484 + 2502 1 545 470 484 398 + 2503 1 261 256 349 365 + 2504 1 620 570 589 546 + 2505 1 338 294 437 341 + 2506 1 145 143 107 207 + 2507 1 18 6 17 28 + 2508 1 17 18 28 44 + 2509 1 95 116 110 209 + 2510 1 227 300 162 197 + 2511 1 227 300 197 184 + 2512 1 162 227 197 184 + 2513 1 227 300 184 266 + 2514 1 327 289 401 341 + 2515 1 76 130 118 135 + 2516 1 426 343 503 469 + 2517 1 18 6 28 16 + 2518 1 189 186 231 166 + 2519 1 145 87 107 81 + 2520 1 627 564 562 603 + 2521 1 408 528 440 497 + 2522 1 48 75 86 119 + 2523 1 311 306 268 210 + 2524 1 284 398 297 342 + 2525 1 398 297 342 442 + 2526 1 104 161 167 117 + 2527 1 25 17 24 14 + 2528 1 410 450 296 393 + 2529 1 532 514 494 450 + 2530 1 118 126 119 192 + 2531 1 199 262 304 203 + 2532 1 199 262 203 148 + 2533 1 262 304 203 275 + 2534 1 255 220 143 209 + 2535 1 255 284 209 283 + 2536 1 493 470 545 377 + 2537 1 336 386 504 492 + 2538 1 292 273 167 263 + 2539 1 292 273 263 394 + 2540 1 377 441 513 308 + 2541 1 377 441 308 375 + 2542 1 603 553 601 541 + 2543 1 603 553 541 475 + 2544 1 410 514 494 552 + 2545 1 140 99 74 105 + 2546 1 422 492 541 386 + 2547 1 313 440 408 352 + 2548 1 290 272 222 214 + 2549 1 222 290 214 371 + 2550 1 535 606 605 641 + 2551 1 644 587 625 593 + 2552 1 268 312 214 228 + 2553 1 116 83 78 68 + 2554 1 116 83 68 110 + 2555 1 83 78 68 46 + 2556 1 83 68 110 96 + 2557 1 83 68 96 51 + 2558 1 83 68 51 46 + 2559 1 353 384 403 247 + 2560 1 576 520 493 609 + 2561 1 29 48 30 20 + 2562 1 224 236 371 222 + 2563 1 625 594 593 512 + 2564 1 228 299 161 268 + 2565 1 105 73 132 148 + 2566 1 367 486 356 436 + 2567 1 356 367 436 382 + 2568 1 474 489 580 558 + 2569 1 493 434 380 477 + 2570 1 83 141 96 110 + 2571 1 523 469 393 512 + 2572 1 261 349 374 429 + 2573 1 306 311 301 210 + 2574 1 628 593 532 568 + 2575 1 528 483 440 557 + 2576 1 132 105 148 151 + 2577 1 251 368 363 321 + 2578 1 304 394 439 335 + 2579 1 140 188 154 233 + 2580 1 432 395 497 508 + 2581 1 410 450 393 494 + 2582 1 419 317 264 404 + 2583 1 558 575 580 632 + 2584 1 533 565 602 459 + 2585 1 182 117 167 161 + 2586 1 24 18 17 44 + 2587 1 518 521 554 612 + 2588 1 334 402 268 311 + 2589 1 258 199 133 217 + 2590 1 66 100 117 109 + 2591 1 275 233 232 151 + 2592 1 233 232 151 140 + 2593 1 232 151 140 132 + 2594 1 151 140 132 105 + 2595 1 409 447 292 399 + 2596 1 512 587 593 625 + 2597 1 488 461 433 505 + 2598 1 433 488 505 371 + 2599 1 461 433 505 548 + 2600 1 208 323 228 252 + 2601 1 15 30 20 19 + 2602 1 148 150 195 105 + 2603 1 419 451 369 404 + 2604 1 566 535 515 600 + 2605 1 595 569 488 578 + 2606 1 113 147 150 186 + 2607 1 512 525 572 469 + 2608 1 123 84 112 46 + 2609 1 401 327 341 509 + 2610 1 565 494 613 552 + 2611 1 613 565 552 602 + 2612 1 312 290 214 228 + 2613 1 310 237 363 321 + 2614 1 533 479 459 385 + 2615 1 246 256 261 365 + 2616 1 243 185 177 168 + 2617 1 301 304 439 335 + 2618 1 565 613 642 602 + 2619 1 161 176 268 210 + 2620 1 445 391 350 320 + 2621 1 156 222 259 252 + 2622 1 499 484 398 545 + 2623 1 429 476 434 365 + 2624 1 552 510 459 410 + 2625 1 48 29 54 20 + 2626 1 341 336 294 437 + 2627 1 336 294 437 342 + 2628 1 85 117 133 161 + 2629 1 138 196 101 159 + 2630 1 138 196 159 178 + 2631 1 101 138 159 88 + 2632 1 138 159 88 178 + 2633 1 534 552 459 602 + 2634 1 453 500 513 373 + 2635 1 224 289 326 371 + 2636 1 17 15 8 19 + 2637 1 154 242 233 188 + 2638 1 494 593 613 568 + 2639 1 466 403 353 501 + 2640 1 482 524 583 585 + 2641 1 482 524 585 556 + 2642 1 294 383 437 389 + 2643 1 251 237 191 321 + 2644 1 121 133 210 161 + 2645 1 421 512 393 469 + 2646 1 355 263 348 232 + 2647 1 93 86 120 64 + 2648 1 65 54 118 76 + 2649 1 65 54 76 31 + 2650 1 607 572 551 523 + 2651 1 7 16 27 20 + 2652 1 228 292 303 323 + 2653 1 118 135 65 76 + 2654 1 200 174 173 211 + 2655 1 200 174 211 331 + 2656 1 306 335 301 439 + 2657 1 235 347 281 330 + 2658 1 347 281 330 332 + 2659 1 217 148 195 262 + 2660 1 561 591 584 633 + 2661 1 561 591 633 596 + 2662 1 584 561 633 581 + 2663 1 573 585 631 583 + 2664 1 242 234 213 328 + 2665 1 242 234 328 355 + 2666 1 213 242 328 329 + 2667 1 330 226 212 332 + 2668 1 595 574 533 488 + 2669 1 342 484 398 442 + 2670 1 548 517 433 505 + 2671 1 78 76 31 65 + 2672 1 78 76 65 135 + 2673 1 594 625 572 512 + 2674 1 172 165 135 78 + 2675 1 245 349 365 309 + 2676 1 137 107 103 171 + 2677 1 137 107 171 207 + 2678 1 222 259 313 269 + 2679 1 313 222 269 224 + 2680 1 275 319 195 262 + 2681 1 408 259 320 269 + 2682 1 249 211 333 331 + 2683 1 45 64 93 109 + 2684 1 124 103 80 101 + 2685 1 661 664 668 670 + 2686 1 661 664 670 663 + 2687 1 664 670 663 669 + 2688 1 664 668 670 669 + 2689 1 147 217 150 186 + 2690 1 663 635 649 620 + 2691 1 338 238 341 350 + 2692 1 341 338 350 431 + 2693 1 338 350 431 383 + 2694 1 341 338 431 492 + 2695 1 431 338 383 437 + 2696 1 338 238 350 291 + 2697 1 350 341 431 508 + 2698 1 431 338 437 492 + 2699 1 105 151 195 148 + 2700 1 200 196 124 198 + 2701 1 326 401 289 341 + 2702 1 326 401 341 508 + 2703 1 612 569 610 652 + 2704 1 279 388 292 411 + 2705 1 317 419 369 404 + 2706 1 251 283 321 191 + 2707 1 492 336 341 437 + 2708 1 660 669 659 664 + 2709 1 90 72 123 84 + 2710 1 123 90 84 46 + 2711 1 91 44 63 50 + 2712 1 369 404 265 317 + 2713 1 11 26 20 22 + 2714 1 155 100 140 99 + 2715 1 150 247 217 195 + 2716 1 383 238 338 291 + 2717 1 272 303 323 228 + 2718 1 366 400 246 365 + 2719 1 250 365 246 400 + 2720 1 263 335 304 301 + 2721 1 434 429 365 305 + 2722 1 497 465 395 408 + 2723 1 380 377 493 513 + 2724 1 341 338 492 437 + 2725 1 48 67 119 86 + 2726 1 294 286 274 198 + 2727 1 587 600 625 572 + 2728 1 483 489 557 582 + 2729 1 483 489 582 580 + 2730 1 69 103 101 80 + 2731 1 259 313 269 408 + 2732 1 411 323 447 292 + 2733 1 4 8 6 5 + 2734 1 6 4 5 3 + 2735 1 4 8 5 2 + 2736 1 32 60 56 40 + 2737 1 644 656 647 593 + 2738 1 628 656 625 593 + 2739 1 22 32 26 40 + 2740 1 17 6 14 8 + 2741 1 445 465 320 395 + 2742 1 233 329 348 242 + 2743 1 280 414 389 297 + 2744 1 413 446 321 310 + 2745 1 60 69 56 80 + 2746 1 41 86 93 64 + 2747 1 415 390 277 344 + 2748 1 251 363 237 321 + 2749 1 3 9 7 6 + 2750 1 2 10 11 5 + 2751 1 11 2 5 8 + 2752 1 5 11 8 15 + 2753 1 8 5 15 6 + 2754 1 5 15 6 7 + 2755 1 5 15 7 10 + 2756 1 473 581 559 561 + 2757 1 160 97 190 141 + 2758 1 419 469 551 498 + 2759 1 203 262 275 195 + 2760 1 455 327 433 509 + 2761 1 232 233 348 242 + 2762 1 232 233 242 188 + 2763 1 242 232 188 355 + 2764 1 170 239 196 178 + 2765 1 313 371 222 224 + 2766 1 84 46 63 112 + 2767 1 182 263 304 301 + 2768 1 469 523 551 572 + 2769 1 481 473 561 581 + 2770 1 20 10 7 15 + 2771 1 574 505 579 540 + 2772 1 47 54 20 31 + 2773 1 578 595 602 490 + 2774 1 10 20 11 15 + 2775 1 659 662 664 669 + 2776 1 228 214 208 252 + 2777 1 332 248 351 281 + 2778 1 440 432 497 555 + 2779 1 551 469 572 503 + 2780 1 63 28 50 44 + 2781 1 269 395 320 408 + 2782 1 184 125 190 131 + 2783 1 477 373 513 500 + 2784 1 56 80 40 60 + 2785 1 175 226 248 332 + 2786 1 308 284 375 283 + 2787 1 246 183 135 192 + 2788 1 2 10 5 7 + 2789 1 5 4 2 1 + 2790 1 5 4 1 3 + 2791 1 2 5 1 3 + 2792 1 520 377 513 493 + 2793 1 520 377 493 545 + 2794 1 493 520 545 609 + 2795 1 626 574 579 601 + 2796 1 346 354 249 331 + 2797 1 249 200 211 331 + 2798 1 354 331 240 200 + 2799 1 640 659 664 660 + 2800 1 532 494 393 450 + 2801 1 281 226 330 332 + 2802 1 525 421 426 469 + 2803 1 169 209 283 255 + 2804 1 152 170 269 224 + 2805 1 151 203 275 195 + 2806 1 151 203 195 148 + 2807 1 113 84 63 112 + 2808 1 199 301 210 306 + 2809 1 199 301 306 225 + 2810 1 314 329 213 328 + 2811 1 622 631 585 583 + 2812 1 623 580 582 632 + 2813 1 315 330 212 332 + 2814 1 671 669 670 668 + 2815 1 333 211 316 331 + 2816 1 633 581 624 584 + 2817 1 373 477 491 500 + 2818 1 563 541 475 603 + 2819 1 216 209 116 205 + 2820 1 435 478 439 306 + 2821 1 442 484 437 342 + 2822 1 551 469 503 498 + 2823 1 28 15 16 6 + 2824 1 506 399 447 502 + 2825 1 562 590 496 493 + 2826 1 265 264 317 404 + 2827 1 233 329 242 213 + 2828 1 137 171 204 207 + 2829 1 97 131 190 125 + 2830 1 437 504 336 342 + 2831 1 203 262 195 148 + 2832 1 162 131 115 184 + 2833 1 294 229 204 342 + 2834 1 144 165 172 78 + 2835 1 178 152 269 259 + 2836 1 200 171 137 103 + 2837 1 520 559 561 473 + 2838 1 489 575 557 582 + 2839 1 563 493 545 609 + 2840 1 341 401 509 508 + 2841 1 380 477 513 493 + 2842 1 2 5 3 7 + 2843 1 5 3 7 6 + 2844 1 305 246 261 365 + 2845 1 214 222 163 252 + 2846 1 28 46 50 23 + 2847 1 294 383 389 274 + 2848 1 389 294 274 297 + 2849 1 217 148 262 199 + 2850 1 290 272 214 228 + 2851 1 426 503 538 572 + 2852 1 164 188 100 117 + 2853 1 368 321 467 500 + 2854 1 596 520 561 591 + 2855 1 187 141 116 110 + 2856 1 5 11 15 10 + 2857 1 18 28 44 50 + 2858 1 18 28 50 23 + 2859 1 91 63 113 50 + 2860 1 198 294 204 274 + 2861 1 633 561 596 559 + 2862 1 408 352 259 313 + 2863 1 308 373 453 513 + 2864 1 96 141 160 191 + 2865 1 386 475 504 541 + 2866 1 96 141 191 110 + 2867 1 46 31 78 68 + 2868 1 109 164 100 117 + 2869 1 268 244 311 210 + 2870 1 575 580 632 582 + 2871 1 328 242 355 348 + 2872 1 568 547 495 450 + 2873 1 182 117 161 133 + 2874 1 54 20 31 48 + 2875 1 575 489 580 582 + 2876 1 222 152 259 269 + 2877 1 222 152 269 224 + 2878 1 459 410 494 552 + 2879 1 488 461 505 548 + 2880 1 338 350 383 291 + 2881 1 377 398 470 545 + 2882 1 159 196 278 178 + 2883 1 18 28 23 16 + 2884 1 172 116 78 135 + 2885 1 356 266 382 300 + 2886 1 239 269 320 178 + 2887 1 608 628 532 568 + 2888 1 321 191 276 237 + 2889 1 191 276 237 160 + 2890 1 350 395 508 445 + 2891 1 350 395 445 320 + 2892 1 442 437 389 294 + 2893 1 265 369 317 247 + 2894 1 369 317 247 403 + 2895 1 594 523 512 572 + 2896 1 554 458 506 502 + 2897 1 494 565 459 552 + 2898 1 348 232 242 355 + 2899 1 329 348 242 328 + 2900 1 250 246 135 192 + 2901 1 508 555 497 432 + 2902 1 534 490 578 602 + 2903 1 581 559 561 633 + 2904 1 575 632 557 582 + 2905 1 217 247 317 384 + 2906 1 365 429 261 305 + 2907 1 281 226 332 248 + 2908 1 660 663 669 664 + 2909 1 160 190 276 237 + 2910 1 259 320 269 178 + 2911 1 341 326 253 289 + 2912 1 249 200 331 354 + 2913 1 30 29 20 19 + 2914 1 246 250 400 289 + 2915 1 606 535 600 641 + 2916 1 363 368 500 321 + 2917 1 641 600 644 589 + 2918 1 641 600 589 535 + 2919 1 517 433 505 540 + 2920 1 169 143 209 255 + 2921 1 196 239 278 178 + 2922 1 237 141 160 190 + 2923 1 297 204 342 294 + 2924 1 523 469 512 572 + 2925 1 130 205 135 116 + 2926 1 130 205 116 209 + 2927 1 525 572 469 426 + 2928 1 306 225 161 199 + 2929 1 247 217 195 319 + 2930 1 20 11 15 19 + 2931 1 297 274 204 294 + 2932 1 266 184 281 300 + 2933 1 442 389 297 294 + 2934 1 512 587 625 572 + 2935 1 209 187 116 110 + 2936 1 320 178 278 239 + 2937 1 278 320 239 350 + 2938 1 46 28 16 23 + 2939 1 247 317 384 403 + 2940 1 431 492 508 341 + 2941 1 503 426 469 572 + 2942 1 250 246 192 289 + 2943 1 565 459 552 602 + 2944 1 15 20 16 7 + 2945 1 16 15 7 6 + 2946 1 492 509 508 341 + 2947 1 319 195 262 217 + 2948 1 384 353 217 247 + 2949 1 306 268 210 161 + 2950 1 319 353 247 217 + 2951 1 320 278 391 350 + 2952 1 297 342 442 294 + 2953 1 210 199 306 161 + 2954 1 294 437 342 442 +End Elements + +Begin Conditions WallCondition3D3N// GUI group identifier: _HIDDEN__SKIN_ + 1 0 622 583 631 + 2 0 328 357 355 + 3 0 637 652 612 + 4 0 656 651 628 + 5 0 412 360 387 + 6 0 526 580 558 + 7 0 669 671 668 + 8 0 529 466 501 + 9 0 411 463 447 + 10 0 655 665 646 + 11 0 636 631 592 + 12 0 329 314 328 + 13 0 623 632 580 + 14 0 668 666 662 + 15 0 583 529 543 + 16 0 357 411 388 + 17 0 652 655 629 + 18 0 651 636 608 + 19 0 360 329 348 + 20 0 466 412 443 + 21 0 463 526 502 + 22 0 665 669 659 + 23 0 632 637 597 + 24 0 666 656 647 + 25 0 355 357 388 + 26 0 355 388 394 + 27 0 592 631 583 + 28 0 502 526 558 + 29 0 502 558 554 + 30 0 394 388 435 + 31 0 554 558 597 + 32 0 597 558 632 + 33 0 502 554 506 + 34 0 558 580 632 + 35 0 629 655 646 + 36 0 629 646 602 + 37 0 602 646 642 + 38 0 629 602 578 + 39 0 628 651 608 + 40 0 628 608 568 + 41 0 568 608 547 + 42 0 628 568 613 + 43 0 543 529 501 + 44 0 543 501 547 + 45 0 597 637 612 + 46 0 597 612 554 + 47 0 447 463 502 + 48 0 447 502 506 + 49 0 447 506 435 + 50 0 435 506 478 + 51 0 447 435 388 + 52 0 478 506 534 + 53 0 435 478 439 + 54 0 447 388 411 + 55 0 348 329 328 + 56 0 612 652 629 + 57 0 612 629 578 + 58 0 612 578 554 + 59 0 662 666 647 + 60 0 662 647 642 + 61 0 659 669 662 + 62 0 501 466 443 + 63 0 501 443 495 + 64 0 495 443 439 + 65 0 501 495 547 + 66 0 608 636 592 + 67 0 608 592 547 + 68 0 547 592 543 + 69 0 543 592 583 + 70 0 387 360 348 + 71 0 387 348 394 + 72 0 647 656 628 + 73 0 647 628 613 + 74 0 647 613 642 + 75 0 646 665 659 + 76 0 646 659 642 + 77 0 642 659 662 + 78 0 662 669 668 + 79 0 443 412 387 + 80 0 443 387 439 + 81 0 328 355 348 + 82 0 348 355 394 + 83 0 439 478 510 + 84 0 435 439 394 + 85 0 394 439 387 + 86 0 506 554 578 + 87 0 578 602 534 + 88 0 613 568 552 + 89 0 602 642 613 + 90 0 568 547 495 + 91 0 510 478 534 + 92 0 439 510 495 + 93 0 534 602 552 + 94 0 578 534 506 + 95 0 552 568 510 + 96 0 613 552 602 + 97 0 495 510 568 + 98 0 552 510 534 +End Conditions + +Begin SubModelPart FluidParts_Parts_Auto1 // Group Parts Auto1 // Subtree Parts + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart +Begin SubModelPart NoSlip3D_No_Slip_Auto1 // Group No Slip Auto1 // Subtree NoSlip3D + Begin SubModelPartNodes + 314 + 328 + 329 + 348 + 355 + 357 + 360 + 387 + 388 + 394 + 411 + 412 + 435 + 439 + 443 + 447 + 463 + 466 + 478 + 495 + 501 + 502 + 506 + 510 + 526 + 529 + 534 + 543 + 547 + 552 + 554 + 558 + 568 + 578 + 580 + 583 + 592 + 597 + 602 + 608 + 612 + 613 + 622 + 623 + 628 + 629 + 631 + 632 + 636 + 637 + 642 + 646 + 647 + 651 + 652 + 655 + 656 + 659 + 662 + 665 + 666 + 668 + 669 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + End SubModelPartConditions +End SubModelPart +Begin SubModelPart TEMPERATURE_Parts_Auto1 // Group Parts Auto1 // Subtree TEMPERATURE + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + End SubModelPartConditions +End SubModelPart +Begin SubModelPart HeatFlux3D_Thermal_face_conditions_Auto3 // Group Thermal face conditions Auto3 // Subtree HeatFlux3D + Begin SubModelPartNodes + 1 + 2 + 3 + 7 + 10 + 12 + 13 + 21 + 22 + 27 + 32 + 33 + 49 + 53 + 57 + 60 + 69 + 70 + 81 + 96 + 102 + 103 + 107 + 110 + 127 + 128 + 143 + 157 + 160 + 169 + 171 + 174 + 191 + 207 + 211 + 212 + 235 + 240 + 255 + 276 + 280 + 283 + 315 + 316 + 321 + 322 + 330 + 331 + 358 + 361 + 375 + 405 + 406 + 413 + 414 + 464 + 467 + 473 + 481 + 527 + 530 + 581 + 584 + 624 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements +End SubModelPart +Begin SubModelPart ImposedTemperature3D_Imposed_temperature_Auto1 // Group Imposed temperature Auto1 // Subtree ImposedTemperature3D + Begin SubModelPartNodes + 314 + 328 + 329 + 348 + 355 + 357 + 360 + 387 + 388 + 394 + 411 + 412 + 435 + 439 + 443 + 447 + 463 + 466 + 478 + 495 + 501 + 502 + 506 + 510 + 526 + 529 + 534 + 543 + 547 + 552 + 554 + 558 + 568 + 578 + 580 + 583 + 592 + 597 + 602 + 608 + 612 + 613 + 622 + 623 + 628 + 629 + 631 + 632 + 636 + 637 + 642 + 646 + 647 + 651 + 652 + 655 + 656 + 659 + 662 + 665 + 666 + 668 + 669 + 671 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + End SubModelPartConditions +End SubModelPart +Begin SubModelPart ThermalFace3D_Thermal_face_conditions_Auto3 // Group Thermal face conditions Auto3 // Subtree ThermalFace3D + Begin SubModelPartNodes + 1 + 2 + 3 + 7 + 10 + 12 + 13 + 21 + 22 + 27 + 32 + 33 + 49 + 53 + 57 + 60 + 69 + 70 + 81 + 96 + 102 + 103 + 107 + 110 + 127 + 128 + 143 + 157 + 160 + 169 + 171 + 174 + 191 + 207 + 211 + 212 + 235 + 240 + 255 + 276 + 280 + 283 + 315 + 316 + 321 + 322 + 330 + 331 + 358 + 361 + 375 + 405 + 406 + 413 + 414 + 464 + 467 + 473 + 481 + 527 + 530 + 581 + 584 + 624 + End SubModelPartNodes + Begin SubModelPartElements + End SubModelPartElements +End SubModelPart diff --git a/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.msh b/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.msh new file mode 100644 index 000000000000..8965da5598c1 Binary files /dev/null and b/applications/PfemMeltingApplication/test_examples/square_modified_new/polimero_prueba_q.msh differ diff --git a/kratos/sources/model_part.cpp b/kratos/sources/model_part.cpp index 741526851dc1..a6517b4465f0 100644 --- a/kratos/sources/model_part.cpp +++ b/kratos/sources/model_part.cpp @@ -2014,7 +2014,7 @@ ModelPart& ModelPart::CreateSubModelPart(std::string const& NewSubModelPartName ModelPart& ModelPart::GetSubModelPart(std::string const& SubModelPartName) { SubModelPartIterator i = mSubModelParts.find(SubModelPartName); - KRATOS_ERROR_IF(i == mSubModelParts.end()) << "There is no sub model part with name: \"" << SubModelPartName << "\" in model part\"" << Name() << "\"" << std::endl; + KRATOS_ERROR_IF(i == mSubModelParts.end()) << "There is no sub model part with name: \"" << SubModelPartName << "\" in model part \"" << Name() << "\"" << std::endl; return *i; } @@ -2022,7 +2022,7 @@ ModelPart& ModelPart::GetSubModelPart(std::string const& SubModelPartName) ModelPart* ModelPart::pGetSubModelPart(std::string const& SubModelPartName) { SubModelPartIterator i = mSubModelParts.find(SubModelPartName); - KRATOS_ERROR_IF(i == mSubModelParts.end()) << "There is no sub model part with name: \"" << SubModelPartName << "\" in model part\"" << Name() << "\"" << std::endl; + KRATOS_ERROR_IF(i == mSubModelParts.end()) << "There is no sub model part with name: \"" << SubModelPartName << "\" in model part \"" << Name() << "\"" << std::endl; return (i.base()->second).get(); }