
# CLCKLIB を移植するときの注意

CLCKLIB に含まれる CLCKST はシステムが供給する実行時間を得るためのルー
チンを使用する. 以下に, SunFORTRAN 1.4, Lahey Fortran および C 言語で
記述した例を示す.

このパッケージでは C 言語で書かれたものを標準としている. 

なお C 言語の例の中の識別子は次のような意味を持つ. 

  CLOCKS_PER_SEC : 関数 clock ではかる時間の単位をあらわす. これで割っ
    てやれば秒単位となる. 
  CLK_TCK : 関数 clock の精度をあらわす. これで割ってやれば秒単位の精
    度となる. 

これらはふつうシステムが定義している. もしも, これらの識別子が見つから
ない場合は man clock などを見て, それそれのシステムに適切な値をトップ
ディレクトリにある Mkinclude の中の CLK_PER_SEC, CLK_RSL_TCK として指
定すること. 

CLK_PER_SEC, CLK_RSL_TCK が必要かどうかは, ふつう configure でチェック
される.

CLCKLIB が正しく移植されているかどうかを確かめるためには,
demo/misc1/clcklib にある clck01.f をコンパイルし,

  % time clck01

などとし, time が返す値と clck01 が返す値とが, だいたい同じになってい
るかどうかを見てやればよい. 

*-----------------------------------------------------------------------
*     SUN Fortran version
*-----------------------------------------------------------------------
      SUBROUTINE CLCKST
      REAL    X(2)
      LOGICAL LFIRST
      SAVE
      DATA LFIRST / .TRUE. /
     #     DT     / 1.E-2  /  !!!!! 時間の分解能. 単位は秒 !!!!!
 
          CALL ETIME(X)       !!!!! 実行時間を得るサービスルーチン !!!!
          TIME0=X(1)
          LFIRST=.FALSE.
          RETURN
 
      ENTRY CLCKGT(TIME)
          IF(LFIRST) CALL MSGDMP('E', 'CLCKGT', 'CLKRST MUST BE CALLED'
     #                           //' PRIOR TO THIS ROUTINE.')
          CALL ETIME(X)       !!!!! 実行時間を得るサービスルーチン !!!!
          TIME= X(1)-TIME0
          RETURN
 
      ENTRY CLCKDT(DT0)
          DT0 = DT
          RETURN
      END
*-----------------------------------------------------------------------
*     Lahey Fortran version
*-----------------------------------------------------------------------
      SUBROUTINE CLCKST
      LOGICAL LFIRST
      SAVE
      DATA LFIRST / .TRUE. /
     #     DT     / 0.01   /   !!!!! 時間の分解能. 単位は秒 !!!!!

          CALL TIMER(ITIME0)   !!!!! 実行時間を得るサービスルーチン !!!!
          LFIRST=.FALSE.
          RETURN

      ENTRY CLCKGT(TIME)
          IF(LFIRST) CALL MSGDMP('E', 'CLCKGT', 'CLKRST MUST BE CALLED'
     #                           //' PRIOR TO THIS ROUTINE.')
          CALL TIMER(ITIME)    !!!!! 実行時間を得るサービスルーチン !!!!
          TIME = (ITIME-ITIME0)*DT
          RETURN

      ENTRY CLCKDT(DT0)
          DT0 = DT*100         !!!!! 組み込み関数 TIMER の仕様としては
          RETURN               !!!!! 0.01秒の分解能を持つが, 
      END                      !!!!! pc98 では1秒単位しか得られない. 

/*
 *    clckst (written in C)
 */

#include <stdio.h>
#include <time.h>

#define TRUE   1             /* numeric value for true  */
#define FALSE  0             /* numeric value for false */

#ifndef CLOCKS_PER_SEC
#define CLOCKS_PER_SEC CLK_PER_SEC
#endif

#ifndef CLK_TCK
#define CLK_TCK CLK_RSL_TCK
#endif

static int lfirst = TRUE;
static clock_t time0;

void clckst_()
{
    time0 = clock();
    lfirst = FALSE;
}

void clckgt_(time)
    float *time;
{
    if (lfirst){
	fprintf (stderr, "*** Error in clckgt : ");
	fprintf (stderr, "Clckst must be called prior to this routine.\n");
	exit(1);
    }
    else{
	*time = (float) (clock() - time0) / (float) CLOCKS_PER_SEC;
    }
}

void clckdt_(dt0)
    float *dt0;
{
    *dt0 = 1.0 / CLK_TCK;
}
