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

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

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


この正変換と逆変換のエントリは, stftrf の下請けルーチンである stftrn から呼ばれる. stfusr に渡ってくる ux, uy の値は, stfrad と stfrot による処理が終った後の値である. 拡大, 並行移動は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