40
41
42
45 USE elbufdef_mod
46
47
48
49#include "implicit_f.inc"
50
51
52
53#include "com01_c.inc"
54#include "com04_c.inc"
55#include "param_c.inc"
56#include "sphcom.inc"
57#include "parit_c.inc"
58
59
60
61 INTEGER LGAUGE(3,*), KXSP(NISP,*), IXSP(KVOISPH,*),
62 . IPARG(NPARG,*), ISPSYM(NSPCOND,*), NOD2SP(*), ITASK
63
65 . gauge(llgauge,*), spbuf(nspbuf,*), x(3,*),xspsym(3,*),
66 . wa(kwasph,*), wasigsm(6,*), war(10,*)
67 TYPE (ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
68 DOUBLE PRECISION SPHG_F6(4,6,NBGAUGE)
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 INTEGER I,N,INOD,JNOD,J,NVOIS,M,
117 . NVOISS,SM,JS,NC,NS,NN,
118 . IG,NEL,KAD,NG,K,KK,SFGAUGE,FR_RL(NSPMD+2)
120 . xi,yi,zi,di,rhoi,xj,yj,zj,dj,rhoj,vj,
121 . wght,alphai,wcompi,
122 . pp,ee,press,ener,rho
123 TYPE(G_BUFEL_) ,POINTER :: GBUF
125 . , DIMENSION(:), ALLOCATABLE :: fgauge1,fgauge2,fgauge3,fgauge4
126
127 fr_rl(:) = 1
128
129 DO ig=1,nbgauge
130 IF(lgauge(1,ig) > -(numels+1)) cycle
131
132 n=numsph+ig
133 xi =gauge(2,ig)
134 yi =gauge(3,ig)
135 zi =gauge(4,ig)
136 wcompi =zero
137 press =zero
138 ener =zero
139 rho =zero
140
141 nvois=kxsp(4,n)
142
143 sfgauge = kxsp(4,n) + kxsp(6,n)
144 ALLOCATE(fgauge1(sfgauge),fgauge2(sfgauge),fgauge3(sfgauge),fgauge4(sfgauge))
145
146 DO j=1,nvois
147 jnod=ixsp(j,n)
148 IF(jnod>0)THEN
149 m=nod2sp(jnod)
150 IF(kxsp(2,m)<=0) cycle
151 xj=x(1,jnod)
152 yj=x(2,jnod)
153 zj=x(3,jnod)
154 dj =spbuf(1,m)
155 rhoj=spbuf(2,m)
156 vj=spbuf(12,m)/
max(em20,rhoj)
157 CALL weight0(xi,yi,zi,xj,yj,zj,dj,wght)
158 wcompi=vj*wght
159 pp=-third*(wa(1,m)+wa(2,m)+wa(3,m))
160 fgauge1(j) = wcompi
161 fgauge2(j) = vj*wght*pp
162 fgauge3(j) = vj*wght*rhoj
163 fgauge4(j) = ener
164 END IF
165 ENDDO
166
167
168 nvoiss=kxsp(6,n)
169 k = nvois
170 DO j=kxsp(5,n)+1,kxsp(5,n)+nvoiss
171 js=ixsp(j,n)
172 IF(js>0)THEN
173 sm=js/(nspcond+1)
174 nc=mod(js,nspcond+1)
175 js=ispsym(nc,sm)
176 xj =xspsym(1,js)
177 yj =xspsym(2,js)
178 zj =xspsym(3,js)
179 dj =spbuf(1,sm)
180 rhoj=spbuf(2,sm)
181 vj=spbuf(12,sm)/
max(em20,rhoj)
182 CALL weight0(xi,yi,zi,xj,yj,zj,dj,wght)
183 wcompi=vj*wght
184 pp=-third*(wasigsm(1,js)+wasigsm(2,js)+wasigsm(3,js))
185 k = k+1
186 fgauge1(k) = wcompi
187 fgauge2(k) = vj*wght*pp
188 fgauge3(k) = vj*wght*rhoj
189 fgauge4(k) = ener
190 END IF
191 ENDDO
192
193
194
195 DO k = 1, 6
196 sphg_f6(1,k,ig) = zero
197 sphg_f6(2,k,ig) = zero
198 sphg_f6(3,k,ig) = zero
199 sphg_f6(4,k,ig) = zero
200 END DO
201
202 IF(iparit > 0)THEN
203 CALL sum_6_float(1 ,sfgauge ,fgauge1, sphg_f6(1,1,ig),4)
204 CALL sum_6_float(1 ,sfgauge ,fgauge2, sphg_f6(2,1,ig),4)
205 CALL sum_6_float(1 ,sfgauge ,fgauge3, sphg_f6(3,1,ig),4)
206 CALL sum_6_float(1 ,sfgauge ,fgauge4, sphg_f6(4,1,ig),4)
207 ELSE
208 DO i=1,sfgauge
209 k = 1
210 sphg_f6(1,k,ig) = sphg_f6(1,k,ig) + fgauge1(i)
211 sphg_f6(2,k,ig) = sphg_f6(2,k,ig) + fgauge2(i)
212 sphg_f6(3,k,ig) = sphg_f6(3,k,ig) + fgauge3(i)
213 sphg_f6(4,k,ig) = sphg_f6(4,k,ig) + fgauge4(i)
214 END DO
215 END IF
216
217 DEALLOCATE(fgauge1,fgauge2,fgauge3,fgauge4)
218
219 END DO
220
221
222
223 IF(nspmd > 1) THEN
224
226
227 ENDIF
228
229
230
231
232
233 DO ig=1,nbgauge
234 IF(lgauge(1,ig) > -(numels+1)) cycle
235 wcompi = sphg_f6(1,1,ig)+sphg_f6(1,2,ig)+sphg_f6(1,3,ig)+
236 + sphg_f6(1,4,ig)+sphg_f6(1,5,ig)+sphg_f6(1,6,ig)
237 press = sphg_f6(2,1,ig)+sphg_f6(2,2,ig)+sphg_f6(2,3,ig)+
238 + sphg_f6(2,4,ig)+sphg_f6(2,5,ig)+sphg_f6(2,6,ig)
239 rho = sphg_f6(3,1,ig)+sphg_f6(3,2,ig)+sphg_f6(3,3,ig)+
240 + sphg_f6(3,4,ig)+sphg_f6(3,5,ig)+sphg_f6(3,6,ig)
241 alphai=one/
max(em20,wcompi)
242 press=press*alphai
243 rho =rho*alphai
244 gauge(10,ig)=press
245 gauge(12,ig)=rho
246
247 gauge(13,ig)=zero
248 END DO
249
250
251 RETURN
subroutine sum_6_float(jft, jlt, f, f6, n)
subroutine spmd_exch_fr6(fr, fs6, len)
subroutine weight0(xi, yi, zi, xj, yj, zj, h, w)