Skip to content
Snippets Groups Projects
Select Git revision
  • fcecb101c342200368734ba25499b15bffcf4b34
  • master default protected
  • dof-renumbering
  • test-dof-hash
  • gdemesy-master-patch-30528
  • eval-space-time
  • oscillating_multiharm
  • MH_movement
  • axisqu
  • write_vtu_and_ensight_formats
  • movingband
  • CP_1972_add_vtu_file_writing
  • mortar
  • fast_freq_sweep_Resolution
  • applyresolvent_again
  • marteaua-master-patch-54323
  • patch-1
  • binde-master-patch-08072
  • binde-master-patch-52461
  • BCGSL
  • resolvent
  • getdp_3_5_0
  • getdp_3_4_0
  • getdp_3_3_0
  • getdp_3_2_0
  • getdp_3_1_0
  • getdp_3_0_4
  • getdp_3_0_3
  • getdp_3_0_2
  • getdp_3_0_1
  • getdp_3_0_0
  • onelab_mobile_2.1.0
  • getdp_2_11_3 protected
  • getdp_2_11_2 protected
  • getdp_2_11_1 protected
  • getdp_2_11_0 protected
  • getdp_2_10_0 protected
  • getdp_2_9_2 protected
  • getdp_2_9_1 protected
  • getdp_2_9_0 protected
  • getdp_2_8_0 protected
41 results

Operation_TimeLoopAdaptive.cpp

Blame
  • x5.jl 3.49 KiB
    # -----------------------------------------------------------------------------
    #
    #  Gmsh Julia extended tutorial 5
    #
    #  Additional geometrical data: parametrizations, normals, curvatures
    #
    # -----------------------------------------------------------------------------
    
    import gmsh
    
    gmsh.initialize(append!(["gmsh"], ARGS))
    
    # The API provides access to geometrical data in a CAD kernel agnostic manner.
    
    # Let's create a simple CAD model by fusing a sphere and a cube, then mesh the
    # surfaces:
    gmsh.model.add("x5")
    s = gmsh.model.occ.addSphere(0, 0, 0, 1)
    b = gmsh.model.occ.addBox(0.5, 0, 0, 1.3, 2, 3)
    gmsh.model.occ.fuse([(3, s)], [(3, b)])
    gmsh.model.occ.synchronize()
    gmsh.model.mesh.generate(2)
    
    # We can for example retrieve the exact normals and the curvature at all the
    # mesh nodes (i.e. not normals and curvatures computed from the mesh, but
    # directly evaluated on the geometry), by querying the CAD kernels at the
    # corresponding parametric coordinates.
    normals = []
    curvatures = []
    
    # For each surface in the model:
    for e in gmsh.model.getEntities(2)
        # Retrieve the surface tag
        local s = e[2]
    
        # Get the mesh nodes on the surface, including those on the boundary
        # (contrary to internal nodes, which store their parametric coordinates,
        # boundary nodes will be reparametrized on the surface in order to compute
        # their parametric coordinates, the result being different when
        # reparametrized on another adjacent surface)
        tags, coord, param = gmsh.model.mesh.getNodes(2, s, true)
    
        # Get the surface normals on all the points on the surface corresponding to
        # the parametric coordinates of the nodes
        norm = gmsh.model.getNormal(s, param)
    
        # In the same way, get the curvature
        curv = gmsh.model.getCurvature(2, s, param)
    
        # Store the normals and the curvatures so that we can display them as
        # list-based post-processing views
        for i in 1:3:length(coord)
            push!(normals, coord[i], coord[i + 1], coord[i + 2],
                  norm[i], norm[i + 1], norm[i + 2])
            push!(curvatures, coord[i], coord[i + 1], coord[i + 2],
                  curv[div(i - 1, 3) + 1])
        end
    end
    
    # Create a list-based vector view on points to display the normals, and a scalar
    # view on points to display the curvatures
    vn = gmsh.view.add("normals")
    gmsh.view.addListData(vn, "VP", length(normals) / 6, normals)
    gmsh.view.option.setNumber(vn, "ShowScale", 0)
    gmsh.view.option.setNumber(vn, "ArrowSizeMax", 30)
    gmsh.view.option.setNumber(vn, "ColormapNumber", 19)
    vc = gmsh.view.add("curvatures")
    gmsh.view.addListData(vc, "SP", length(curvatures) / 4, curvatures)
    gmsh.view.option.setNumber(vc, "ShowScale", 0)
    
    # We can also retrieve the parametrization bounds of model entities, e.g. of
    # curve 5, and evaluate the parametrization for several parameter values:
    bounds = gmsh.model.getParametrizationBounds(1, 5)
    N = 20
    t = [bounds[1][1] + i * (bounds[2][1] - bounds[1][1]) / N for i in 0:N - 1]
    xyz1 = gmsh.model.getValue(1, 5, t)
    
    # We can also reparametrize curve 5 on surface 1, and evaluate the points in the
    # parametric plane of the surface:
    uv = gmsh.model.reparametrizeOnSurface(1, 5, t, 1)
    xyz2 = gmsh.model.getValue(2, 1, uv)
    
    # Hopefully we get the same x, y, z coordinates!
    if maximum([abs(a - b) for (a, b) in zip(xyz1, xyz2)]) < 1e-12
        gmsh.logger.write("Evaluation on curve and surface match!")
    else
        gmsh.logger.write("Evaluation on curve and surface do not match!", "error")
    end
    
    # Launch the GUI to see the results:
    if !("-nopopup" in ARGS)
        gmsh.fltk.run()
    end
    
    gmsh.finalize()