加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

fortran面向对象编程(date 类)

(2013-08-15 15:10:51)
标签:

fortran

oop

面向对象

分类: fortran

在家也没闲着哦

date类功能

date主要是将时间转化为一个相对应的浮点数来表示,可以设定每个对象表示时间,然后获得各个时间对应的浮点数。

浮点数单位为天(day),及每单位1表示1d = 24h = 24×60min = 24×3600s,但是为了减少转化为浮点数时产生的误差,将浮点数精度设定为14位,即表示1s所需天数小数位长度。

我们将原点设置为,公元1年1月1日 0:00:00,那么以此为基点,'2010-07-11 00:00:00'对应的实数为733994.00000000000,也就是说2010年7月11日距公元1日共有733994天。

设定对象时间时候可以用字符串方法,例如'2010-07-11 00:00:00',也可以用向量形式,例如[2010,07,10,01,00,00]这样的六个元素的向量。

date类主要内容

属性

类型

说明

date_str

character

储存日期字符串,形式:'2010-07-10 18:20:00'

date_vec

integer

储存日期向量,形式:[2010 07 10 18 20 00]

date_time

real(kind=select_real_kind(p=14))

储存日期对应的实数,精度13位,指数6位

 

类型

pri

方法

说明

 

+

set_date(this,str/vec)

设定对象表示时间

subroutine

subroutine

-

set_date_str(this,str)

通过字符串设定时间

-

set_date_vec(this,vec)

通过向量设定时间,向量必须包含6个元素

subroutine

+

get_date_str(this,str)

获得表示对象时间的字符串

subroutine

+

get_date_vec(this,vec)

获得表示对象时间的向量

subroutine

+

get_date_real(this,time)

获得表示对象时间的实数

function

-

num_in_the_year(this)

计算该时刻在一年中的时间

function

-

trans_vec2str(vec)

时间从向量形式转化为字符串形式

function

-

trans_str2vec(str)

时间从字符串形式转化为向量形式

function

-

trans_vec2realtime(this)

时间从向量形式转化为表示时间的实数

function

 

is_leap_year_fn(year)

判断某一年是否为闰年

 

说明:

  1. pri表示方法是私有(-)或是公有(+);
  2. 变量this表示一个date对象,str为形式为'2010-07-10 18:20:00'的长度为19的字符串,vec为长度为6的整型向量,year是表示年份的整数,time为对应时间的一个精度14位浮点数。

 

fortran面向对象方法

fortran实现面向对象编程,主要通过用户自定义类型type的定义来完成。

http://s5/middle/7a1c18a8zx6BSbkg2xK94&690类)" />

  1. 用户自定义类型中包含的变量可以添加private关键字,作为类成员的属性,用户使用类构建对象时候无法对对象的属性直接操作,这就完成了封装功能。
  2. 通过contains关键字,自定义类型和方法进行绑定,并且方法用public和private关键字进行定义,说明方法是否为私有函数。另外加在模块中将所有方法定义为私有,那么对象定义的私有方法才真正意义上实现"私有"。
  3. 使用generic关键字实现方法重载,对于某种功能函数,能够用多种类型变量作为参量调用将会非常方便。

 

date类中各个函数功能详细说明

因为私有函数主要被其他过程调用,首先介绍私有函数

  1. num_in_the_year(this)判断某个时刻是该年的第几天。当然,该天数应该精确到小数后8位,达到1s的精度。该天数最小为0,最大小于365(闰年小于366)。参数为date类型对象。
  2. is_leap_year_fn(year)判断某年是否为闰年,输入表示年份整数。
  3. trans_vec2str(vec)将表示时间的包含六个元素的向量转化为'2010-07-10 18:20:00'形式的字符串。
  4. trans_str2vec(str)将表示时间的19个字符长度的字符串转化为包含六个元素的向量。
  5. trans_vec2realtime(vec)将表示时间的包含六个元素的向量转化为该时刻对应的浮点数
  6. set_date_str(this,str)通过字符串形式设定对象表示时间,此过程包含trans_str2vec(str)、trans_vec2realtime(vec)
  7. set_date_vec(this,vec)通过向量形式设定对象表示的时间,此过程包含trans_vec2str(vec)、trans_vec2realtime(vec)

公有函数共4个:

  1. set_date(this,str/vec)函数重载了set_date_str(this,str)set_date_vec(this,vec)两个私有函数的方法,可以通过字符串或者向量形式设定对象表示的时间。
  2. get_date_str(this,str)获得对象表示时间的字符串形式
  3. get_date_vec(this,vec) 获得对象表示时间的向量形式
  4. get_date_real(this,time) 获得对象表示时间对应的浮点数

 

下面就是一些细节和遇到的问题:

1、对于设定对象时间函数set_data_vec函数来说,本来是用function过程即可(输入一个向量,返回date对象)。但是形参列表中没有date对象无法与date类型进行绑定。故需要使用subroutine过程,date对象作为形参中一个输入。

 

2、用户自定义对象绑定过程时,对于gun编译器,尽量使用subroutine过程,使用function时候gun编译器报错。

function get_date_vec(this)

            implicit none

            integer, dimension(6) :: get_date_vec

            class(date) :: this

            get_date_vec = this�te_vec

endfunction get_date_vec

调用时候:

temp = now%get_date_vec()

调用模块进行编译时候报错:

$ gfortran test.f90 mod_date.o -o main

test.f90: 在函数'test':

test.f90:13:0: 编译器内部错误:在 gfc_conv_variable 中,于 fortran/trans-expr.c:551

请提交一份完整的错误报告,

如有可能请附上经预处理后的源文件。

具体步骤请参见 <http://gcc.gnu.org/bugs.html>

 

3、get_date_str需要字符串作为形参输入子例程中,字符串长度固定为19字符。(形式:'2010-07-10 18:20:00')

num_in_the_year_fn计算某年中时刻对应的实数(不超过365):

(1)"年月日"相比时刻"时分秒"有所不同:"年月日"第一个序号为1,而"时分秒"序号起始为0,,故经过的月份和日期都要减1,度过的时分秒则不需要。

(2)精度select_real_kind(p=14)情况下,1h误差为8.8×10-10

select_real_kind(p=17)情况下,1h误差为5.6×10-13

 

4、trans_str2vec(str)和trans_vec2str(vec)作用为将时间从字符串形式与向量形式之间相互转化。其中主要为整型和字符串型变量之间相互转化,使用内部文件方法:

(1)整型=字符型:write写入字符串中

            character(len = 19) :: trans_vec2str

            character(len = 4) :: year

            write(year,'(i4)')vec(1)    

! 特别注意,格式'(i4)'是写入的整型变量vec(1)的格式,而非字符变量year的格式

(2)字符型=整型:read从字符串中读入

            integer, dimension(6) :: trans_str2vec

            character(len = 19) :: str

            read(str(1:4),*)trans_str2vec(1)

            read(str(6:7),*)trans_str2vec(2)

            read(str(9:10),*)trans_str2vec(3)

            read(str(12:13),*)trans_str2vec(4)

            read(str(15:16),*)trans_str2vec(5)

            read(str(18:19),*)trans_str2vec(6)

 

 

 

mod_date.f90

下面贴上包含date类模块全部代码:

http://s11/middle/7a1c18a8zx6BSbkl8sa2a&amp;690类)" />

http://s14/middle/7a1c18a8zx6BSbkG0nX5d&amp;690类)" />

http://s15/middle/7a1c18a8zx6BSbkNmsC9e&amp;690类)" />

http://s11/middle/7a1c18a8zx6BSbkQuAq8a&amp;690类)" />

http://s16/middle/7a1c18a8zx6BSbkV6jRff&amp;690类)" />

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有