论文部分内容阅读
摘 要:太陽风是由太阳等离子体流以及随等离子体流运动并蔓延于行星际空间的太阳磁场组成的。它是由太阳日冕和行星际空间巨大的压力差造成的。太阳风研究和仿真的核心就是对太阳风粒子的研究和仿真。本课题建立了太阳风粒子系统模型,解决了太阳风粒子系统仿真驱动;建立了太阳风和太阳高能粒子数据映射模型。
关键词:太阳风;研究;粒子;仿真
1、引言
以地球的标准看,太阳风是热而且非常稀薄的快速等离子体流。它主要是由电离的氢(即质子和几乎等量的电子),以及少量(5%)电离的氦和其他更重的元素构成。嵌在太阳等离子体流中的是一个微弱的磁场,其方向几乎平行于黄道面。本课题运用现代仿真技术和计算机三维图形学技术进行太阳风粒子的研究和仿真。
太阳风粒子仿真系统更新循环包括参数更新仿真和渲染仿真两个阶段。在参数更新仿真阶段,采用Update方法进行更新,太阳风粒子发射器在给定的生成区域批量生成粒子,根据生成速度、更新时间间隔对新粒子的数目和三维空间位置进行计算,并初始化每个粒子的速度、纹理颜色和生命周期等。渲染仿真阶段位于更新阶段之后,采用Draw方法进行渲染,粒子可以是经过纹理映射的四边形,也可以是一个像素,甚至是一个球状集合体,选择粒子的表示方式取决于GPU的分辨率和处理能力。
2、太阳风粒子运动方程
为了描述太阳风粒子的运动,必须选定参照系,并在参照系上建立坐标系。在本系统中,并没有采用黄道坐标系[1],而是采用自定义的坐标系,定义本坐标系为太阳风仿真坐标系,该坐标系源于黄道坐标系和太阳质心坐标系[2]。
太阳风仿真坐标系的x y平面仍然采用黄道平面。黄道是地球绕太阳运行轨道面无限扩展同天球相交所成的天球大圆,是太阳周年视运动路线。经过日心并与黄道面垂直的直线定义为Z轴,Z轴与天球相交的两点分为北极(N)和南极(S)。经过南北极并且同黄道相垂直的天球大圆叫经圈,天球上与黄道平行的小圆叫纬圈。黄道和天赤道相交的两点叫二分点,其中黄道对于天赤道的升交点叫春分点〔γ〕,降交点叫秋分点。黄道上与二分点相距90°的两点叫二至点,其中位于天赤道以北的叫夏至点,位于天赤道以南的叫冬至点。如图1所示,在时刻t,太阳风粒子P在坐标系里的位置采用位置矢量 来表示,如图2所示。
图1太阳风仿真坐标系 图2 P点的三维坐标
其中矢量 表示位置矢量,坐标x,y,z为太阳风粒子在X、Y、Z坐标轴上的投影,单位矢量 分别为X、Y、Z坐标轴的方向,则位置矢量 为:
(1-1)
在太阳风粒子运动时,它相对坐标太阳质心原点O的位置矢量 是随时间而变化的,因此 是时间的函数,即:
(1-2)
公式(1-2)为太阳风粒子的运动方程。通过该运动方程,可研究太阳风粒子运动轨迹、速度和加速度等参数。位移矢量反映了太阳风粒子运动中位置(距离与方位)的变化,如图3所示。
P点到P’点的位移 。
图3 P点到P’点的位移
瞬时速度 定义为:
(1-3a)
对应的直角坐标 表示为:
(1-3b)
通过上式求解太阳风粒子速度的大小为:
速度的方向用方向余弦表示为:
定义太阳风粒子瞬时加速度为:
(1-4)
用直角坐标表示加速度
(3-5b)
由上式求解太阳风粒子加速度的大小为
方向用方向余弦表示为
3、太阳风粒子仿真算法实现
仿真中的每个太阳风粒子需要四个顶点或两个三角形形成一个被颜色纹理绘制的矩形点精灵,每一种太阳风爆发仿真都是由许多的点精灵组成。每个粒子都拥有原始的物理属性,如位置,速度,加速度和角速度。粒子将会以点精灵的形式进行渲染。所有的粒子层叠在一起,形成炫目的视觉效果。在粒子系统设计中,采用类Particle描述每个粒子。
在Particle中,首先定义了每个粒子的基本属性。
public Vector2 Position;
public Vector2 Velocity;
public Vector2 Acceleration;
private float lifetime;
public float Lifetime
{
get { return lifetime; }
set { lifetime = value; }
}
private float timeSinceStart;
public float TimeSinceStart
{
get { return timeSinceStart; }
set { timeSinceStart = value; }
}
private float scale;
public float Scale
{
get { return scale; }
set { scale = value; }
}
private float rotation;
public float Rotation
{
get { return rotation; }
set { rotation = value; }
}
private float rotationSpeed; public float RotationSpeed
{
get { return rotationSpeed; }
set { rotationSpeed = value; }
}
public bool Active
{
get { return TimeSinceStart< Lifetime; }
}
Position、Velocity、Acceleration三個成员变量分别是粒子的位置、速度和加速度。在仿真过程中,处理运动粒子必需要获知粒子的坐标(即粒子的位置)和速度矢量(包括速率和方向)。
Lifetime和TimeSinceStart分别表示粒子的生命值和存活时间,
在调用一次Update方法,粒子的生命值将减少一个dt,随着时间的推移,直至粒子生命值为0为止。每个粒子的生命值并不相同,当一个粒子的生命周期结束时,便开始粒子的另一个生命周期。为了减少仿真时诸如内存分配和释放之类的操作,尽量不从内存中释放死亡的一部分粒子,而是为每个粒子增加一个标志,标记粒子是死亡还是重新初始化,使粒子能够不断地涌出。当所有的粒子都被标记为死亡时,即表示粒子系统仿真的结束,这时,释放整个粒子系统,完成本次仿真。
Scale、Rotation和RotationSpeed分别表示粒子缩放的大小和旋转角度及旋转角速度。
Particle类中提供了Initialize()和两个方法
public void Initialize(Vector2 position, Vector2 velocity, Vector2 acceleration, float lifetime, float scale, float rotationSpeed)
{
this.Position = position;
this.Velocity = velocity;
this.Acceleration = acceleration;
this.Lifetime = lifetime;
this.Scale = scale;
this.RotationSpeed = rotationSpeed;
this.TimeSinceStart = 0.0f;
this.Rotation = ParticleSystem.RandomBetween(0, MathHelper.TwoPi);
}
public void Update(float dt)
{
Velocity += Acceleration * dt;
Position += Velocity * dt;
Rotation += RotationSpeed * dt;
TimeSinceStart += dt;
}
提供的Initialize方法将实例化粒子的位置、随机方向、随机颜色和随机大小、旋转角度随机在0到360度之间等。Update方法提供某种事件改变粒子的速度、方向、位置等。
ParticleSystem是一个为创建粒子特效提供基础方法的抽象类。继承该类的各个子类,通过实现该类的抽象方法和虚方法,从而实现不同的特效,例如火,爆炸和烟雾。在使用这些子类时,通过简单的调用AddParticles方法,并将各个粒子的初始位置作为参数传入该方法,即可实现不同的粒子特效。类中提供了下面三个成员变量:
private ContentManagercontentManager;
private SpriteBatchspriteBatch;
public static readonly Random random = new Random();
分别用于访问所有加载到内容管道中的对象、绘制精灵和产生随机数。
private Texture2D texture;
private Vector2 origin;
private inthowManyEffects;
texture用于装载粒子系统所需的纹理,这张纹理包含了颜色映射,表示粒子的所有可能的颜色。每次粒子被创建时将从在这张纹理上位置上origin选择一个随机的像素,获取它的颜色数据并赋予每个新的粒子。howManyEffects保存了粒子中最大允许的粒子数。
Particle[] particles;
QueuefreeParticles;
public intFreeParticleCount
{
get { return freeParticles.Count; }
}
Particles用户存储粒子系统中所有的粒子,当类被实例化时,整个数组也被实例化,被描绘出来的是那些存在于endOfDeadParticlesIndex和endOfLiveParticlesIndex之间的粒子。随着每次循环新粒子被“创造”出来,endOfLiveParticlesIndex沿着数组向下移动。随着每次循环新粒子被“删除”,endOfDeadParticlesIndex沿着列表向下移动。每次被描绘出来的粒子,是存在这两个索引之间的那些。图5-7给出了particles在ParticleExplosion类中运行的图解[15]。随着endOfDeadParticlesIndex和endOfLiveParticlesIndex从左向右移动,这两个索引之间的粒子被描绘出来。两个索引左边的粒子已经死亡,两个索引右边的粒子仍未被激活。 图5- 7粒子运动图解
属性FreeParticleCount返回能完成有效效果的粒子的数量。
protected intminNumParticles;
protected intmaxNumParticles;
两个成员变量表示创建实例时,要创建Particle对象的数组的尺寸将在定义的minParticles(最小粒子)值和maxParticles(最大粒子)值之間。
protected float minInitialSpeed;
protected float maxInitialSpeed;
protected float minAcceleration;
protected float maxAcceleration;
protected float minRotationSpeed;
protected float maxRotationSpeed;
将分别表示最小速度和最大速度用于控制粒子的初始速度,粒子的初始速度是一个随机数,方向由PickRandomDirection来决定;最小加速度和最大加速度用于控制粒子的加速度,粒子加速度将会是在这个范围内一个随机数。默认时,加速度方向同初始速度方向相同;最小旋转加速度和最大旋转加速度控制着粒子的角速度,粒子以这个速度旋转,每个粒子的旋转速度将会介于最大旋转速度和最小旋转速度之间。
protected float minLifetime;
protected float maxLifetime;
粒子引擎也负责消灭失效的粒子。代码中minLife(最小生存时间)与maxLife(最大生存时间)设置负责实例的生存期。每个实例都将被设定一个大于minLife且小于maxLife的生命值。当生命时限达到了特效的条件,开始在每次循环中报废粒子。一旦所有的粒子都被报废,特效结束并且被删除。
此外,类中的其他方法有:
protected ParticleSystem(ContentManagercontentManager, SpriteBatchspriteBatch, inthowManyEffects)
protected abstract void InitializeConstants();
public void AddParticles(Vector2 where)
protected virtual void InitializeParticle(Particle p, Vector2 where)
protected virtual Vector2 PickRandomDirection()
public static float RandomBetween(float min, float max)
public void Update(TimeSpanelapsedTime)
public void Draw()
分别为类的构造函数、子类所重载的抽象方法等;
在仿真中添加粒子引擎。在仿真中为了呈现粒子的真实行为,仿真必须遵从3D物理定律。当粒子被喷射出太阳表面时,将被引擎所作用,粒子的状态参数将发生改变,比如转动对力量、冲量和扭矩等。因此将在仿真中加入物理仿真特性,创建3D世界能够复制一些实际行为。粒子引力引擎犹如一个能够计算重力、速度、加速度、冲动、扭力、瞬间的惯性、摩擦系数等物理参数的专家。
PhysicsSimulatorphysicsSimulator = new PhysicsSimulator(new Vector2(0f, axisy));
physicsSimulator.Update((float)e.DeltaTime.TotalSeconds);
粒子是一种简单的方式,用来表示组成粒子效应的一组元素中的单个元素。粒子引擎是通过操纵、添加、移除,与描绘粒子构成粒子效应的一种机制。通常,粒子引擎会模拟引力、洛仑兹力以及其它外力从而使粒子效应看起来更加真实。
4、结论
本课题研究了太阳风粒子的性质和运动方程,利用现代现代仿真技术和技术图形学,建立了太阳风粒子系统模型,解决了太阳风粒子系统仿真驱动,为太阳风的相关研究和预报提供的可供参考的依据。
参考文献:
[1]能源知识.太阳风.能源与节能,2011,5:18.
[2]Cranmer S R et al.Spectroscopic constraints on models of ions-cyclotron resonance heating in the polar solar corona and high-speed Solar wind. Astrophys.J.,1999,518-L937.
[3]束传政,王玲华,涂传诒.回旋波共振加热加速的多重离子流体模型.空间科学学报, 2000,(03): 201-207.
[4]冶萍,张靖周.求解N-S方程SIMPLE算法的半交错网格研究.南京航空航天大学学报.2004,36(1):11-15.
[5]阚圣哲,陈国兴,陈磊.基于Abaqus软件的并行计算集群平台构建与优化方法[J].防灾减灾工程学报,2009,29(06):644-651
关键词:太阳风;研究;粒子;仿真
1、引言
以地球的标准看,太阳风是热而且非常稀薄的快速等离子体流。它主要是由电离的氢(即质子和几乎等量的电子),以及少量(5%)电离的氦和其他更重的元素构成。嵌在太阳等离子体流中的是一个微弱的磁场,其方向几乎平行于黄道面。本课题运用现代仿真技术和计算机三维图形学技术进行太阳风粒子的研究和仿真。
太阳风粒子仿真系统更新循环包括参数更新仿真和渲染仿真两个阶段。在参数更新仿真阶段,采用Update方法进行更新,太阳风粒子发射器在给定的生成区域批量生成粒子,根据生成速度、更新时间间隔对新粒子的数目和三维空间位置进行计算,并初始化每个粒子的速度、纹理颜色和生命周期等。渲染仿真阶段位于更新阶段之后,采用Draw方法进行渲染,粒子可以是经过纹理映射的四边形,也可以是一个像素,甚至是一个球状集合体,选择粒子的表示方式取决于GPU的分辨率和处理能力。
2、太阳风粒子运动方程
为了描述太阳风粒子的运动,必须选定参照系,并在参照系上建立坐标系。在本系统中,并没有采用黄道坐标系[1],而是采用自定义的坐标系,定义本坐标系为太阳风仿真坐标系,该坐标系源于黄道坐标系和太阳质心坐标系[2]。
太阳风仿真坐标系的x y平面仍然采用黄道平面。黄道是地球绕太阳运行轨道面无限扩展同天球相交所成的天球大圆,是太阳周年视运动路线。经过日心并与黄道面垂直的直线定义为Z轴,Z轴与天球相交的两点分为北极(N)和南极(S)。经过南北极并且同黄道相垂直的天球大圆叫经圈,天球上与黄道平行的小圆叫纬圈。黄道和天赤道相交的两点叫二分点,其中黄道对于天赤道的升交点叫春分点〔γ〕,降交点叫秋分点。黄道上与二分点相距90°的两点叫二至点,其中位于天赤道以北的叫夏至点,位于天赤道以南的叫冬至点。如图1所示,在时刻t,太阳风粒子P在坐标系里的位置采用位置矢量 来表示,如图2所示。
图1太阳风仿真坐标系 图2 P点的三维坐标
其中矢量 表示位置矢量,坐标x,y,z为太阳风粒子在X、Y、Z坐标轴上的投影,单位矢量 分别为X、Y、Z坐标轴的方向,则位置矢量 为:
(1-1)
在太阳风粒子运动时,它相对坐标太阳质心原点O的位置矢量 是随时间而变化的,因此 是时间的函数,即:
(1-2)
公式(1-2)为太阳风粒子的运动方程。通过该运动方程,可研究太阳风粒子运动轨迹、速度和加速度等参数。位移矢量反映了太阳风粒子运动中位置(距离与方位)的变化,如图3所示。
P点到P’点的位移 。
图3 P点到P’点的位移
瞬时速度 定义为:
(1-3a)
对应的直角坐标 表示为:
(1-3b)
通过上式求解太阳风粒子速度的大小为:
速度的方向用方向余弦表示为:
定义太阳风粒子瞬时加速度为:
(1-4)
用直角坐标表示加速度
(3-5b)
由上式求解太阳风粒子加速度的大小为
方向用方向余弦表示为
3、太阳风粒子仿真算法实现
仿真中的每个太阳风粒子需要四个顶点或两个三角形形成一个被颜色纹理绘制的矩形点精灵,每一种太阳风爆发仿真都是由许多的点精灵组成。每个粒子都拥有原始的物理属性,如位置,速度,加速度和角速度。粒子将会以点精灵的形式进行渲染。所有的粒子层叠在一起,形成炫目的视觉效果。在粒子系统设计中,采用类Particle描述每个粒子。
在Particle中,首先定义了每个粒子的基本属性。
public Vector2 Position;
public Vector2 Velocity;
public Vector2 Acceleration;
private float lifetime;
public float Lifetime
{
get { return lifetime; }
set { lifetime = value; }
}
private float timeSinceStart;
public float TimeSinceStart
{
get { return timeSinceStart; }
set { timeSinceStart = value; }
}
private float scale;
public float Scale
{
get { return scale; }
set { scale = value; }
}
private float rotation;
public float Rotation
{
get { return rotation; }
set { rotation = value; }
}
private float rotationSpeed; public float RotationSpeed
{
get { return rotationSpeed; }
set { rotationSpeed = value; }
}
public bool Active
{
get { return TimeSinceStart< Lifetime; }
}
Position、Velocity、Acceleration三個成员变量分别是粒子的位置、速度和加速度。在仿真过程中,处理运动粒子必需要获知粒子的坐标(即粒子的位置)和速度矢量(包括速率和方向)。
Lifetime和TimeSinceStart分别表示粒子的生命值和存活时间,
在调用一次Update方法,粒子的生命值将减少一个dt,随着时间的推移,直至粒子生命值为0为止。每个粒子的生命值并不相同,当一个粒子的生命周期结束时,便开始粒子的另一个生命周期。为了减少仿真时诸如内存分配和释放之类的操作,尽量不从内存中释放死亡的一部分粒子,而是为每个粒子增加一个标志,标记粒子是死亡还是重新初始化,使粒子能够不断地涌出。当所有的粒子都被标记为死亡时,即表示粒子系统仿真的结束,这时,释放整个粒子系统,完成本次仿真。
Scale、Rotation和RotationSpeed分别表示粒子缩放的大小和旋转角度及旋转角速度。
Particle类中提供了Initialize()和两个方法
public void Initialize(Vector2 position, Vector2 velocity, Vector2 acceleration, float lifetime, float scale, float rotationSpeed)
{
this.Position = position;
this.Velocity = velocity;
this.Acceleration = acceleration;
this.Lifetime = lifetime;
this.Scale = scale;
this.RotationSpeed = rotationSpeed;
this.TimeSinceStart = 0.0f;
this.Rotation = ParticleSystem.RandomBetween(0, MathHelper.TwoPi);
}
public void Update(float dt)
{
Velocity += Acceleration * dt;
Position += Velocity * dt;
Rotation += RotationSpeed * dt;
TimeSinceStart += dt;
}
提供的Initialize方法将实例化粒子的位置、随机方向、随机颜色和随机大小、旋转角度随机在0到360度之间等。Update方法提供某种事件改变粒子的速度、方向、位置等。
ParticleSystem是一个为创建粒子特效提供基础方法的抽象类。继承该类的各个子类,通过实现该类的抽象方法和虚方法,从而实现不同的特效,例如火,爆炸和烟雾。在使用这些子类时,通过简单的调用AddParticles方法,并将各个粒子的初始位置作为参数传入该方法,即可实现不同的粒子特效。类中提供了下面三个成员变量:
private ContentManagercontentManager;
private SpriteBatchspriteBatch;
public static readonly Random random = new Random();
分别用于访问所有加载到内容管道中的对象、绘制精灵和产生随机数。
private Texture2D texture;
private Vector2 origin;
private inthowManyEffects;
texture用于装载粒子系统所需的纹理,这张纹理包含了颜色映射,表示粒子的所有可能的颜色。每次粒子被创建时将从在这张纹理上位置上origin选择一个随机的像素,获取它的颜色数据并赋予每个新的粒子。howManyEffects保存了粒子中最大允许的粒子数。
Particle[] particles;
Queue
public intFreeParticleCount
{
get { return freeParticles.Count; }
}
Particles用户存储粒子系统中所有的粒子,当类被实例化时,整个数组也被实例化,被描绘出来的是那些存在于endOfDeadParticlesIndex和endOfLiveParticlesIndex之间的粒子。随着每次循环新粒子被“创造”出来,endOfLiveParticlesIndex沿着数组向下移动。随着每次循环新粒子被“删除”,endOfDeadParticlesIndex沿着列表向下移动。每次被描绘出来的粒子,是存在这两个索引之间的那些。图5-7给出了particles在ParticleExplosion类中运行的图解[15]。随着endOfDeadParticlesIndex和endOfLiveParticlesIndex从左向右移动,这两个索引之间的粒子被描绘出来。两个索引左边的粒子已经死亡,两个索引右边的粒子仍未被激活。 图5- 7粒子运动图解
属性FreeParticleCount返回能完成有效效果的粒子的数量。
protected intminNumParticles;
protected intmaxNumParticles;
两个成员变量表示创建实例时,要创建Particle对象的数组的尺寸将在定义的minParticles(最小粒子)值和maxParticles(最大粒子)值之間。
protected float minInitialSpeed;
protected float maxInitialSpeed;
protected float minAcceleration;
protected float maxAcceleration;
protected float minRotationSpeed;
protected float maxRotationSpeed;
将分别表示最小速度和最大速度用于控制粒子的初始速度,粒子的初始速度是一个随机数,方向由PickRandomDirection来决定;最小加速度和最大加速度用于控制粒子的加速度,粒子加速度将会是在这个范围内一个随机数。默认时,加速度方向同初始速度方向相同;最小旋转加速度和最大旋转加速度控制着粒子的角速度,粒子以这个速度旋转,每个粒子的旋转速度将会介于最大旋转速度和最小旋转速度之间。
protected float minLifetime;
protected float maxLifetime;
粒子引擎也负责消灭失效的粒子。代码中minLife(最小生存时间)与maxLife(最大生存时间)设置负责实例的生存期。每个实例都将被设定一个大于minLife且小于maxLife的生命值。当生命时限达到了特效的条件,开始在每次循环中报废粒子。一旦所有的粒子都被报废,特效结束并且被删除。
此外,类中的其他方法有:
protected ParticleSystem(ContentManagercontentManager, SpriteBatchspriteBatch, inthowManyEffects)
protected abstract void InitializeConstants();
public void AddParticles(Vector2 where)
protected virtual void InitializeParticle(Particle p, Vector2 where)
protected virtual Vector2 PickRandomDirection()
public static float RandomBetween(float min, float max)
public void Update(TimeSpanelapsedTime)
public void Draw()
分别为类的构造函数、子类所重载的抽象方法等;
在仿真中添加粒子引擎。在仿真中为了呈现粒子的真实行为,仿真必须遵从3D物理定律。当粒子被喷射出太阳表面时,将被引擎所作用,粒子的状态参数将发生改变,比如转动对力量、冲量和扭矩等。因此将在仿真中加入物理仿真特性,创建3D世界能够复制一些实际行为。粒子引力引擎犹如一个能够计算重力、速度、加速度、冲动、扭力、瞬间的惯性、摩擦系数等物理参数的专家。
PhysicsSimulatorphysicsSimulator = new PhysicsSimulator(new Vector2(0f, axisy));
physicsSimulator.Update((float)e.DeltaTime.TotalSeconds);
粒子是一种简单的方式,用来表示组成粒子效应的一组元素中的单个元素。粒子引擎是通过操纵、添加、移除,与描绘粒子构成粒子效应的一种机制。通常,粒子引擎会模拟引力、洛仑兹力以及其它外力从而使粒子效应看起来更加真实。
4、结论
本课题研究了太阳风粒子的性质和运动方程,利用现代现代仿真技术和技术图形学,建立了太阳风粒子系统模型,解决了太阳风粒子系统仿真驱动,为太阳风的相关研究和预报提供的可供参考的依据。
参考文献:
[1]能源知识.太阳风.能源与节能,2011,5:18.
[2]Cranmer S R et al.Spectroscopic constraints on models of ions-cyclotron resonance heating in the polar solar corona and high-speed Solar wind. Astrophys.J.,1999,518-L937.
[3]束传政,王玲华,涂传诒.回旋波共振加热加速的多重离子流体模型.空间科学学报, 2000,(03): 201-207.
[4]冶萍,张靖周.求解N-S方程SIMPLE算法的半交错网格研究.南京航空航天大学学报.2004,36(1):11-15.
[5]阚圣哲,陈国兴,陈磊.基于Abaqus软件的并行计算集群平台构建与优化方法[J].防灾减灾工程学报,2009,29(06):644-651