!  McFortranModelTPL.f90 
!
!  FUNCTIONS/SUBROUTINES exported from McFortranModelTPL.dll:
!  McFortranModelTPL      - subroutine 
!
subroutine McFortranModelTPL

  ! Expose subroutine McFortranModelTPL to users of this DLL
  !
  !DEC$ ATTRIBUTES DLLEXPORT::McFortranModelTPL

  ! Variables

  ! Body of McFortranModelTPL

end subroutine McFortranModelTPL


!
!  プロパティ設定
integer function SetProperty()
  implicit none
  integer MAXPARA
  PARAMETER(MAXPARA=64)
  COMMON /PRPTY/ LParaNum, LPara(0:MAXPARA), DParaNum, DPara(0:MAXPARA)
  Integer LParaNum, LPara, DParaNum
  Real(8) DPara
  
  integer J
 !                                   WRITE(1,110) LParaNum,DParaNum
 !                               110 FORMAT('SetProperty',T16,I12, ',' ,I12 )  
 !                                   DO 10 J=0,LParaNum-1
 !                                           WRITE(1,120) J,LPara(J)
 !                                           120 FORMAT('   LPara(',I3,')=',I12 )  
 !                                   10 CONTINUE
 !                                   DO 20 J=0,DParaNum-1
 !                                           WRITE(1,130) J,DPara(J)
 !                                           130 FORMAT('   DPara(',I3,')=',F12.3 )  
 !                                   20 CONTINUE
  
  SetProperty=0  ! 異常なければ0を返す、異常有れば -1を返す
end function SetProperty

!
!  初期化処理
integer function Initialize()
    implicit none
    integer MAXPARA
    PARAMETER(MAXPARA=64)
    COMMON /INITVAL/ LValNum, LVal(0:MAXPARA), DValNum, DVal(0:MAXPARA)
    Integer LValNum, LVal, DValNum
    Real(8) DVal

                                integer J
!                                    WRITE(1,110) LValNum,DValNum
!                                110 FORMAT('Initialize',T16,I12, ',' ,I12 )  
!                                    DO 10 J=0,LValNum-1
!                                            WRITE(1,120) J,LVal(J)
!                                            120 FORMAT('   LVal(',I3,')=',I12 )  
!                                    10 CONTINUE
!                                    DO 20 J=0,DValNum-1
!                                            WRITE(1,130) J,DVal(J)
!                                            130 FORMAT('   DVal(',I3,')=',F12.3 )  
!                                    20 CONTINUE

    Initialize=0  ! 異常なければ0を返す、異常有れば -1を返す
end function Initialize

!
!  受信データ取得処理
subroutine GetRcvData(DTPTN)
    implicit none 	
    Integer DTPTN
    integer MAXIN
    PARAMETER(MAXIN=500)  

    COMMON /RECVDT/RcvDtNum,RcvDt(0:MAXIN),RcvTime,validFlg  
    Real(8) RcvDt,RcvTime
    Integer validFlg,RcvDtNum
  
    ! データパターン(DTPTN)別に受信データを取得する
                                    integer J
!                                    WRITE(1,110) DTPTN
!                                110 FORMAT('GetRcvData',T16,'PTN=',I12 )  
!                                    WRITE(1,120) RcvDtNum,RcvTime,validFlg
!                                120 FORMAT('    GetRcvDataNum=',I12,'  RcvTime=', F9.3, ' Flg=',I12 )  
!                                    DO 20 J=0,RcvDtNum-1
!                                            WRITE(1,130) J,RcvDt(J)
!                                            130 FORMAT('         RcvDt(',I3,')=',F12.3 )  
!                                    20 CONTINUE

end subroutine GetRcvData

!
!  計算実行処理
integer function Calculate()
    implicit none

    integer MAXIN,MAXOUT
  	PARAMETER(MAXIN=500)
  	PARAMETER(MAXOUT=500)
    
  	COMMON /CTL/SimTime,TargetTime,deltaT
  	Real(8) SimTime,TargetTime,deltaT

	COMMON /RECVDT/RcvDtNum,RcvDt(0:MAXIN),RcvTime,validFlg  
	COMMON /SENDDT/SndDtNum,SndDt(0:MAXOUT),SndTime 	
  	Real(8) RcvDt,RcvTime,SndDt,SndTime
  	Integer validFlg,RcvDtNum,SndDtNum
  	
  	                                integer J
!                                    WRITE(1,110) SimTime,TargetTime,deltaT
!                                110 FORMAT('Calculate',T16,F12.3, ',' ,F12.3, ',' ,F12.3 )  
                                    DO 10 J=0,RcvDtNum-1
                                        SndDt(J) = RcvDt(J) * 2.0
                                10 CONTINUE
                                    SndDtNum=RcvDtNum
                                    
     Calculate=0  ! 異常なければ0を返す、異常有れば -1を返す                            
end function Calculate

!
!  計算結果送信処理
subroutine PutSndData(DTPTN)
    implicit none
    integer MAXOUT
  	PARAMETER(MAXOUT=500)
  	Integer DTPTN  
  	COMMON /CTL/SimTime,TargetTime,deltaT
  	Real(8) SimTime,TargetTime,deltaT
	COMMON /SENDDT/SndDtNum,SndDt(0:MAXOUT),SndTime  	
  	Real(8) SndDt,SndTime
  	Integer SndDtNum
  	
!                                    WRITE(1,110) SimTime,DTPTN
!                                110 FORMAT('PutSndData',T16,' SndTime=',F12.3,' SndPatternNo=',I12 )  
                                    SndDtNum=3
                                    SndDt(1) = 10.123456*SndDt(0)
                                    SndDt(2) = SndDt(0)/2.0
    ! データパターン(DTPTN)別にCommon領域にデータを設定する
    SndTime = SimTime
    
end subroutine PutSndData


!===================================================================
! 以下の処理は、特別なことがない限り、そのまま使用してよい
!===================================================================
!
!  受信情報として取得したい時刻を知らせる
!  処理不要ならば、中身を実装しない
subroutine GetRcvDataTime
    implicit none
    integer MAXIN
  	PARAMETER(MAXIN=500)
  	
  	COMMON /CTL/SimTime,TargetTime,deltaT
  	Real(8) SimTime,TargetTime,deltaT

	COMMON /RECVDT/RcvDtNum,RcvDt(0:MAXIN),RcvTime,validFlg  
  	Real(8) RcvDt,RcvTime
  	Integer validFlg,RcvDtNum

    ! 取得したいデータの時刻を指定する
    RcvTime = SimTime

    Call DebugOut('GetRcvDataTime')
end subroutine GetRcvDataTime

!
!  計算開始時にコールされる処理
!  処理不要ならば、中身を実装しない
integer function StartCalc()
    implicit none
    Call DebugOpen
    Call DebugOut('StartCalc')
    StartCalc=0  ! 異常なければ0を返す、異常有れば -1を返す 
    return 
end function StartCalc

!
!  計算終了時にコールされる処理
!  処理不要ならば、中身を実装しない
integer function EndCalc()
    implicit none
    Call DebugOut('EndCalc')  
    Call DebugClose
    EndCalc=0  ! 異常なければ0を返す、異常有れば -1を返す 
    return
end function EndCalc

!
!  計算中断時にコールされる処理
!  処理不要ならば、中身を実装しない
integer function SuspendCalc()
    implicit none
    Call DebugOut('SuspendCalc')   
    SuspendCalc=0  ! 異常なければ0を返す、異常有れば -1を返す
    return        
end function SuspendCalc
