00001
00002
00003
00004
00005 SUBROUTINE DMATD(NEQ,X,Y,YPRIME,DELTA,CJ,H,IER,EWT,E,
00006 * WM,IWM,RES,IRES,UROUND,JACD,RPAR,IPAR)
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
00065 DIMENSION Y(*),YPRIME(*),DELTA(*),EWT(*),E(*)
00066 DIMENSION WM(*),IWM(*), RPAR(*),IPAR(*)
00067 EXTERNAL RES, JACD
00068
00069 PARAMETER (LML=1, LMU=2, LMTYPE=4, LNRE=12, LNPD=22, LLCIWP=30)
00070
00071 LIPVT = IWM(LLCIWP)
00072 IER = 0
00073 MTYPE=IWM(LMTYPE)
00074 GO TO (100,200,300,400,500),MTYPE
00075
00076
00077
00078
00079 100 LENPD=IWM(LNPD)
00080 DO 110 I=1,LENPD
00081 110 WM(I)=0.0D0
00082 CALL JACD(X,Y,YPRIME,WM,CJ,RPAR,IPAR)
00083 GO TO 230
00084
00085
00086
00087
00088 200 IRES=0
00089 NROW=0
00090 SQUR = SQRT(UROUND)
00091 DO 210 I=1,NEQ
00092 DEL=SQUR*MAX(ABS(Y(I)),ABS(H*YPRIME(I)),
00093 * ABS(1.D0/EWT(I)))
00094 DEL=SIGN(DEL,H*YPRIME(I))
00095 DEL=(Y(I)+DEL)-Y(I)
00096 YSAVE=Y(I)
00097 YPSAVE=YPRIME(I)
00098 Y(I)=Y(I)+DEL
00099 YPRIME(I)=YPRIME(I)+CJ*DEL
00100 IWM(LNRE)=IWM(LNRE)+1
00101 CALL RES(X,Y,YPRIME,CJ,E,IRES,RPAR,IPAR)
00102 IF (IRES .LT. 0) RETURN
00103 DELINV=1.0D0/DEL
00104 DO 220 L=1,NEQ
00105 220 WM(NROW+L)=(E(L)-DELTA(L))*DELINV
00106 NROW=NROW+NEQ
00107 Y(I)=YSAVE
00108 YPRIME(I)=YPSAVE
00109 210 CONTINUE
00110
00111
00112
00113
00114 230 CALL DGETRF( NEQ, NEQ, WM, NEQ, IWM(LIPVT), IER)
00115 RETURN
00116
00117
00118
00119
00120 300 RETURN
00121
00122
00123
00124
00125 400 LENPD=IWM(LNPD)
00126 DO 410 I=1,LENPD
00127 410 WM(I)=0.0D0
00128 CALL JACD(X,Y,YPRIME,WM,CJ,RPAR,IPAR)
00129 MEBAND=2*IWM(LML)+IWM(LMU)+1
00130 GO TO 550
00131
00132
00133
00134
00135 500 MBAND=IWM(LML)+IWM(LMU)+1
00136 MBA=MIN0(MBAND,NEQ)
00137 MEBAND=MBAND+IWM(LML)
00138 MEB1=MEBAND-1
00139 MSAVE=(NEQ/MBAND)+1
00140 ISAVE=IWM(LNPD)
00141 IPSAVE=ISAVE+MSAVE
00142 IRES=0
00143 SQUR=SQRT(UROUND)
00144 DO 540 J=1,MBA
00145 DO 510 N=J,NEQ,MBAND
00146 K= (N-J)/MBAND + 1
00147 WM(ISAVE+K)=Y(N)
00148 WM(IPSAVE+K)=YPRIME(N)
00149 DEL=SQUR*MAX(ABS(Y(N)),ABS(H*YPRIME(N)),
00150 * ABS(1.D0/EWT(N)))
00151 DEL=SIGN(DEL,H*YPRIME(N))
00152 DEL=(Y(N)+DEL)-Y(N)
00153 Y(N)=Y(N)+DEL
00154 510 YPRIME(N)=YPRIME(N)+CJ*DEL
00155 IWM(LNRE)=IWM(LNRE)+1
00156 CALL RES(X,Y,YPRIME,CJ,E,IRES,RPAR,IPAR)
00157 IF (IRES .LT. 0) RETURN
00158 DO 530 N=J,NEQ,MBAND
00159 K= (N-J)/MBAND + 1
00160 Y(N)=WM(ISAVE+K)
00161 YPRIME(N)=WM(IPSAVE+K)
00162 DEL=SQUR*MAX(ABS(Y(N)),ABS(H*YPRIME(N)),
00163 * ABS(1.D0/EWT(N)))
00164 DEL=SIGN(DEL,H*YPRIME(N))
00165 DEL=(Y(N)+DEL)-Y(N)
00166 DELINV=1.0D0/DEL
00167 I1=MAX0(1,(N-IWM(LMU)))
00168 I2=MIN0(NEQ,(N+IWM(LML)))
00169 II=N*MEB1-IWM(LML)
00170 DO 520 I=I1,I2
00171 520 WM(II+I)=(E(I)-DELTA(I))*DELINV
00172 530 CONTINUE
00173 540 CONTINUE
00174
00175
00176
00177
00178 550 CALL DGBTRF(NEQ, NEQ, IWM(LML), IWM(LMU), WM, MEBAND,
00179 * IWM(LIPVT), IER)
00180 RETURN
00181
00182
00183 END