C========================================================================= C INTEGRATE 1ST-ORDER LINEAR ORDINARY DIFFERENTIAL EQUATION C BY IMPLICIT-FTCS METHOD C dc/dt = (ce - c)/T C INITIAL-CONDITION : c(0) = c0 C========================================================================= C------------------ MAIN PROGRAM ----------------------------------------- IMPLICIT DOUBLE PRECISION (A-H,O-Z) PARAMETER (MXNT=1000) DOUBLE PRECISION C(0:MXNT) CHARACTER CHARTRIAL*2 CALL INPUT(C0,CE,T,TT,DT,THETA,CHARTRIAL) CALL SOLVER(MXNT,C0,CE,T,TT,DT,THETA,NT,C) CALL OUTPUT(MXNT,C0,CE,T,TT,DT,THETA,NT,C,CHARTRIAL) STOP 'NORMAL TERMINATION' END C------------------------------------------------------------------------- C------------------ SUB ROUTINE ------------------------------------------ SUBROUTINE INPUT(C0,CE,T,TT,DT,THETA,CHARTRIAL) IMPLICIT DOUBLE PRECISION (A-H,O-Z) CHARACTER CHARTRIAL*2 WRITE(*,*) 'Input initial concentration c0' READ(*,*) C0 WRITE(*,*) 'Input equilibrium concentration ce' READ(*,*) CE WRITE(*,*) 'Input internal time constant T' READ(*,*) T WRITE(*,*) 'Input total time of calculation TT' READ(*,*) TT WRITE(*,*) 'Input time step dt' READ(*,*) DT WRITE(*,*) 'Input weighting parameter theta' READ(*,*) THETA IF((THETA.LT.0).OR.(THETA.GT.1)) STOP &'The range of theta is between 0 and 1' WRITE(*,*) 'Input 2 characters to append to filename' READ(*,'(A2)') CHARTRIAL RETURN END SUBROUTINE SOLVER(MXNT,C0,CE,T,TT,DT,THETA,NT,C) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DOUBLE PRECISION C(0:MXNT) NT = TT/DT IF(NT.GT.MXNT) STOP 'NT > MXNT' C---- RESET DO N = 0,NT C(N) = 0. END DO C---- COMPUTATION OF NUMERICAL SOLUTION BY IMPLICIT METHOD C(0) = C0 DO N = 0,NT-1 C(N+1) = (1-(1-THETA)*DT/T)/(1+THETA*DT/T)*(C(N)-CE)+CE END DO RETURN END SUBROUTINE OUTPUT(MXNT,C0,CE,T,TT,DT,THETA,NT,C,CHARTRIAL) IMPLICIT DOUBLE PRECISION (A-H,O-Z) DOUBLE PRECISION C(0:MXNT) CHARACTER CHARTRIAL*2,INPDATA*13,OUTDATA*14 INPDATA = './input'//CHARTRIAL//'.dat' OUTDATA = './output'//CHARTRIAL//'.dat' C---- OUTPUT OF INPUT-PARAMETER OPEN(1,FILE=INPDATA,STATUS='REPLACE') WRITE(1,10) 'INITIAL CONCENTRATION = ', C0 WRITE(1,10) 'EQUILIBRIUM CONCENTRATION = ', CE WRITE(1,10) 'INTERNAL TIME CONSTANT = ', T WRITE(1,10) 'TOTAL TIME = ', TT WRITE(1,10) 'TIME STEP = ', DT WRITE(1,10) 'WEIGHTING PARAMETER = ', THETA 10 FORMAT(A30, F15.8) CLOSE(1) C---- OUTPUT OF NUMERICAL SOLUTION OPEN(2,FILE=OUTDATA,STATUS='REPLACE') DO N = 0,NT WRITE(2,20) N*DT, C(N) 20 FORMAT(2F20.8) END DO CLOSE(2) RETURN END