1 | subroutine EMIT90DP (nt90,n,dpx,dpy,dpa,dpb,e90,e100,e) |
---|
2 | c----------------------------------------------------------------------- |
---|
3 | c **name** EMIT90 filename is EMIT90P.for |
---|
4 | c |
---|
5 | c **description** This is a patch file for routine emit90 in PARMELA. |
---|
6 | c EMIT90 calculates the 90% and 100% particle-enclosing ellipse areas. |
---|
7 | c This version implements a speedier algorithm for finding the 90th |
---|
8 | c percentile particle. The z-array is destroyed. |
---|
9 | c |
---|
10 | c Old routine: N*N/10 points scanned. |
---|
11 | c Present version: 4-6*N points scanned. |
---|
12 | c |
---|
13 | c Further speedup is possible with an extra storage array. |
---|
14 | c |
---|
15 | c **written** 1.00 07/01/86 rajeev rohatgi |
---|
16 | c |
---|
17 | c **revised** 1.01 07/01/86 working rajeev rohatgi |
---|
18 | c |
---|
19 | c---------------------------------------------------------------------------- |
---|
20 | implicit double precision (e) |
---|
21 | c |
---|
22 | include 'param_sz.h' |
---|
23 | include 'ucom.h' |
---|
24 | c |
---|
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 |
---|
30 | c-------------------------------------------------------------------------- |
---|
31 | c* |
---|
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 |
---|
37 | C FIND ELLIPSE SHAPE PARAMETERS |
---|
38 | call elipsdp (nt90,n,dpx,dpy,dpa,dpb,dpxb,dpyb,e) |
---|
39 | if(e.eq.0.0) return |
---|
40 | c 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. |
---|
51 | C 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 |
---|
65 | C LOOP TO SCAN AND PARTITION PARTICLES WRT MEAN |
---|
66 | 20 continue |
---|
67 | kk = 0 |
---|
68 | C COUNT PARTICLES ABOVE MEAN |
---|
69 | do 29 i=1,nk |
---|
70 | if (z(i).gt.s0) kk = kk+1 |
---|
71 | 29 continue |
---|
72 | c------------------------------------------------------------------------- |
---|
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 |
---|
86 | C 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 |
---|
92 | C 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 |
---|
104 | C 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 |
---|
110 | C 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 |
---|
116 | C 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 |
---|
128 | C LOOP BACK TO PARTITION REDUCED SET |
---|
129 | go to 20 |
---|
130 | end if |
---|
131 | end if |
---|
132 | e90 = s2 |
---|
133 | e100 = s1 |
---|
134 | endif |
---|
135 | c----------------------------------------------------------------------- |
---|
136 | return |
---|
137 | end |
---|