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

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

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

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

これらは man clock などを見て, それそれのシステムに適切な値をトップディ
レクトリにある Mkinclude の中で指定すること. なおこれらの値が設定され
ていない時に用いられる値は, SunOS 4.1 にけるものである. 

*-----------------------------------------------------------------------
*     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 CLK_PER_SEC
#define CLK_PER_SEC 1000000
#endif
#ifndef CLK_RSL_TCK
#define CLK_RSL_TCK 60
#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) CLK_PER_SEC;
    }
}

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