精准石油论坛: 分享水动力计算中定义三维矢量运算符的FORTRAN程序 - 精准石油论坛

跳转到内容

第一页
  • 您无法发起一个新主题
  • 您无法回复此主题

分享水动力计算中定义三维矢量运算符的FORTRAN程序 主题评价: -----

#1 已离线   wavesurfer 

  • 武林名宿
  • 图像
  • 群组: 版主
  • 主题数: 837
  • 注册日期: 01-20-2007

wavesurfer 发表于 01-06-2011 - 14:09
精准.石油.论坛 forum.petro-china.com

附加文件  ArrayOperators.f90 (10.1K)
下载次数: 110

在时域和频域水动力数值计算程序的开发中,向量点乘叉乘;向量的旋转;Motion的转换;求单位向量、切向量、法向量等等都需要做向量运算。特别是用Morison公式算Morison单元和锚链有限元线单元上的力,向量运算是必不可少的。最近有机会接触一些时域全耦合分析的源程序,感觉有必要把三维向量的计算都定义成标准的运算符,以便简化程序,而且使源程序的可读性大大提高。附件是我自己为此写的一个FORTRAN程序模块。与大家分享,并欢迎补充讨论。

这个程序就是一个FORTRAN MODULE。名字是ArrayOperations。考虑到使用方便和简化,没有定义一个专门的向量类来实现这个功能。三维向量就用长度为3的一维数组来表示,以便与其他子程序里表示矩阵的数组自由运算。所以这相当于FORTRAN数组操作的延伸,只是这里强调的功能是三维向量运算。这个程序模块是通用的,任何FORTRAN子程序只要需要用到这里定义的运算符就可以在程序开始加一个USE ARRAYOPERATIONS就可以用了。需要注意的是FORTRAN里用户自定义运算符具有最低优先级,所以在程序里使用的时候要注意优先级。如果对优先级没把握,最好把自定义的运算括起来。

下面简单解释一下定义了的运算符。其中有的矩阵运算符在求Morison单元的附加质量矩阵和阻尼矩阵的时候比较有用。

1、 点乘:.dot.
任何两个实型或复数型向量的点乘。用法:A(1:3).dot.B(1:3)

2、 叉乘:.X.
任何两个实型或复数型向量的叉乘。用法:A(1:3).X.B(1:3)

3、 叉乘矩阵:.crossmat.
当一个向量叉乘另一个向量的时候,前一个向量连同叉乘符号可以写成一个3x3的矩阵。这个矩阵乘后面的向量也可以得到叉乘的结果。用法:.crossmat.A(1:3)

4、 Motion转换:.trans.
把实型或复型的6自由度Motion从一个点转换到另一点,得到该点3个平动自由度的Motion。用法:R(1:3).trans.Zeta(1:6),R是两点间的矢量。

5、求模:.mod.
求矢量的模。用法:.mod.V(1:3)

6、单位向量:.unit.
求沿某矢量的单位向量。用法:.unit.V(1:3)

7、切向量:.tang.
求一矢量沿另一矢量的切向分量。用法:V1(1:3).tang.V2(1:3)

8、切向量矩阵:.tangmat.
得到求其他矢量沿某矢量的切向分量的转换矩阵(3X3)。用法:.tangmat.V2(1:3)

9、法向量:.norm.
求一矢量沿另一矢量的法向分量。用法:V1(1:3).norm.V2(1:3)

10、法向量矩阵:.normmat.
得到求其他矢量沿某矢量的法向分量的转换矩阵(3X3)。用法:.normmat.V2(1:3)

11、motion转换矩阵:.transmat.
得到把6自由度motion转换到另一点的转换矩阵(3X6)。用法: .transmat.R(1:3)

12、矢量旋转: .rota.
矢量由于物体的转动运动所产生的旋转(到全局坐标)。这里是通常的线性计算。用法:R(1:3).rota.Zeta(4:6)

13、矢量由全局坐标转到局部坐标: .rotGL.
矢量由于物体的转动运动所产生的旋转。矢量由全局坐标转到局部坐标。这里是非线性计算。用法:R(1:3).rotGL.Zeta(4:6)

14、矢量由局部坐标转到全局坐标: .rotLG.
矢量由于物体的转动运动所产生的旋转。矢量由局部坐标转到全局坐标。这里是非线性计算。用法:R(1:3).rotLG.Zeta(4:6)
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#2 已离线   shaopizi 

  • 职业侠客
  • 图像
  • 群组: 认证会员
  • 主题数: 240
  • 注册日期: 05-26-2009

shaopizi 发表于 01-06-2011 - 15:56
精准.石油.论坛 forum.petro-china.com

赞wavesurfer 的无私分享。 :support:
写大型程序时用预先定义的operator是一件很爽的事情。。。
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#3 已离线   candit 

  • 职业侠客
  • 图像
  • 群组: 认证会员
  • 主题数: 263
  • 注册日期: 04-24-2008

candit 发表于 01-10-2011 - 23:43
精准.石油.论坛 forum.petro-china.com

This is really helpful when developing ship hydrodynamics and dynamics codes..
Thanks for sharing...
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#4 已离线   unpoisson 

  • 一介布衣
  • 图像
  • 群组: 认证会员
  • 主题数: 59
  • 注册日期: 04-22-2008

unpoisson 发表于 01-22-2011 - 04:56
精准.石油.论坛 forum.petro-china.com

谢谢分享。
这个要顶.
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

#5 已离线   coder 

  • 一介布衣
  • 点子点子
  • 群组: 注册会员
  • 主题数: 21
  • 注册日期: 04-07-2010

coder 发表于 02-12-2011 - 09:43
精准.石油.论坛 forum.petro-china.com

查看主题引用框(wavesurfer @ 01-06-2011 - 14:09)

Attachment ArrayOperators.f90

在时域和频域水动力数值计算程序的开发中,向量点乘叉乘;向量的旋转;Motion的转换;求单位向量、切向量、法向量等等都需要做向量运算。特别是用Morison公式算Morison单元和锚链有限元线单元上的力,向量运算是必不可少的。最近有机会接触一些时域全耦合分析的源程序,感觉有必要把三维向量的计算都定义成标准的运算符,以便简化程序,而且使源程序的可读性大大提高。附件是我自己为此写的一个FORTRAN程序模块。与大家分享,并欢迎补充讨论。

这个程序就是一个FORTRAN MODULE。名字是ArrayOperations。考虑到使用方便和简化,没有定义一个专门的向量类来实现这个功能。三维向量就用长度为3的一维数组来表示,以便与其他子程序里表示矩阵的数组自由运算。所以这相当于FORTRAN数组操作的延伸,只是这里强调的功能是三维向量运算。这个程序模块是通用的,任何FORTRAN子程序只要需要用到这里定义的运算符就可以在程序开始加一个USE ARRAYOPERATIONS就可以用了。需要注意的是FORTRAN里用户自定义运算符具有最低优先级,所以在程序里使用的时候要注意优先级。如果对优先级没把握,最好把自定义的运算括起来。

下面简单解释一下定义了的运算符。其中有的矩阵运算符在求Morison单元的附加质量矩阵和阻尼矩阵的时候比较有用。

1、 点乘:.dot.
任何两个实型或复数型向量的点乘。用法:A(1:3).dot.B(1:3)

2、 叉乘:.X.
任何两个实型或复数型向量的叉乘。用法:A(1:3).X.B(1:3)

3、 叉乘矩阵:.crossmat.
当一个向量叉乘另一个向量的时候,前一个向量连同叉乘符号可以写成一个3x3的矩阵。这个矩阵乘后面的向量也可以得到叉乘的结果。用法:.crossmat.A(1:3)

4、 Motion转换:.trans.
把实型或复型的6自由度Motion从一个点转换到另一点,得到该点3个平动自由度的Motion。用法:R(1:3).trans.Zeta(1:6),R是两点间的矢量。

5、求模:.mod.
求矢量的模。用法:.mod.V(1:3)

6、单位向量:.unit.
求沿某矢量的单位向量。用法:.unit.V(1:3)

7、切向量:.tang.
求一矢量沿另一矢量的切向分量。用法:V1(1:3).tang.V2(1:3)

8、切向量矩阵:.tangmat.
得到求其他矢量沿某矢量的切向分量的转换矩阵(3X3)。用法:.tangmat.V2(1:3)

9、法向量:.norm.
求一矢量沿另一矢量的法向分量。用法:V1(1:3).norm.V2(1:3)

10、法向量矩阵:.normmat.
得到求其他矢量沿某矢量的法向分量的转换矩阵(3X3)。用法:.normmat.V2(1:3)

11、motion转换矩阵:.transmat.
得到把6自由度motion转换到另一点的转换矩阵(3X6)。用法: .transmat.R(1:3)

12、矢量旋转: .rota.
矢量由于物体的转动运动所产生的旋转(到全局坐标)。这里是通常的线性计算。用法:R(1:3).rota.Zeta(4:6)

13、矢量由全局坐标转到局部坐标: .rotGL.
矢量由于物体的转动运动所产生的旋转。矢量由全局坐标转到局部坐标。这里是非线性计算。用法:R(1:3).rotGL.Zeta(4:6)

14、矢量由局部坐标转到全局坐标: .rotLG.
矢量由于物体的转动运动所产生的旋转。矢量由局部坐标转到全局坐标。这里是非线性计算。用法:R(1:3).rotLG.Zeta(4:6)



哈哈,赞设计思想
精准.石油.论坛 forum.petro-china.com






----
来源: 精准石油论坛 - 推进信息共享,提升科技水平
0

第一页
  • 您无法发起一个新主题
  • 您无法回复此主题