标签:
fortranoop面向对象 |
分类: 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) |
判断某一年是否为闰年 |
说明:
- pri表示方法是私有(-)或是公有(+);
- 变量this表示一个date对象,str为形式为'2010-07-10 18:20:00'的长度为19的字符串,vec为长度为6的整型向量,year是表示年份的整数,time为对应时间的一个精度14位浮点数。
fortran面向对象方法
fortran实现面向对象编程,主要通过用户自定义类型type的定义来完成。
http://s5/middle/7a1c18a8zx6BSbkg2xK94&690类)" />
- 用户自定义类型中包含的变量可以添加private关键字,作为类成员的属性,用户使用类构建对象时候无法对对象的属性直接操作,这就完成了封装功能。
- 通过contains关键字,自定义类型和方法进行绑定,并且方法用public和private关键字进行定义,说明方法是否为私有函数。另外加在模块中将所有方法定义为私有,那么对象定义的私有方法才真正意义上实现"私有"。
- 使用generic关键字实现方法重载,对于某种功能函数,能够用多种类型变量作为参量调用将会非常方便。
date类中各个函数功能详细说明
因为私有函数主要被其他过程调用,首先介绍私有函数
- num_in_the_year(this)判断某个时刻是该年的第几天。当然,该天数应该精确到小数后8位,达到1s的精度。该天数最小为0,最大小于365(闰年小于366)。参数为date类型对象。
- is_leap_year_fn(year)判断某年是否为闰年,输入表示年份整数。
- trans_vec2str(vec)将表示时间的包含六个元素的向量转化为'2010-07-10 18:20:00'形式的字符串。
- trans_str2vec(str)将表示时间的19个字符长度的字符串转化为包含六个元素的向量。
- trans_vec2realtime(vec)将表示时间的包含六个元素的向量转化为该时刻对应的浮点数
- set_date_str(this,str)通过字符串形式设定对象表示时间,此过程包含trans_str2vec(str)、trans_vec2realtime(vec)
- set_date_vec(this,vec)通过向量形式设定对象表示的时间,此过程包含trans_vec2str(vec)、trans_vec2realtime(vec)
公有函数共4个:
- set_date(this,str/vec)函数重载了set_date_str(this,str)、set_date_vec(this,vec)两个私有函数的方法,可以通过字符串或者向量形式设定对象表示的时间。
- get_date_str(this,str)获得对象表示时间的字符串形式
- get_date_vec(this,vec) 获得对象表示时间的向量形式
- 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)
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写入字符串中
! 特别注意,格式'(i4)'是写入的整型变量vec(1)的格式,而非字符变量year的格式
(2)字符型=≫整型:read从字符串中读入
mod_date.f90
下面贴上包含date类模块全部代码:
http://s11/middle/7a1c18a8zx6BSbkl8sa2a&690类)" />
http://s14/middle/7a1c18a8zx6BSbkG0nX5d&690类)" />
http://s15/middle/7a1c18a8zx6BSbkNmsC9e&690类)" />
http://s11/middle/7a1c18a8zx6BSbkQuAq8a&690类)" />
http://s16/middle/7a1c18a8zx6BSbkV6jRff&690类)" />