ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/JSOC/proj/rings/apps/ola_subs.f
Revision: 1.1
Committed: Tue Nov 15 18:50:51 2011 UTC (11 years, 10 months ago) by rick
Branch: MAIN
CVS Tags: Ver_8-11, Ver_6-0, Ver_6-1, Ver_6-2, Ver_6-3, Ver_6-4, Ver_8-12, Ver_8-8, Ver_8-2, Ver_8-3, Ver_8-0, Ver_8-1, Ver_8-6, Ver_8-7, Ver_8-4, Ver_8-5, Ver_7-1, Ver_7-0, Ver_8-10, Ver_9-1, Ver_9-0
Log Message:
added for JSOC release 6.0

File Contents

# Content
1 c =======================================================
2 c SUBROUTINES AND FUNCTIONS
3 c =======================================================
4
5 c -----------------------------
6 subroutine fwidth(npt,np,num,rad,avc,widthc,bverb)
7 cc call fwidth(npt,np,num,rad,avc,idthc)
8 implicit real*8(a,c-h,o-z)
9 CC IMP. log. now 'b', not 'q' ('q' was already taken)
10 implicit logical(b)
11 parameter(nn=4000)
12 parameter(nx0=100)
13 dimension rad(npt), avc(npt), widthc(3)
14 dimension dx(nn), sumker(nn), qq(3)
15 dimension fb(10),y(nn)
16
17 q1=0.25d0
18 q2=0.5d0
19 q3=0.75d0
20
21
22 do 100 j=1,np-1
23 dx(j)=rad(j)-rad(j+1)
24 100 continue
25
26 k=1
27 sum=0.d0
28 sumker(1)=0.d0
29 do 300 j=1,np-1
30 sker=0.5d0*(avc(j)+avc(j+1))
31 sum=sum+dx(j)*sker
32 sumker(j+1)=sum
33 cc write(72,*)rad(j), avc(j),sumker(j+1)
34 300 continue
35 200 continue
36
37 j=1
38 anor=sumker(np)
39 if(bverb)then
40 print*, 'anor ', anor
41 endif
42 do 400 i=1,np
43 sumker(i)=sumker(i)/anor
44 cc write(82,*)rad(i), sumker(i)
45 400 continue
46 if(bverb) print*, sumker(i),sumker(np)
47 410 continue
48
49 ntab=np
50 reps=1.d-5
51
52 j=1
53 do 1010 i=1,np
54 y(i)=sumker(i)
55 1010 continue
56 nuse=4
57 call DIVDIF(q1,y,rad,NUSE,NTAB,FB,REPS,IER,DFB,DDFB)
58 widthc(1)=fb(nuse)
59 nuse=4
60 call DIVDIF(q2,y,rad,NUSE,NTAB,FB,REPS,IER,DFB,DDFB)
61 widthc(2)=fb(nuse)
62 nuse=4
63 call DIVDIF(q3,y,rad,NUSE,NTAB,FB,REPS,IER,DFB,DDFB)
64 widthc(3)=fb(nuse)
65 1000 continue
66 if(bverb) print*,'wid ', widthc
67
68 return
69 end
70 c -------------------------
71 c SUBROUTINE WHICH CALLS LAPACK ROUTINES
72 c =====================================
73
74 subroutine solve(la,lb,norder,nrhs,a,b,ierr,ipiv,qverb)
75 implicit real*8(a-h,o-p,r-z)
76 implicit logical(q)
77 character*1 trans, uplo
78
79 dimension a(la,norder), b(lb,nrhs), ipiv(norder)
80 dimension work (10000)
81
82 lwork=10000
83 uplo='u'
84 call dsytrf(uplo, norder, a ,la, ipiv, work, lwork, ier)
85 if(ier.ne.0)then
86 print*,'error in transformation', ier
87 endif
88
89 trans='N'
90 uplo='u'
91 call dsytrs(uplo,norder,nrhs,a,la,ipiv,b,lb,ierr)
92 if(qverb) print*, 'solution ier', ierr
93 return
94 end
95
96
97 FUNCTION NEARST(XB,X,NTAB)
98 implicit real*8(a-h,o-z)
99 DIMENSION X(NTAB)
100
101 LOW=1
102 IGH=NTAB
103 IF(.NOT.(XB.LT.X(LOW).EQV.XB.LT.X(IGH))) THEN
104
105
106 1500 IF(IGH-LOW.GT.1) THEN
107 MID=(LOW+IGH)/2
108 IF(XB.LT.X(MID).EQV.XB.LT.X(LOW)) THEN
109 LOW=MID
110 ELSE
111 IGH=MID
112 ENDIF
113 GO TO 1500
114 ENDIF
115 ENDIF
116
117 IF(ABS(XB-X(LOW)).LT.ABS(XB-X(IGH))) THEN
118 NEARST=LOW
119 ELSE
120 NEARST=IGH
121 ENDIF
122 END
123
124 c --------------------------------------------------
125
126 SUBROUTINE DIVDIF(XB,X,F,NUSE,NTAB,FB,REPS,IER,DFB,DDFB)
127 implicit real*8(a-h,o-z)
128 PARAMETER(NMAX=10)
129 DIMENSION X(NTAB),F(NTAB),FB(*),XN(NMAX),XD(NMAX)
130
131 NEXT=NEARST(XB,X,NTAB)
132 FB(1)=F(NEXT)
133 XD(1)=F(NEXT)
134 XN(1)=X(NEXT)
135 IER=0
136 PX=1.0
137
138 DFB=0.0
139 DDFB=0.0
140 DPX=0.0
141 DDPX=0.0
142
143 IP=NEXT
144 IN=NEXT
145
146 NIT=MIN0(NMAX,NUSE,NTAB)
147 IF(NUSE.GT.NMAX.OR.NUSE.GT.NTAB) IER=12
148 IF(NUSE.LT.1) THEN
149 IER=11
150 NIT=MIN0(6,NTAB,NMAX)
151 ENDIF
152 NUSE=1
153
154 DO 5000 J=2,NIT
155
156 IF(IN.LE.1) GO TO 2200
157 IF(IP.GE.NTAB) GO TO 2000
158 IF(ABS(XB-X(IP+1)).LT.ABS(XB-X(IN-1))) GO TO 2200
159 2000 IN=IN-1
160 NEXT=IN
161 GO TO 2800
162 2200 IP=IP+1
163 NEXT=IP
164
165 2800 XD(J)=F(NEXT)
166 XN(J)=X(NEXT)
167 DO 3000 K=J-1,1,-1
168 3000 XD(K)=(XD(K+1)-XD(K))/(XN(J)-XN(K))
169
170 DDPX=DDPX*(XB-XN(J-1))+2.*DPX
171 DPX=DPX*(XB-XN(J-1))+PX
172 DFB=DFB+DPX*XD(1)
173 DDFB=DDFB+DDPX*XD(1)
174
175 PX=PX*(XB-XN(J-1))
176 ERR=XD(1)*PX
177 FB(J)=FB(J-1)+ERR
178 NUSE=J
179
180 IF(ABS(ERR).LT.REPS) RETURN
181 5000 CONTINUE
182
183 IER=24
184 END
185
186 c -------------------------------------------
187
188 SUBROUTINE GAUELM(N,NUM,A,X,DET,INT,LJ,IER,IFLG)
189 implicit real*8(a-h,o-z)
190 DIMENSION A(LJ,N),INT(N),X(LJ,NUM)
191
192 IF(N.LE.0.OR.N.GT.LJ) THEN
193 IER=111
194 RETURN
195 ENDIF
196
197 IER=122
198 IF(IFLG.LE.1) THEN
199 DET=1.0
200 DO 2600 K=1,N-1
201 R1=0.0
202 DO 2200 L=K,N
203 IF(ABS(A(L,K)).GT.R1) THEN
204 R1=ABS(A(L,K))
205 KM=L
206 ENDIF
207 2200 CONTINUE
208
209 INT(K)=KM
210 IF(KM.NE.K) THEN
211 DO 2300 L=K,N
212 T1=A(K,L)
213 A(K,L)=A(KM,L)
214 2300 A(KM,L)=T1
215 DET=-DET
216 ENDIF
217
218 DET=DET*A(K,K)
219 IF(A(K,K).EQ.0.0) RETURN
220 C IF(ABS(A(K,K)).LT.REPS) RETURN
221 DO 2500 L=K+1,N
222 A(L,K)=A(L,K)/A(K,K)
223 DO 2500 L1=K+1,N
224 2500 A(L,L1)=A(L,L1)-A(L,K)*A(K,L1)
225 2600 CONTINUE
226 DET=DET*A(N,N)
227 INT(N)=N
228 IF(A(N,N).EQ.0.0) RETURN
229 C IF(ABS(A(N,N)).LT.REPS) RETURN
230
231 IER=0
232 IF(IFLG.EQ.1) THEN
233 IFLG=2
234 RETURN
235 ENDIF
236 IFLG=2
237 ENDIF
238
239 IER=0
240 DO 5000 J=1,NUM
241 DO 3000 K=1,N-1
242 IF(K.NE.INT(K)) THEN
243 T1=X(K,J)
244 X(K,J)=X(INT(K),J)
245 X(INT(K),J)=T1
246 ENDIF
247 DO 3000 L=K+1,N
248 3000 X(L,J)=X(L,J)-A(L,K)*X(K,J)
249
250 X(N,J)=X(N,J)/A(N,N)
251 DO 3300 K=N-1,1,-1
252 DO 3200 L=N,K+1,-1
253 3200 X(K,J)=X(K,J)-X(L,J)*A(K,L)
254 3300 X(K,J)=X(K,J)/A(K,K)
255 5000 CONTINUE
256 END
257