6.1.1 ユーザー定義メソッド(元関数)

以下のエントリをユーザー自身が用意することで, 独自の変換メソッド(元関数)を定義することができる.

xx, yy = NumRu::DCL.stfusr(ux,uy) 正変換
ux, uy = NumRu::DCL.stiusr(xx,yy) 逆変換
stsusr メソッド(元関数)初期化


この正変換と逆変換のエントリは, stftrf の下請けルーチンである stftrn から呼ばれる. stfusr に渡ってくる ux, uy の値は, stfradstfrot による処理が終った後の値である. 拡大, 並行移動はstftrn が行なうので, これらのメソッド(元関数)は, それ以外の基本的な変換メソッド(元関数)を定義するだけで良い. 変換メソッド(元関数)には正変換と逆変換があるが, 逆変換を使わない場合には, 逆変換はエントリー文だけで良い.

stsusr は, 変換メソッド(元関数)を確定するsgstrfから呼ばれる. このエントリは, 通常sgstrf が行なっている STPACK のメソッド(元関数)を 初期化しなければならない. 初期化すべきメソッド(元関数)は, ststrf, ststrn, stsrad, stsrot (地図投影の時) である.

次のプログラムは常用対数の log-log 座標を定義するものである.


*--------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*--------------------------------------------------------------
      SUBROUTINE xx, yy = NumRu::DCL.stfusr(ux,uy)

      XX = LOG(UX)
      YY = LOG(UY)

      RETURN
*--------------------------------------------------------------
      ENTRY ux, uy = NumRu::DCL.stiusr(xx,yy)

      UX = EXP(XX)
      UY = EXP(YY)

      RETURN
      END
*--------------------------------------------------------------
      SUBROUTINE stsusr

      vxmin, vxmax, vymin, vymax = NumRu::DCL.sgqvpt()
      uxmin, uxmax, uymin, uymax = NumRu::DCL.sgqwnd()

      CX = (VXMAX-VXMIN)/LOG(UXMAX/UXMIN)
      CY = (VYMAX-VYMIN)/LOG(UYMAX/UYMIN)

      VX0 = VXMIN - CX*LOG(UXMIN)
      VY0 = VYMIN - CY*LOG(UYMIN)

      NumRu::DCL.ststrf(lmapa)
      NumRu::DCL.stsrad(lxdeg,lydeg)
      NumRu::DCL.ststrn(itr,cxa,cya,vxoff,vyoff)

      END

次のプログラムは MATH1/MAPLIB の MPFMWL/MPIMWL を使って モルワイデもどきの地図投影メソッド(元関数)を定義するものである.

*---------------------------------------------------------------
*     USER SUPPLIED FUNCTION
*---------------------------------------------------------------
      SUBROUTINE xx, yy = NumRu::DCL.stfusr(ux,uy)

      CALL MPFMWL(UX, UY, XX, YY) 
      RETURN 
*---------------------------------------------------------------
      ENTRY ux, uy = NumRu::DCL.stiusr(xx,yy) 

      CALL MPIMWL(XX, YY, UX, UY) 

      RETURN 
      END 
*---------------------------------------------------------------
      SUBROUTINE stsusr 
      LOGICAL LDEG 

      vxmin, vxmax, vymin, vymax = NumRu::DCL.sgqvpt() 
      simfac, vxoff, vyoff = NumRu::DCL.sgqsim() 
      plx, ply, plrot = NumRu::DCL.sgqmpl() 
      lpara = NumRu::DCL.sglget(cp) 

      IF(LDEG) THEN 
        CP = return_value = NumRu::DCL.rfpi()/180 
      ELSE 
        CP = 1 
      ENDIF 

      rpara = NumRu::DCL.sgrget(cp) 
      rpara = NumRu::DCL.sgrget(cp) 
      rpara = NumRu::DCL.sgrget(cp) 
      rpara = NumRu::DCL.sgrget(cp) 
      CALL SZSCLX(CP*TXMIN, CP*TXMAX) 
      CALL SZSCLY(CP*TYMIN, CP*TYMAX) 

      VX0 = (VXMAX+VXMIN)/2 + XOFF 
      VY0 = (VYMAX+VYMIN)/2 + YOFF 

      NumRu::DCL.ststrf(lmapa) 
      NumRu::DCL.stsrad(lxdeg,lydeg) 
      CALL stsrot(return_value = NumRu::DCL.rfpi() 
      NumRu::DCL.ststrn(itr,cxa,cya,vxoff,vyoff) 

      END