source: PSPA/parmelaPSPA/trunk/emit90dp.f @ 411

Last change on this file since 411 was 12, checked in by lemeur, 12 years ago

parmela pspa initial

File size: 4.1 KB
Line 
1       subroutine EMIT90DP (nt90,n,dpx,dpy,dpa,dpb,e90,e100,e)
2c-----------------------------------------------------------------------
3c      **name**        EMIT90          filename is EMIT90P.for
4c
5c      **description** This is a patch file for routine emit90 in PARMELA.
6c      EMIT90 calculates the 90% and 100% particle-enclosing ellipse areas.
7c      This version implements a speedier algorithm for finding the 90th
8c      percentile particle.  The z-array is destroyed.
9c
10c      Old routine: N*N/10 points scanned.
11c      Present version: 4-6*N points scanned.
12c
13c      Further speedup is possible with an extra storage array.
14c
15c      **written**     1.00    07/01/86                        rajeev rohatgi
16c
17c      **revised**     1.01    07/01/86        working         rajeev rohatgi
18c
19c----------------------------------------------------------------------------
20       implicit double precision (e)
21c
22       include 'param_sz.h'
23       include 'ucom.h'
24c
25       double precision dpa,dpb,a,b
26       double precision dpx(n),dpy(n)
27       double precision dpxb,dpyb,xb,yb
28       double precision x(imaa),y(imaa),z(imaa)
29       double precision xi,yi,zi,s0,s1,s2,g,atmp,sk
30c--------------------------------------------------------------------------
31c*
32       if (n.le.1) return
33       do 11 i=1,n
34       x(i)=dpx(i)
35       y(i)=dpy(i)
36 11    continue
37C     FIND ELLIPSE SHAPE PARAMETERS
38       call elipsdp (nt90,n,dpx,dpy,dpa,dpb,dpxb,dpyb,e)
39       if(e.eq.0.0) return
40c      if you want 80 percent change 0.9 in 0.8 and in format 330 of outlal
41       n90     = n*0.9+0.5
42       a=dpa
43       b=dpb
44       xb=dpxb
45       yb=dpyb
46       if(b.eq.0.0) return
47       g       = (1.+a*a)/b
48       atmp    = 2.*a
49       s0      = 0.
50       s1      = 0.
51C     CALCULATE AN AREA ASSOCIATED WITH EACH POINT
52       do 10 i=1,n
53       xi      = x(i)-xb
54       yi      = y(i)-yb
55       zi      = xi*(g*xi+atmp*yi)+b*yi*yi
56       x(i)    = xi
57       y(i)    = yi
58       z(i)    = zi
59       s0      = s0+zi
60       s1      = dmax1(zi,s1)
61 10    continue
62       s0      = s0/n
63       nk      = n
64       m       = n+1-n90
65C     LOOP TO SCAN AND PARTITION PARTICLES WRT MEAN
66 20    continue
67       kk      = 0
68C     COUNT PARTICLES ABOVE MEAN
69       do 29 i=1,nk
70       if (z(i).gt.s0) kk = kk+1
71 29    continue
72c-------------------------------------------------------------------------
73       if(kk.eq.0) then
74        if(nt90.eq.1) then
75       write(nemit,*) 
76     * ' kk = 0 for (x,xp) in emit 90 no calculation of e90 and e100'
77        else
78       write(nemit,*) 
79     * ' kk = 0 for (y,yp) in emit 90 no calculation of e90 and e100'
80        endif
81       e90 = 0.
82       e100 = 0.
83       else
84       if (kk.ge.m) then
85         if (kk.eq.m) then
86C                                      TAKE BOTTOM-MOST OF THE 'ABOVE' SET
87           s2  = s1
88           do 39 i=1,nk
89           if (z(i).gt.s0) s2 = dmin1(s2,z(i))
90 39        continue
91         else
92C                                      TAKE THE 'ABOVE' SET
93           sk  = 0.
94           j   = 1
95           do 49 i=1,nk
96           zi  = z(i)
97           if (zi.le.s0) go to 49
98           z(j) = zi
99           sk  = sk+zi
100           j   = j+1
101 49        continue
102           nk  = kk
103           s0  = sk/nk
104C                                      LOOP BACK TO PARTITION REDUCED SET
105           go to 20
106         end if
107       else
108         m     = m-kk
109         if (m.eq.1) then
110C                                      TAKE TOP-MOST OF 'BELOW' SET
111           s2  = 0.
112           do 59 i=1,nk
113           if (z(i).le.s0) s2 = dmax1(s2,z(i))
114 59        continue
115         else
116C                                      TAKE 'BELOW' SET
117           sk  = 0.
118           j   = 1
119           do 69 i=1,nk
120           zi  = z(i)
121           if (zi.gt.s0) go to 69
122           z(j) = zi
123           sk  = sk+zi
124           j   = j+1
125 69        continue
126           nk  = nk-kk
127           s0  = sk/nk
128C                                      LOOP BACK TO PARTITION REDUCED SET
129           go to 20
130         end if
131       end if
132       e90     = s2
133       e100    = s1
134       endif
135c-----------------------------------------------------------------------
136       return
137       end
Note: See TracBrowser for help on using the repository browser.