Gmsh有限元网格剖分(Python)---点、直线、平面的移动

Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转

最近在学习有限元的网格剖分算法,主要还是要参考老外的开源Gmsh库进行,写一些博客记录下学习过程,方便以后回忆嘞。

Gmsh的官方英文文档可以参考:gmsh.pdf

但咋就说,这里面东西太多了,不太适合初学者去看,因此分享下自己学习的过程吧。

此次记录基于下面博客的内容:

Gmsh有限元网格剖分(Python)—任意点、直线、平面的创建

目录

  • Gmsh有限元网格剖分(Python)---点、直线、平面的移动和旋转
    • 1、点、直线、平面的移动
      • 1.1 点的移动
      • 1.2 线的移动
      • 1.3 面的移动
      • 1.4 总结
    • 2、点、直线、平面的旋转
      • 2.1、点的旋转
      • 2.2、线的旋转
      • 2.3、线的旋转-旋转图形中的线
      • 2.4、面的旋转

1、点、直线、平面的移动

1.1 点的移动

在Gmsh有限元网格剖分(Python)—任意点、直线、平面的创建的代码中额外创建一个点并连线:

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

绘制得到的结果如下:
在这里插入图片描述
使用下面的命令对新创建的点进行平移,其中:

------ [(0, point5_tag)]:0是代表移动的是0维的点,point5_tag是要移动的点的编号
------dx、dy、dz是向各个方向平移的距离

kernel.translate([(0, point5_tag)], dx=1, dy=0, dz=0)

geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到平移后的线依旧连接,创建的线会和点一起移动:
在这里插入图片描述
occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到平移后的线不动,只移动单个点:
在这里插入图片描述
全部代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.translate([(0, point5_tag)], dx=1, dy=0, dz=0)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.2 线的移动

线的移动基于同样的函数,其解释和代码如下:

------ [(1, line5_tag)]:1是代表移动的是1维的线,line5_tag是要移动的点的编号
------dx、dy、dz是向各个方向平移的距离

kernel.translate([(1, line5_tag)], dx=1, dy=0, dz=0)

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到实际中线被平移了:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,线的移动会改变原有的和线连接的结构,总之就是结构全部耦合在一块了:
在这里插入图片描述
全部代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.translate([(1, line5_tag)], dx=1, dy=0, dz=0)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.3 面的移动

面的移动基于同样的函数,其解释和代码如下(将平面向上移动):

------ [(2, surface_tag)]:2是代表移动的是2维的面,surface_tag是要移动的面的编号
------dx、dy、dz是向各个方向平移的距离

kernel.translate([(2, surface_tag)], dx=0, dy=0, dz=1)

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到实际中单独的这个面被平移了,其余结构没有变化:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,面的移动会改变原有的和线连接的结构:
在这里插入图片描述
代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.translate([(2, surface_tag)], dx=0, dy=0, dz=1)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.4 总结

kernel = gmsh.model.geo时对形状的编辑耦合比较严重
kernel = gmsh.model.occ时各个图形隔离度高,推荐使用occ引擎

2、点、直线、平面的旋转

2.1、点的旋转

使用下面的函数进行旋转:

kernel.rotate([(0, point5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

其中:

------ [(0, point5_tag)]:0是代表移动的是0维的点,point5_tag是要移动的点的编号
------1, 1, 0参数代表旋转选择的中心点在坐标(1,1,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(-math.pi / 2)参数表示是顺时针旋转90°

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到只有点被旋转过去了:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到点和点所在的线全部被旋转了:
在这里插入图片描述
全部代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.rotate([(0, point5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")

# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.2、线的旋转

使用下面的函数进行旋转:

kernel.rotate([(1, line5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

其中:

------ [(1, line5_tag)]:1是代表移动的是1维的线,line5_tag是要移动的线的编号
------1, 1, 0参数代表旋转选择的中心点在坐标(1,1,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(-math.pi / 2)参数表示是顺时针旋转90°

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到线和线上的点被成功旋转90°:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到线和线上的点被成功旋转90°,此时使用两个3维引擎效果是一致的:
在这里插入图片描述
全部代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.rotate([(1, line5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.3、线的旋转-旋转图形中的线

但是,上面我们旋转的线是单独的一根独立的线,如果我们选择旋转现有的构成图形的线,两个引擎会不会有什么区别呢?旋转的目标是下面这个,我们想将其逆时针旋转90°:
在这里插入图片描述
occ引擎-实际上是复制并旋转,这是为了保持原结构不变:
在这里插入图片描述
geo引擎-原来边的对应关系也全部改变了,逻辑关系比较复杂:
在这里插入图片描述
代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.rotate([(1, line2_tag)], 0, 1, 0, 0, 0, 1, math.pi / 2)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
# gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.4、面的旋转

使用下面的函数进行旋转:

kernel.rotate([(2, surface_tag)], 0, 0, 0, 0, 0, 1, math.pi / 4)

其中:

------ [(2, surface_tag)]:1是代表移动的是2维的面,surface_tag是要移动的面的编号
------0, 0 0参数代表旋转选择的中心点在坐标(0,0,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(math.pi / 4)参数表示是逆时针旋转45°

occ引擎-可以看到原来的正方形向左滚了45°,但是线的位置不变:
在这里插入图片描述

geo引擎-可以看到原来的正方形向左滚了45°,且那线也跟着一起走了,结构是耦合的:
在这里插入图片描述
代码:

import math

import gmsh
import sys

gmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")

kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])

point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

kernel.rotate([(2, surface_tag)], 0, 0, 0, 0, 0, 1, math.pi / 4)

# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")



# 2维网格剖分
# gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:
    gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942695.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】基础I/O -> 如何谈文件与文件系统?

文件的基础理解 空文件也要在磁盘上占据空间。文件 文件内容文件属性。文件操作 对内容的操作 对属性的操作或者是对内容和属性的操作。标定一个文件,必须使用:文件路径 文件名(具有唯一性)。如果没有指明对应的文件路径&…

python+reportlab创建PDF文件

目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…

软件项目需求分析的实践探索(1)

一、项目启动与规划 组建团队 包括项目经理、系统分析师、业务分析师以及可能涉及的最终用户代表和领域专家等。例如,开发一个医疗管理软件,就需要有医疗行业的专家参与,确保对医疗业务流程有深入理解。明确各成员的职责,如系统分…

Windows下ESP32-IDF开发环境搭建

Windows下ESP32-IDF开发环境搭建 文章目录 Windows下ESP32-IDF开发环境搭建一、软件安装二、搭建IDF开发环境2.1 安装VS Code插件:2.2 配置ESP-IDF插件:2.3 下载例程源码: 三、编译和烧录代码四、Windows下使用命令行编译和烧录程序4.1 配置环…

从 GitLab.com 到 JihuLab.com 的迁移指南

本文分享从 GitLab.com 到 JihuLab.com 的迁移指南。 近期,GitLab Inc. 针对其 SaaS 产品做了限制,如果被判定为国内用户,则会建议使用其在国内的发布版本极狐GitLab。从 GitLab SaaS 产品(GitLab.com)迁移到极狐GitL…

Mysql-索引的数据结构

为什么要使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件…

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统, Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 体验地址:http://blog.gaoredu.com/ 今天,我们自豪地宣布ReactPress 1.6.0版本的正式发布,…

秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解

​ 别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff…

【Go】Go数据类型详解—map

1. 前言 本篇博客将会介绍Go语言当中的另一大核心数据类型——map(映射),当然在介绍这个数据类型之前我们还是要思考引入这个数据类型的原因: ❓ 需求:要求完成对一个班级所有同学的信息管理(包括但不限于…

Agent 案例分析:金融场景中的智能体-蚂蚁金服案例(10/30)

Agent 案例分析:金融场景中的智能体 —蚂蚁金服案例 一、引言 在当今数字化时代,金融行业正经历着深刻的变革。随着人工智能技术的飞速发展,智能体(Agent)在金融场景中的应用越来越广泛。蚂蚁金服作为金融科技领域的…

十五、新一代大模型推理架构Mamba

Mamba架构:下一代大模型架构的可能性? 随着深度学习的快速发展,Transformer 架构在过去几年中成为了自然语言处理(NLP)和生成式AI模型的主流架构。然而,Transformer并非完美,其计算效率、长序列建模能力等方面依然存在瓶颈。近期出现的Mamba架构被认为是对这些问题的潜…

LabVIEW中什么和C 语言指针类似?

在LabVIEW中,与C语言指针类似的概念是 引用 (Reference)。 引用在LabVIEW中主要用于以下几个方面: 数据引用:LabVIEW通过引用传递数据,而不是复制数据。通过引用,多个VIs可以共享数据而不需要复制整个数据结构&#xf…

前端编程图表化助手!Echarts入门

Echarts-一个基于javaScript的开源可视化图表库 在日常编程中,我们经常会用到类似饼图、柱状图等,而在网页中使用原生html和css很难做到类似效果。那么作为前端工程师,我们如何做出来一份好看而且实用的图标呢? 那么接下来&…

企业AI助理背后的技术架构:从数据到智能决策

在当今数字化时代,企业AI助理已经成为推动企业数字化转型和智能化升级的重要工具。它们通过整合企业内外部数据资源,运用先进的算法和模型,为企业提供高效、精准的智能决策支持。本文将深入探讨企业AI助理背后的技术架构,从数据收…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网,下载 Node.js,上面有好几种下载方式,文中下载的是 zip 压缩包。 如图&…

【Rabbitmq篇】高级特性----TTL,死信队列,延迟队列

目录 一.TTL 1.设置消息的TTL 2.设置队列的TTL 3.俩者区别 二.死信队列 定义: 消息成为死信的原因: 1.消息被拒绝(basic.reject 或 basic.nack) 2.消息过期(TTL) 3.队列达到最大长度 ​编辑 …

Solon v3.0.5 发布!(Spring 可以退休了吗?)

Solon 框架! 新一代,面向全场景的 Java 应用开发框架。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单提倡: 克制、高效、开放、生态 有什么特点&am…

【PCIe 总线及设备入门学习专栏 1.1 -- PCIe 基础知识 lane和link介绍】

文章目录 OverivewLane 和 LinkRC 和 RPPCIe controllerPCIE ControllerPHY模块 Inbound 和 OutboundPCIe transaction modelPIODMAP2P Overivew PCIe,即PCI-Express总线(Peripheral Component Interconnect Express),是一种高速…

安卓 SystemServer 启动流程

目录 引言 Android系统服务启动顺序 zygote fork SystemServer 进程 SystemServer启动流程 1、SystemServer.main() 2、SystemServer.run() 3、初始化系统上下文 4、创建系统服务管理 5、启动系统各种服务 总结 引言 开机启动时 PowerManagerService 调用 AudioSer…

117.【C语言】数据结构之排序(选择排序)

目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 ​编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…