00001 SUBROUTINE DDAJAC (NEQ, X, Y, YPRIME, DELTA, CJ, H,
00002 + IER, WT, E, WM, IWM, RES, IRES, UROUND, JAC, RPAR,
00003 + IPAR, NTEMP)
00004
00005
00006
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 INTEGER NEQ, IER, IWM(*), IRES, IPAR(*), NTEMP
00060 DOUBLE PRECISION
00061 * X, Y(*), YPRIME(*), DELTA(*), CJ, H, WT(*), E(*), WM(*),
00062 * UROUND, RPAR(*)
00063 EXTERNAL RES, JAC
00064
00065 EXTERNAL DGBTRF, DGETRF
00066
00067 INTEGER I, I1, I2, II, IPSAVE, ISAVE, J, K, L, LENPD, LIPVT,
00068 * LML, LMTYPE, LMU, MBA, MBAND, MEB1, MEBAND, MSAVE, MTYPE, N,
00069 * NPD, NPDM1, NROW
00070 DOUBLE PRECISION DEL, DELINV, SQUR, YPSAVE, YSAVE
00071
00072 PARAMETER (NPD=1)
00073 PARAMETER (LML=1)
00074 PARAMETER (LMU=2)
00075 PARAMETER (LMTYPE=4)
00076 PARAMETER (LIPVT=22)
00077
00078
00079 IER = 0
00080 NPDM1=NPD-1
00081 MTYPE=IWM(LMTYPE)
00082 GO TO (100,200,300,400,500),MTYPE
00083
00084
00085
00086 100 LENPD=NEQ*NEQ
00087 DO 110 I=1,LENPD
00088 110 WM(NPDM1+I)=0.0D0
00089 CALL JAC(X,Y,YPRIME,WM(NPD),CJ,RPAR,IPAR)
00090 GO TO 230
00091
00092
00093
00094 200 IRES=0
00095 NROW=NPDM1
00096 SQUR = SQRT(UROUND)
00097 DO 210 I=1,NEQ
00098 DEL=SQUR*MAX(ABS(Y(I)),ABS(H*YPRIME(I)),ABS(WT(I)))
00099 DEL=SIGN(DEL,H*YPRIME(I))
00100 DEL=(Y(I)+DEL)-Y(I)
00101 YSAVE=Y(I)
00102 YPSAVE=YPRIME(I)
00103 Y(I)=Y(I)+DEL
00104 YPRIME(I)=YPRIME(I)+CJ*DEL
00105 CALL RES(X,Y,YPRIME,E,IRES,RPAR,IPAR)
00106 IF (IRES .LT. 0) RETURN
00107 DELINV=1.0D0/DEL
00108 DO 220 L=1,NEQ
00109 220 WM(NROW+L)=(E(L)-DELTA(L))*DELINV
00110 NROW=NROW+NEQ
00111 Y(I)=YSAVE
00112 YPRIME(I)=YPSAVE
00113 210 CONTINUE
00114
00115
00116
00117 230 CALL DGETRF( NEQ, NEQ, WM(NPD), NEQ, IWM(LIPVT), IER)
00118 RETURN
00119
00120
00121
00122 300 RETURN
00123
00124
00125
00126 400 LENPD=(2*IWM(LML)+IWM(LMU)+1)*NEQ
00127 DO 410 I=1,LENPD
00128 410 WM(NPDM1+I)=0.0D0
00129 CALL JAC(X,Y,YPRIME,WM(NPD),CJ,RPAR,IPAR)
00130 MEBAND=2*IWM(LML)+IWM(LMU)+1
00131 GO TO 550
00132
00133
00134
00135 500 MBAND=IWM(LML)+IWM(LMU)+1
00136 MBA=MIN(MBAND,NEQ)
00137 MEBAND=MBAND+IWM(LML)
00138 MEB1=MEBAND-1
00139 MSAVE=(NEQ/MBAND)+1
00140 ISAVE=NTEMP-1
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)),ABS(WT(N)))
00150 DEL=SIGN(DEL,H*YPRIME(N))
00151 DEL=(Y(N)+DEL)-Y(N)
00152 Y(N)=Y(N)+DEL
00153 510 YPRIME(N)=YPRIME(N)+CJ*DEL
00154 CALL RES(X,Y,YPRIME,E,IRES,RPAR,IPAR)
00155 IF (IRES .LT. 0) RETURN
00156 DO 530 N=J,NEQ,MBAND
00157 K= (N-J)/MBAND + 1
00158 Y(N)=WM(ISAVE+K)
00159 YPRIME(N)=WM(IPSAVE+K)
00160 DEL=SQUR*MAX(ABS(Y(N)),ABS(H*YPRIME(N)),ABS(WT(N)))
00161 DEL=SIGN(DEL,H*YPRIME(N))
00162 DEL=(Y(N)+DEL)-Y(N)
00163 DELINV=1.0D0/DEL
00164 I1=MAX(1,(N-IWM(LMU)))
00165 I2=MIN(NEQ,(N+IWM(LML)))
00166 II=N*MEB1-IWM(LML)+NPDM1
00167 DO 520 I=I1,I2
00168 520 WM(II+I)=(E(I)-DELTA(I))*DELINV
00169 530 CONTINUE
00170 540 CONTINUE
00171
00172
00173
00174 550 CALL DGBTRF(NEQ, NEQ, IWM(LML), IWM(LMU), WM(NPD), MEBAND,
00175 * IWM(LIPVT), IER)
00176 RETURN
00177
00178 END