.. Salome_Axi documentation master file, created by sphinx-quickstart on Tue Dec 4 11:40:19 2018. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. ################################################ Model of Skimming Tank Hocol Toldado field ############################################### :author: Hernando Gasca Garzón .. tabularcolumns:: | p{32pt} | p{54pt} | p{326pt} | +-----------+------------+-------------------------------------------------------------------------------------+ | Version | Date | Description | +===========+============+=====================================================================================+ | 0 | 2018-12-18 | axisymmetric model Geometry and mesh in Salome - CFd in openFoam | +-----------+------------+-------------------------------------------------------------------------------------+ In this documentation you can obtain basis for: - Axisymmetric Meshing. - Turbulence and multiphase fluid modeling. =============================== PY-A873 Skimming Hocol Toldado =============================== ---------------- Create Geometry ---------------- .. code-block:: bash # -*- coding: utf-8 -*- ### ### This file is generated automatically by SALOME v7.8.0 with dump python functionality ### import sys import salome #Parámetros #Radio Skimming RSk=4.57 #Altura Mayor skimming HSk=6.746 #Radio tubo central distribuidor RDist=0.305 #Altura tubo distribuidor central HDist=2.1 #Radio hasta inicio caja de agua RIcajaH2O=2.832 #Longitud caja de agua LcajaH2O=1 #altura caja de agua HcajaH2O=0.8 #Longitud caja aceite LcajaOil=0.457 # Altura caja de aceite HcajaOil=0.444 #Altura diente sierra Hds=0.026 #Diámetro boquilla DBoq=0.00231911516659705 #Radio ubicación centro Boquilla 1 Rbq1=0.381 # Distancia entre Boquillas Pitch=0.406 #Altura boquillas Hboq=1.8 #Diámetro tubo H2O DH2O=0.2032 #Profundidad salida de agua HH2O= -0.532 # Radio localización salida agua RLH2O=3.23 salome.salome_init() theStudy = salome.myStudy import salome_notebook notebook = salome_notebook.NoteBook(theStudy) sys.path.insert( 0, r'/home/hernando') ### ### GEOM component ### import GEOM from salome.geom import geomBuilder import math import SALOMEDS geompy = geomBuilder.New(theStudy) O = geompy.MakeVertex(0, 0, 0) OX = geompy.MakeVectorDXDYDZ(1, 0, 0) OY = geompy.MakeVectorDXDYDZ(0, 1, 0) OZ = geompy.MakeVectorDXDYDZ(0, 0, 1) # Cuerpo del Tanque geomObj_1 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0) sk = geompy.Sketcher2D() sk.addPoint(RDist, 0.0000000) sk.addSegmentRelative(RIcajaH2O-RDist, 0.0000000) sk.addSegmentRelative(0,-HcajaH2O) sk.addSegmentRelative(LcajaH2O,0) sk.addSegmentRelative(0, HcajaH2O) sk.addSegmentRelative(RSk-RIcajaH2O-LcajaH2O,0) sk.addSegmentRelative(0, HSk-HcajaOil) sk.addSegmentRelative(-LcajaOil,0) sk.addSegmentRelative(0, HcajaOil-Hds) sk.addSegmentRelative(Hds/2,0) sk.addSegmentRelative(0, Hds) sk.addSegmentRelative(-(RSk+Hds/2-LcajaOil),0) sk.addSegmentRelative(0, -(HSk-HDist)) sk.addSegmentRelative(RDist,0) sk.addSegmentRelative(0, -HDist) sk.close() Sketch_1_1 = sk.wire(geomObj_1) geompy.addToStudy( Sketch_1_1, 'Sketch_1_1' ) #Sketch_1 = geompy.MakeFillet1D(Sketch_1_1,HSk/5000,[]) # Primer elemento del difusor 1 geomObj_5 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0) LocalCS_1 = geompy.MakeMarker(Rbq1-DBoq/2, Hboq, 0, 1, 0, 0, 0, 1, 0) sk = geompy.Sketcher2D() sk.addPoint(0.0000000, 0) sk.addSegmentRelative(DBoq, 0.0000000) sk.addSegmentRelative(0.0000000,DBoq) sk.addSegmentRelative(-DBoq, 0.0000000) sk.addSegmentRelative(0.0000000, -DBoq) sk.close() Sketch_4 = sk.wire(LocalCS_1) # Salida de agua geomObj_2 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0) LocalCS_2 = geompy.MakeMarker(RLH2O,HH2O, 0, 1, 0, 0, 0, 1, 0) sk = geompy.Sketcher2D() sk.addPoint(0, 0) sk.addSegmentRelative(DH2O, 0.0000000) sk.addSegmentRelative(0.0000000,4*DH2O) sk.addSegmentRelative(-DH2O, 0.0000000) sk.addSegmentRelative(0.0000000, -4*DH2O) sk.close() Sketch_2 = sk.wire(LocalCS_2) # AddtoStudy General 1 geompy.addToStudy( O, 'O' ) geompy.addToStudy( OX, 'OX' ) geompy.addToStudy( OY, 'OY' ) geompy.addToStudy( OZ, 'OZ' ) geompy.addToStudy( Sketch_1_1, 'Cuerpo' ) geompy.addToStudy( Sketch_2, 'SalH2O' ) # Boquilla 1 geompy.addToStudy( LocalCS_1, 'LocalCS_1' ) geompy.addToStudy( LocalCS_2, 'LocalCS_2' ) geompy.addToStudy( Sketch_4, 'Sketch_4' ) geomObj_6 = geompy.MakeMarker(0, 0, 0, 1, 0, 0, 0, 1, 0) Difusor1=geompy.MakeFuseList([Sketch_4],True,True) geompy.addToStudy( Difusor1, 'Difusor1' ) # Entradas Fuse_3=Sketch_4 for x in range(0,10): Translation_1 = geompy.MakeTranslation(Sketch_4, x*Pitch, 0, 0) Fuse_1 = geompy.MakeFuseList([Translation_1, Fuse_3], True, True) geompy.addToStudyInFather(Difusor1, Translation_1, 'Translation1_'+str(x)) geompy.addToStudy( Fuse_1, 'Fuse_1' ) Fuse_3=Fuse_1 geompy.addToStudy( Fuse_3, 'Fuse_3' ) Fuse_2 = geompy.MakeFuseList([Sketch_1_1,Sketch_2,Fuse_1], True, True) geompy.addToStudy( O, 'O' ) geompy.addToStudy( OX, 'OX' ) geompy.addToStudy( OY, 'OY' ) geompy.addToStudy( OZ, 'OZ' ) geompy.addToStudy( Sketch_1_1, 'Sketch_1_1' ) geompy.addToStudy( LocalCS_1, 'LocalCS_1' ) geompy.addToStudy( Sketch_4, 'Sketch_4' ) geompy.addToStudy( LocalCS_2, 'LocalCS_2' ) geompy.addToStudy( Difusor1, 'Difusor1' ) geompy.addToStudy( Fuse_2, 'Fuse_2' ) Face_1 = geompy.MakeFaceWires([Fuse_2], 1) geompy.addToStudy( Face_1, 'Face_1' ) #Crea grupos desde la geometría Techo = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(Techo, [24]) movingWall = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(movingWall, [26]) Fondo = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(Fondo, [3, 8, 12, 28]) Pared = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(Pared, [18, 14, 30, 10, 6, 20]) outOil = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(outOil, [22]) outH2O = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(outH2O, [32]) geompy.DifferenceIDs(Pared, [18, 14, 30, 10, 6, 20]) geompy.UnionIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39]) geompy.DifferenceIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39]) geompy.UnionIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39]) geompy.DifferenceIDs(Techo, [24]) geompy.UnionIDs(Techo, [24, 16]) geompy.DifferenceIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39]) geompy.UnionIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39, 86, 122, 77, 50, 59, 113, 68, 41, 104, 95]) geompy.DifferenceIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39, 86, 122, 77, 50, 59, 113, 68, 41, 104, 95]) geompy.UnionIDs(Pared, [18, 14, 30, 10, 6, 20, 35, 37, 39, 86, 122, 77, 50, 59, 113, 68, 41, 104, 95, 129, 125, 120, 116, 111, 107, 102, 98, 93, 89, 84, 80, 75, 71, 66, 62, 57, 53, 48, 44]) E1 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E1, [127]) E2 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E2, [118]) E3 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E3, [109]) E4 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E4, [100]) E5 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E5, [91]) E6 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E6, [82]) E7 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E7, [73]) E8 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E8, [64]) E9 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E9, [55]) E10 = geompy.CreateGroup(Face_1, geompy.ShapeType["EDGE"]) geompy.UnionIDs(E10, [46]) geompy.addToStudyInFather( Face_1, Techo, 'Techo' ) geompy.addToStudyInFather( Face_1, movingWall, 'movingWall' ) geompy.addToStudyInFather( Face_1, Fondo, 'Fondo' ) geompy.addToStudyInFather( Face_1, Pared, 'Pared' ) geompy.addToStudyInFather( Face_1, outOil, 'outOil' ) geompy.addToStudyInFather( Face_1, outH2O, 'outH2O' ) geompy.addToStudyInFather( Face_1, E1, 'E1' ) geompy.addToStudyInFather( Face_1, E2, 'E2' ) geompy.addToStudyInFather( Face_1, E3, 'E3' ) geompy.addToStudyInFather( Face_1, E4, 'E4' ) geompy.addToStudyInFather( Face_1, E5, 'E5' ) geompy.addToStudyInFather( Face_1, E6, 'E6' ) geompy.addToStudyInFather( Face_1, E10, 'E10' ) geompy.addToStudyInFather( Face_1, E9, 'E9' ) geompy.addToStudyInFather( Face_1, E8, 'E8' ) geompy.addToStudyInFather( Face_1, E7, 'E7' ) This model was done for an axysimmetric model but it was an openFoam Tool that converted a volumme of one (1) element depth into a wedge. It is not available now. Then for axisymmetric wedge convert this code using as a gude the PY-A910 project. .. code-block:: bash ### ### SMESH component ### import SMESH, SALOMEDS from salome.smesh import smeshBuilder smesh = smeshBuilder.New(theStudy) Mesh_1 = smesh.Mesh(Face_1) NETGEN_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D) NETGEN_2D_Parameters = NETGEN_2D.Parameters() NETGEN_2D_Parameters.SetMaxSize( 0.05 ) NETGEN_2D_Parameters.SetSecondOrder( 0 ) NETGEN_2D_Parameters.SetOptimize( 1 ) NETGEN_2D_Parameters.SetFineness( 3 ) NETGEN_2D_Parameters.SetMinSize( 0.0005 ) NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 ) NETGEN_2D_Parameters.SetFuseEdges( 1 ) NETGEN_2D_Parameters.SetQuadAllowed( 0 ) Viscous_Layers_2D_1 = NETGEN_2D.ViscousLayers2D(0.05,5,3) isDone = Mesh_1.Compute() Techo_1 = Mesh_1.GroupOnGeom(Techo,'Techo',SMESH.EDGE) movingWall_1 = Mesh_1.GroupOnGeom(movingWall,'movingWall',SMESH.EDGE) Fondo_1 = Mesh_1.GroupOnGeom(Fondo,'Fondo',SMESH.EDGE) Pared_1 = Mesh_1.GroupOnGeom(Pared,'Pared',SMESH.EDGE) outOil_1 = Mesh_1.GroupOnGeom(outOil,'outOil',SMESH.EDGE) outH2O_1 = Mesh_1.GroupOnGeom(outH2O,'outH2O',SMESH.EDGE) E1_1 = Mesh_1.GroupOnGeom(E1,'E1',SMESH.EDGE) E2_1 = Mesh_1.GroupOnGeom(E2,'E2',SMESH.EDGE) E3_1 = Mesh_1.GroupOnGeom(E3,'E3',SMESH.EDGE) E4_1 = Mesh_1.GroupOnGeom(E4,'E4',SMESH.EDGE) E5_1 = Mesh_1.GroupOnGeom(E5,'E5',SMESH.EDGE) E6_1 = Mesh_1.GroupOnGeom(E6,'E6',SMESH.EDGE) E10_1 = Mesh_1.GroupOnGeom(E10,'E10',SMESH.EDGE) E9_1 = Mesh_1.GroupOnGeom(E9,'E9',SMESH.EDGE) E8_1 = Mesh_1.GroupOnGeom(E8,'E8',SMESH.EDGE) E7_1 = Mesh_1.GroupOnGeom(E7,'E7',SMESH.EDGE) [ Techo_extruded, movingWall_extruded, Fondo_extruded, Pared_extruded, outOil_extruded, outH2O_extruded, E1_extruded, E2_extruded, E3_extruded, E4_extruded, E5_extruded, E6_extruded, E10_extruded, E9_extruded, E8_extruded, E7_extruded, Techo_top, movingWall_top, Fondo_top, Pared_top, outOil_top, outH2O_top, E1_top, E2_top, E3_top, E4_top, E5_top, E6_top, E10_top, E9_top, E8_top, E7_top ] = Mesh_1.ExtrusionSweepObjects( [], [], [ Mesh_1 ], [ 0, 0, 0.01 ], 1, 1 ) ## Set names of Mesh objects smesh.SetName(NETGEN_2D.GetAlgorithm(), 'NETGEN_2D') smesh.SetName(E2_extruded, 'E2_extruded') smesh.SetName(E3_extruded, 'E3_extruded') smesh.SetName(Viscous_Layers_2D_1, 'Viscous Layers 2D_1') smesh.SetName(NETGEN_2D_Parameters, 'NETGEN 2D Parameters') smesh.SetName(movingWall_top, 'movingWall_top') smesh.SetName(Techo_extruded, 'Techo_extruded') smesh.SetName(Fondo_top, 'Fondo_top') smesh.SetName(movingWall_extruded, 'movingWall_extruded') smesh.SetName(Fondo_extruded, 'Fondo_extruded') smesh.SetName(Pared_extruded, 'Pared_extruded') smesh.SetName(outOil_extruded, 'outOil_extruded') smesh.SetName(outH2O_extruded, 'outH2O_extruded') smesh.SetName(E1_extruded, 'E1_extruded') smesh.SetName(E4_1, 'E4') smesh.SetName(E5_1, 'E5') smesh.SetName(E6_1, 'E6') smesh.SetName(E10_1, 'E10') smesh.SetName(E9_1, 'E9') smesh.SetName(E8_1, 'E8') smesh.SetName(E7_1, 'E7') smesh.SetName(Techo_top, 'Techo_top') smesh.SetName(Mesh_1.GetMesh(), 'Mesh_1') smesh.SetName(E5_extruded, 'E5_extruded') smesh.SetName(E4_extruded, 'E4_extruded') smesh.SetName(E10_extruded, 'E10_extruded') smesh.SetName(E6_extruded, 'E6_extruded') smesh.SetName(E8_extruded, 'E8_extruded') smesh.SetName(E9_extruded, 'E9_extruded') smesh.SetName(E7_extruded, 'E7_extruded') smesh.SetName(E3_1, 'E3') smesh.SetName(E10_top, 'E10_top') smesh.SetName(E2_1, 'E2') smesh.SetName(E6_top, 'E6_top') smesh.SetName(E1_top, 'E1_top') smesh.SetName(outH2O_top, 'outH2O_top') smesh.SetName(Techo_1, 'Techo') smesh.SetName(outOil_top, 'outOil_top') smesh.SetName(Pared_top, 'Pared_top') smesh.SetName(Fondo_1, 'Fondo') smesh.SetName(E5_top, 'E5_top') smesh.SetName(movingWall_1, 'movingWall') smesh.SetName(E7_top, 'E7_top') smesh.SetName(E4_top, 'E4_top') smesh.SetName(outOil_1, 'outOil') smesh.SetName(E3_top, 'E3_top') smesh.SetName(Pared_1, 'Pared') smesh.SetName(E9_top, 'E9_top') smesh.SetName(E2_top, 'E2_top') smesh.SetName(E1_1, 'E1') smesh.SetName(E8_top, 'E8_top') smesh.SetName(outH2O_1, 'outH2O') if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(1) ================= Use on OpenFOAM ================= Export UNV file Mesh_1 and copy un /hgasca/OpenFOAM/run/case .. code-block:: bash ideasUnvToFoam Mesh_1.unv .. code-block:: bash collapseEdges it creates a new time Then replace constant Mesh by new time mesh and review names of boundaries .. code-block:: bash FoamFile { version 2.0; format ascii; class polyBoundaryMesh; location "1/polyMesh"; object boundary; } ---------------- openFoam Flies ---------------- Assign patches File polimesh is located on ~hgasca/openFoam/hgasca6/run/zHOCOL/0.01 after you create the wedge by collapseEdges command. In the folder 0.01 (Equivalent to 0 in not axisymmetric models) you should find: Files Folder 0.01 ----------------------- .. toctree:: :maxdepth: 2 0.01/p 0.01/alphaair 0.01/alphaoil 0.01/alphawater 0.01/alphas 0.01/epsilon 0.01/epsilonair 0.01/epsilonwater 0.01/epsilonoil 0.01/k 0.01/kair 0.01/koil 0.01/kwater 0.01/nut 0.01/nutair 0.01/nutoil 0.01/nutwater 0.01/p_rgh 0.01/Uair 0.01/Uoil 0.01/Uwater The files alpha will be changed in the first run, you should make a copy of them with .orig extension. The sum of all phases in each inlet, outlet, body must be 1 in order to preserve mass conservation. In this special case we have a constant folder into de 0.01 with the important file: .. code-block:: bash /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 4.1 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format binary; class polyBoundaryMesh; location "0.01/polyMesh"; object boundary; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 8 ( Techo { type wall; nFaces 47; startFace 28296; } Fondo { type wall; nFaces 93; startFace 28343; } Pared { type wall; nFaces 1320; startFace 28436; } outOil { type patch; nFaces 15; startFace 29756; } Entrada { type patch; nFaces 150; startFace 29771; } outH2O { type patch; nFaces 20; startFace 29921; } frontAndBack_pos { type wedge; inGroups 1(wedge); nFaces 19423; startFace 29941; } frontAndBack_neg { type wedge; inGroups 1(wedge); nFaces 19423; startFace 49364; } ) // ************************************************************************* // The folder polymesh (contains the original file boundary before has changed by collapseEdges) constant folder ----------------- Pay special attention to transportProperties .. toctree:: :maxdepth: 2 constant/g constant/motionProperties constant/transportProperties constant/turbulenceProperties system folder -------------- Here there are important files: - collapseDict is necessary to run the collapseDict command. - decomposeParDict sets the parallel running decomposition. - setFieldsDict sets the phases into the geometry as an initial conditions. The subsecuent time steps must maintain the phase equilibrium in other way the run could diverge. .. toctree:: :maxdepth: 2 system/collapseDict system/controlDict system/decomposeParDict system/fvSchemes system/fvSolution system/meshQualityDict system/setFieldsDict ------------ Actions ------------ manually delete new time Then .. code-block:: bash checkMesh if errors review your mesh know use pimpleFOAM with one or more processors .. code-block:: bash decomposePar Then .. code-block:: bash mpirun -np 4 pimpleFoam This is not working on kubunto and OpenFOAM6 by now" ------------ Pruebas ------------ .. toctree:: :maxdepth: 2 PY-A873-results