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)

登录
注册
帮助

多重回复
