経過時間を計算します。計算結果は時間の単位で出力されます。
$ eltime 20150129 085600 20150129 095600
1.00000000000000
$ eltime 20150129 085600 20150130 085600
24.0000000000000
eltimeを引数なしで実行すると、使用法が表示されます。
$ eltime
This program calculates elapsed time in hour.
Usage: eltime yyyymmdd1 hhmmss1 yyyymodd2 hhmiss2
yyyymmdd: 8-digit number representing year, month, day
hhmmss: 6-digit number representing hour, minute, and second.
eltime.f90
program eltime
! Description:
!
! Author: am
!
! Host: aofd165.fish.nagasaki-u.ac.jp
! Directory: /work1/am/temp/Erapsed.Time
!
! Revision history:
! Created by /usr/local/mybin/nff.sh at 08:38 on 01-29-2015.
character(len=1000)::strm
character(len=8),dimension(2)::yyyymmdd
character(len=6),dimension(2)::hhmmss
integer,dimension(2)::yyyy,mo,dd,hh,mi,ss
integer,dimension(2)::julian
real(8),dimension(2)::timeh
real(8),parameter::d2h=24.d0, m2h=1.d0/60.d0, s2h=1.d0/3600.d0
real(8)::elapsed_time
n=iargc()
if(n==0)then
print '(A)','This program calculates elapsed time in hour.'
call usage()
stop
endif
if(n/=4)then
print '(A)','Error: Wrong number of arguments.'
call usage()
stop
endif
call getarg(1, yyyymmdd(1))
call getarg(2, hhmmss(1))
call getarg(3, yyyymmdd(2))
call getarg(4, hhmmss(2))
do i=1,2
read(yyyymmdd(i)(1:4),*)yyyy(i)
read(yyyymmdd(i)(5:6),*) mo(i)
read(yyyymmdd(i)(7:8),*) dd(i)
read(hhmmss(i)(1:2),*) hh(i)
read(hhmmss(i)(3:4),*) mi(i)
read(hhmmss(i)(5:6),*) ss(i)
! print '(i4.4,2i2.2,1x,3i2.2)',yyyy(i),mo(i),dd(i),hh(i),mi(i),ss(i)
enddo
do i=1,2
julian(i)=julday(yyyy(i),mo(i),dd(i))
timeh(i)=dble(julian(i))*d2h + dble(hh(i)) + dble(mi(i))*m2h &
& + dble(ss(i))*s2h
enddo
elapsed_time=timeh(2)-timeh(1)
print *,elapsed_time
stop
end program
subroutine caldat(JULIAN,IYYY,MONTH,DD)
INTEGER,intent(in):: JULIAN
integer,intent(out)::IYYY,MONTH,DD
! NAME IN/OUT DESCRIPTION
!
! JULIAN I THE JULIAN DAY
! IYYY O THE YEAR
! MONTH O THE MONTH (1 TO 12)
! DD O THE DAY OF THE MONTH
!
INTEGER IGREG
PARAMETER (IGREG=2299161)
INTEGER JALPHA,JA,JB,JC,JD,JE
!
IF (JULIAN .GE. IGREG) THEN
JALPHA = INT(((JULIAN - 1867216) - 0.25)/36524.25)
JA = JULIAN + 1 + JALPHA - INT(0.25*JALPHA)
ELSE
JA = JULIAN
ENDIF
JB = JA + 1524
JC = INT(6680. + ((JB - 2439870) - 122.1)/365.25)
JD = 365*JC + INT(0.25*JC)
JE = INT((JB - JD)/30.6001)
DD = JB - JD - INT(30.6001*JE)
MONTH = JE - 1
IF (MONTH .GT. 12) MONTH = MONTH - 12
IYYY = JC - 4715
IF (MONTH .GT. 2) IYYY = IYYY - 1
IF (IYYY .LE. 0) IYYY = IYYY - 1
RETURN
end subroutine caldat
INTEGER FUNCTION JULDAY(IYYY,MONTH,DD)
INTEGER:: IYYY,MONTH,DD
!
! NAME IN/OUT DESCRIPTION
!
! IYYY I YEAR
! MONTH I MONTH (1 TO 12)
! DD I DAY OF MONTH
! JULDAY O JULIAN DAY
!
INTEGER IGREG
PARAMETER (IGREG = 15 + 31*(10 + 12*1582))
INTEGER JY,JM,JA
!
IF (IYYY .LT. 0) IYYY = IYYY + 1
IF (MONTH .GT. 2) THEN
JY = IYYY
JM = MONTH + 1
ELSE
JY = IYYY - 1
JM = MONTH + 13
ENDIF
JULDAY = INT(365.25*JY) + INT(30.6001*JM) + DD + 1720995
IF (DD + 31*(MONTH + 12*IYYY) .GE. IGREG) THEN
JA = INT(0.01*JY)
JULDAY = JULDAY + 2 - JA + INT(0.25*JA)
ENDIF
RETURN
end function julday
subroutine usage()
print '(A)','Usage: eltime yyyymmdd1 hhmmss1 yyyymodd2 hhmiss2'
print '(A)','yyyymmdd: 8-digit number representing year, month, day'
print '(A)','hhmmss: 6-digit number representing hour, minute, and second.'
end subroutine
#j Fortran77とFortran90/95の混成プログラムのコンパイル用makefile
#
#j 作成 Sun Feb 15 15:16:02 2009
#
#j 参考文献
#j makefile の書き方
#j http://www.eis.osakafu-u.ac.jp/~yabu/soft/makefile.html
#j Makefile小技と新バージョンのDelFEM(FEMとUIの日記@New York)
#j http://d.hatena.ne.jp/etopirika5/20091207/1260207955
#
#-----------------------------------------
#j マクロの定義
#-----------------------------------------
#j コンパイラの指定
FC=ifort
#FC=gfortran
#j OBJDIR (オブジェクトファイルをおくディレクトリ)
OBJDIR=./obj
#-----------------------------------------
#j コンパイルオプション(ifort)
#-----------------------------------------
#j デバッグ用オプション(はじめて実行するときには必ずこのオプションをつけてコンパイルする)
FDFLAGS= #-traceback -check -CB -fpe0
#j コンパイルオプション
FFLAGS=-module ${OBJDIR}
#j -module : モジュールファイル(.mod)を置く場所を指定する
#j 最適化用(他にも何種類かある. ifort -helpかマニュアルを見て調べる)
#FFLAGS = -O3 -module ${OBJDIR}
#j 倍精度
#FFLAGS = -r8 -module ${OBJDIR}
#j 入力データのバイト・スワップ(大型計算機のバイナリデータを読む時などにつかう)
#FFLAGS = #-convert big_endian -module ${OBJDIR}
#-----------------------------------------
#j リンク用のオプション
#-----------------------------------------
LDFLAGS=-module ${OBJDIR}
#j ターゲット名(最終的に作りたい実行ファイル名)
TARGET1=eltime
TARGET2=
TARGETS=$(TARGET1) $(TARGET2)
#j MOD (Fortran90以降のモジュールファイル)
MOD=
#j SRC7 (Fortran77のソースファイル)
SRC7=
#j SRC9 (Fortran90のソースファイル)
SRC9=$(TARGET1).f90
#j OBJ1 (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM=$(MOD:.f90=.o)
OBJ7=$(SRC7:.f=.o)
OBJ9=$(SRC9:.f90=.o)
OBJTMP=$(OBJM) $(OBJ7) $(OBJ9)
OBJ1=$(OBJTMP:%=${OBJDIR}/%)
MOD2=
#j SRC7 (Fortran77のソースファイル)
SRC72=
#j SRC9 (Fortran90のソースファイル)
SRC92=
#j OBJ (ターゲットを作るのに必要なオブジェクトファイル名)
OBJM2=$(MOD2:.f90=.o)
OBJ72=$(SRC72:.f=.o)
OBJ92=$(SRC92:.f90=.o)
OBJTMP2=$(OBJM2) $(OBJ72) $(OBJ92)
OBJ2=$(OBJTMP2:%=${OBJDIR}/%)
OBJ=$(OBJ1) $(OBJ2)
#-----------------------------------------
#j ここからコンパイルのルールの記述
#-----------------------------------------
all: mkobjd $(TARGETS)
$(TARGET1): $(OBJ1)
$(FC) -o $@ $(OBJ1) ${LDFLAGS}
$(TARGET2): $(OBJ2)
$(FC) -o $@ $(OBJ2) ${LDFLAGS}
#j 暗黙のサフィックスルールを無効にする
.SUFFIXES:
#j サフィックスの追加
.SUFFIXES: .o .f .f90
#j f77のソースファイルのコンパイル(.f用のサフィックスルール)
${OBJDIR}/%.o : %.f
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j f90のソースファイルのコンパイル(.f90用のサフィックスルール)
${OBJDIR}/%.o : %.f90
$(FC) -c ${FDFLAGS} ${FFLAGS} -c -o $@ $<
#j オブジェクトファイルを削除
clean:
rm -rf $(OBJ) ${OBJDIR}/*.mod
#j オブジェクトファイルと実行ファイルを削除
distclean:
rm -rf $(OBJ) ${OBJDIR}/*.mod $(TARGETS) \
rm -rf ${OBJDIR}
#j オブジェクトファイルを置くディレクトリを作成
mkobjd:
if [ ! -d ${OBJDIR} ]; then \
mkdir -p ${OBJDIR} ; \
fi
#j tarファイルを作る
tar:
tar cvf $(TARGET1).tar ./*.f90 ./*.f ./*.c ./*.h ./*.txt makefile
$ make
if [ ! -d ./obj ]; then \
mkdir -p ./obj ; \
fi
ifort -c -module ./obj -c -o obj/eltime.o eltime.f90
ifort -o eltime ./obj/eltime.o -module ./obj