1929
1930
1931
1933 USE spmd_mod
1934
1935
1936
1937#include "implicit_f.inc"
1938
1939
1940
1941#include "spmd.inc"
1942
1943
1944
1945#include "com01_c.inc"
1946#include "com08_c.inc"
1947#include "task_c.inc"
1948#include "sphcom.inc"
1949
1950
1951
1952 INTEGER
1953 . KXSP(NISP,*),
1954 . ISPHIO(NISPHIO,*),
1955 . IXSP(KVOISPH,*),NOD2SP(*),
1956 . WASPACT(*)
1958 . x(3,*),spbuf(nspbuf,*),v(3,*) ,a(3,*),
1959 . asphr(3,*),dsphr(12,*)
1960
1961
1962
1963#ifdef MPI
1964 INTEGER P, I, NN, N, IDEB, MSGTYP, LOC_PROC,
1965 . IERROR, ICELL, INOD,
1966 . REQ_SD(NSPMD), REQ_SD2(NSPMD),
1967 . REQ_SD3(NSPMD)
1968
1969 INTEGER,
1970 . DIMENSION(:,:), ALLOCATABLE :: TMP_IPPV
1971 INTEGER,
1972 . DIMENSION(:), ALLOCATABLE :: CPT_TMP,
1973 . MYPSPHS,MYPSPHS2,MYPSPHR,
1974 . REC_IPPV,SEND_IPPV,SEND_IPPV2
1975
1976 INTEGER
1977 . II,IPT,JJ,NPF,IFVITS,
1978 . NS,IACTIVE,
1979 . IPPV,J,M,JNOD,IMPOSE,JMPOSE,
1980 . NVOIS,IJ,NP,K,JMPOSE2,IPPVR,INDICE
1981 . IDEB2, C, INDICE, IDEB2,N1, SIZ,INDICE1,
1982 . NBIS,MSGOFF,MSGOFF2,MSGOFF3
1983
1987 . vx,vy,vz,vn,vt,ux,uy,uz,un1,nx,ny,nz,
1988 . ps,
1989 . xi,yi,zi,xj,yj,zj,dmin,dd,
1990 . di,rhoi,dj,rhoj,dij,
1991 . vxi,vyi,vzi,vxj,vyj,vzj,
1992 . vj,vjx,vjy,vjz,
1993 . wght,wgrad(3),wgrdx,wgrdy,wgrdz,
1994 . dxx,dxy,dxz,dyx,dyy,dyz,dzx,dzy,dzz,
1995 . exx,exy,exz,eyx,eyy,eyz,ezx,ezy,ezz,
1996 . alphai,alphaxi,alphayi,alphazi,alphai2,xp,yp,zp
1997 LOGICAL :: CONDITION
1998 DATA msgoff /2020/
1999 DATA msgoff2/2021/
2000 DATA msgoff3/2022/
2001
2002
2003
2004
2005
2006
2007 ALLOCATE(tmp_ippv(3,
nsphr),cpt_tmp(nspmd))
2008 ALLOCATE(mypsphs(nspmd+1),mypsphs2(nspmd+1),mypsphr(nspmd+1))
2010
2011 tmp_ippv(1:3,1:
nsphr) = 0
2012 mypsphs(1:nspmd+1)=0
2013 mypsphs2(1:nspmd+1)=0
2014 mypsphr(1:nspmd+1)=0
2015 cpt_tmp(1:nspmd)=0
2016 send_ippv(1:
nsphr)=0
2017 send_ippv2(1:
nsphr)=0
2019
2020 loc_proc = ispmd+1
2021
2022
2023 ippvr=0
2024 DO ns=1,nsphact
2025 n=waspact(ns)
2026 impose=kxsp(2,n)/(ngroup+1)
2027 IF(impose/=0) THEN
2028 IF ( isphio(1,impose)==2.OR.isphio(1,impose)==3 )THEN
2029 inod=kxsp(3,n)
2030 xi=x(1,inod)
2031 yi=x(2,inod)
2032 zi=x(3,inod)
2033
2034
2035 ippv=0
2036 dmin=1.e+20
2037 DO k=1,kxsp(4,n)
2038 jnod=ixsp(k,n)
2039
2040 IF(jnod>0)THEN
2041 m =nod2sp(jnod)
2042 jmpose=kxsp(2,m)/(ngroup+1)
2043 condition = .false.
2044 condition = jmpose==0
2045 IF(jmpose/=0) condition = isphio(1,jmpose)==1
2046 IF(condition)THEN
2047 xj =x(1,jnod)
2048 yj =x(2,jnod)
2049 zj =x(3,jnod)
2050 dd =(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj)
2051 IF(dd<dmin)THEN
2052 ippv=jnod
2053 dmin=dd
2054 ENDIF
2055 ENDIF
2056 ELSE
2057 nn = -jnod
2058 jmpose = nint(xsphr(12,nn))
2059 IF(jmpose>0)THEN
2060 jmpose2=isphio(1,jmpose)
2061 ELSE
2062 jmpose2=0
2063 ENDIF
2064 IF(jmpose2==0.OR.jmpose2==1)THEN
2065 xj =xsphr(3,nn)
2066 yj =xsphr(4,nn)
2067 zj =xsphr(5,nn)
2068 dd =(xi-xj)*(xi-xj)+(yi-yj)*(yi-yj)+(zi-zj)*(zi-zj)
2069 IF(dd<dmin)THEN
2070 ippv=jnod
2071 dmin=dd
2072 ENDIF
2073 ENDIF
2074 ENDIF
2075 ENDDO
2076
2077 IF(ippv<0)THEN
2078
2079 ippvr=ippvr+1
2080 tmp_ippv(1,ippvr) = -ippv
2081
2082 nbis = 0
2083 DO p=1,nspmd
2084 IF(p/=loc_proc) THEN
2085 n1 = nbis
2086 nbis = nbis+
psphr(p)
2087 IF((-ippv)<=nbis)THEN
2088 tmp_ippv(2,ippvr)=p
2089 tmp_ippv(3,ippvr)=(-ippv)-n1
2090 mypsphs(p)=mypsphs(p)+1
2091 GOTO 160
2092 ELSEIF(p==nspmd)THEN
2093 tmp_ippv(2,ippvr)=p
2094 tmp_ippv(3,ippvr)=(-ippv)-n1
2095 mypsphs(p)=mypsphs(p)+1
2096 ENDIF
2097 ENDIF
2098 ENDDO
2099 160 CONTINUE
2100 ENDIF
2101 ENDIF
2102 ENDIF
2103 ENDDO
2104
2105 mypsphs2(1)=1
2106 DO p=1,nspmd
2107 mypsphs2(p+1)=mypsphs2(p)+mypsphs(p)
2108 ENDDO
2109
2110 DO i=1,ippvr
2111 p=tmp_ippv(2,i)
2112 IF(p/=loc_proc)THEN
2113 cpt_tmp(p)=cpt_tmp(p)+1
2114 indice=mypsphs2(p)+cpt_tmp(p)-1
2115 send_ippv(indice)= tmp_ippv(3,i)
2116 send_ippv2(indice)=tmp_ippv(1,i)
2117 ENDIF
2118 ENDDO
2119
2120
2121
2122
2123
2124 DO p = 1, nspmd
2126 msgtyp = msgoff
2127 CALL spmd_isend(
2128 s mypsphs(p),1,it_spmd(p),msgtyp,
2129 g req_sd(p))
2130 END IF
2131 END DO
2132
2133
2134
2135 DO p = 1, nspmd
2137 msgtyp = msgoff
2138 CALL spmd_recv(mypsphr(p),1,it_spmd(p),
2139 . msgtyp)
2140 END IF
2141 END DO
2142
2143 DO p = 1, nspmd
2144 IF(mypsphs(p)/=0)THEN
2145 msgtyp = msgoff2
2146 ideb = mypsphs2(p)
2147 CALL spmd_isend(
2148 s send_ippv(ideb),mypsphs(p),
2149 . it_spmd(p),msgtyp,req_sd2(p))
2150 END IF
2151 END DO
2152
2153
2154 ideb = 1
2155 DO p = 1, nspmd
2156 IF(mypsphr(p)/=0)THEN
2157 msgtyp = msgoff2
2158 CALL spmd_recv(
2159 . rec_ippv(ideb),mypsphr(p),
2160 . it_spmd(p),msgtyp)
2161 ideb = ideb + mypsphr(p)
2162 END IF
2163 END DO
2164
2165
2166
2167 DO p = 1, nspmd
2169 CALL spmd_wait(req_sd(p))
2170 END IF
2171 IF(mypsphs(p)/=0)THEN
2172 CALL spmd_wait(req_sd2(p))
2173 END IF
2174 END DO
2175
2176
2177
2178 ideb = 0
2179 ideb2 = 0
2180
2181 DO p = 1, nspmd
2182
2183 IF(mypsphr(p)/=0)THEN
2184 DO n = 1, mypsphr(p)
2185 c = rec_ippv(ideb2+n)
2186 icell =
lsphs(c+ideb)
2187 inod = kxsp(3,icell)
2188 np=icell
2189 xp=x(1,inod)
2190 yp=x(2,inod)
2191 zp=x(3,inod)
2192 di =spbuf(1,np)
2193 rhoi=spbuf(2,np)
2194 CALL weight0(xp,yp,zp,xp,yp,zp,di,wght)
2195 vj=spbuf(12,np)/
max(em20,rhoi)
2196 alphai=vj*wght
2197 alphaxi=zero
2198 alphayi=zero
2199 alphazi=zero
2200
2201 DO j=1,kxsp(4,np)
2202 jnod=ixsp(j,np)
2203 IF(jnod>0)THEN
2204 m=nod2sp(jnod)
2205 jmpose=kxsp(2,m)/(ngroup+1)
2206 condition = .false.
2207 condition = jmpose==0
2208 IF(jmpose/=0) condition = isphio(1,jmpose)==1
2209 IF(condition)THEN
2210 dj =spbuf(1,m)
2211 xj =x(1,jnod)
2212 yj =x(2,jnod)
2213 zj =x(3,jnod)
2214 dij =(dj+di)*half
2215 rhoj=spbuf(2,m)
2216 CALL weight1(xp,yp,zp,xj,yj,zj,dij,wght,wgrad)
2217 vj=spbuf(12,m)/
max(em20,rhoj)
2218 alphai =alphai +vj*wght
2219 alphaxi=alphaxi+vj*wgrad(1)
2220 alphayi=alphayi+vj*wgrad(2)
2221 alphazi=alphazi+vj*wgrad(3)
2222 ENDIF
2223 ELSE
2224 nn = -jnod
2225 jmpose = nint(xsphr(12,nn))
2226 IF(jmpose>0)THEN
2227 jmpose2=isphio(1,jmpose)
2228 ELSE
2229 jmpose2=0
2230 ENDIF
2231 IF(jmpose2==0.OR.jmpose2==1)THEN
2232 dj =xsphr(2,nn)
2233 xj =xsphr(3,nn)
2234 yj =xsphr(4,nn)
2235 zj =xsphr(5,nn)
2236 dij =(dj+di)*half
2237 rhoj=xsphr(7,nn)
2238 CALL weight1(xp,yp,zp,xj,yj,zj,dij,wght,wgrad)
2239 vj=xsphr(8,nn)/
max(em20,rhoj)
2240 alphai =alphai +vj*wght
2241 alphaxi=alphaxi+vj*wgrad(1)
2242 alphayi=alphayi+vj*wgrad(2)
2243 alphazi=alphazi+vj*wgrad(3)
2244 ENDIF
2245 ENDIF
2246 ENDDO
2247
2248 alphai =one/
max(em20,alphai)
2249 alphai2=alphai*alphai
2250 alphaxi=-alphaxi*alphai2
2251 alphayi=-alphayi*alphai2
2252 alphazi=-alphazi*alphai2
2253
2254 vx =v(1,inod)+dt12*a(1,inod)
2255 vy =v(2,inod)+dt12*a(2,inod)
2256 vz =v(3,inod)+dt12*a(3,inod)
2257
2258 dxx=zero
2259 dxy=zero
2260 dxz=zero
2261 dyx=zero
2262 dyy=zero
2263 dyz=zero
2264 dzx=zero
2265 dzy=zero
2266 dzz=zero
2267
2268 DO j=1,kxsp(4,np)
2269 jnod=ixsp(j,np)
2270 IF(jnod>0)THEN
2271 m=nod2sp(jnod)
2272 jmpose=kxsp(2,m)/(ngroup+1)
2273 condition = .false.
2274 condition = jmpose==0
2275 IF(jmpose/=0) condition = isphio(1,jmpose)==1
2276 IF(condition)THEN
2277 dj =spbuf(1,m)
2278 xj =x(1,jnod)
2279 yj =x(2,jnod)
2280 zj =x(3,jnod)
2281 dij =(dj+di)*half
2282 rhoj=spbuf(2,m)
2283 CALL weight1(xp,yp,zp,xj,yj,zj,dij,wght,wgrad)
2284 wgrdx=wgrad(1)*alphai+wght*alphaxi
2285 wgrdy=wgrad(2)*alphai+wght*alphayi
2286 wgrdz=wgrad(3)*alphai+wght*alphazi
2287 vj=spbuf(12,m)/
max(em20,rhoj)
2288 vxj =v(1,jnod)+dt12*a(1,jnod)
2289 vyj =v(2,jnod)+dt12*a(2,jnod)
2290 vzj =v(3,jnod)+dt12*a(3,jnod)
2291 vjx=vj*(vxj-vx)
2292 vjy=vj*(vyj-vy)
2293 vjz=vj*(vzj-vz)
2294 dxx=dxx+vjx*wgrdx
2295 dxy=dxy+vjx*wgrdy
2296 dxz=dxz+vjx*wgrdz
2297 dyx=dyx+vjy*wgrdx
2298 dyy=dyy+vjy*wgrdy
2299 dyz=dyz+vjy*wgrdz
2300 dzx=dzx+vjz*wgrdx
2301 dzy=dzy+vjz*wgrdy
2302 dzz=dzz+vjz*wgrdz
2303 ENDIF
2304 ELSE
2305 nn=-jnod
2306 jmpose = nint(xsphr(12,nn))
2307 IF(jmpose>0)THEN
2308 jmpose2=isphio(1,jmpose)
2309 ELSE
2310 jmpose2=0
2311 ENDIF
2312 IF(jmpose2==0.OR.jmpose2==1)THEN
2313 dj =xsphr(2,nn)
2314 xj =xsphr(3,nn)
2315 yj =xsphr(4,nn)
2316 zj =xsphr(5,nn)
2317 dij =(dj+di)*half
2318 rhoj=xsphr(7,nn)
2319 CALL weight1(xp,yp,zp,xj,yj,zj,dij,wght,wgrad)
2320 wgrdx=wgrad(1)*alphai+wght*alphaxi
2321 wgrdy=wgrad(2)*alphai+wght*alphayi
2322 wgrdz=wgrad(3)*alphai+wght*alphazi
2323 vj=xsphr(8,nn)/
max(em20,rhoj)
2324 vxj =xsphr(9,nn)+dt12*asphr(1,nn)
2325 vyj =xsphr(10,nn)+dt12*asphr(2,nn)
2326 vzj =xsphr(11,nn)+dt12*asphr(3,nn)
2327 vjx=vj*(vxj-vx)
2328 vjy=vj*(vyj-vy)
2329 vjz=vj*(vzj-vz)
2330 dxx=dxx+vjx*wgrdx
2331 dxy=dxy+vjx*wgrdy
2332 dxz=dxz+vjx*wgrdz
2333 dyx=dyx+vjy*wgrdx
2334 dyy=dyy+vjy*wgrdy
2335 dyz=dyz+vjy*wgrdz
2336 dzx=dzx+vjz*wgrdx
2337 dzy=dzy+vjz*wgrdy
2338 dzz=dzz+vjz*wgrdz
2339 ENDIF
2340 ENDIF
2341 ENDDO
2342 bufs(1,n+ideb2) = dxx
2343 bufs(2,n+ideb2) = dxy
2344 bufs(3,n+ideb2) = dxz
2345 bufs(4,n+ideb2) = dyx
2346 bufs(5,n+ideb2) = dyy
2347 bufs(6,n+ideb2) = dyz
2348 bufs(7,n+ideb2) = dzx
2349 bufs(8,n+ideb2) = dzy
2350 bufs(9,n+ideb2) = dzz
2351 bufs(10,n+ideb2) = vx
2352 bufs(11,n+ideb2) = vy
2353 bufs(12,n+ideb2) = vz
2354 END DO
2355
2356
2357 msgtyp = msgoff3
2358 siz = mypsphr(p)*12
2359 CALL spmd_isend(
2360 s bufs(1,ideb2+1),siz,it_spmd(p),msgtyp,
2361 g req_sd3(p))
2362 ideb2= ideb2+mypsphr(p)
2363 ENDIF
2364 ideb = ideb +
psphs(p)
2365 END DO
2366
2367
2368
2369 ideb = 0
2370
2371 DO p = 1, nspmd
2372 IF(mypsphs(p)/=0)THEN
2373 msgtyp = msgoff3
2374 siz = 12*mypsphs(p)
2375 CALL spmd_recv(bufr,siz,it_spmd(p),
2376 . msgtyp)
2377 DO n = 1, mypsphs(p)
2378 indice1 = send_ippv2(ideb+n)
2379 dsphr(1,indice1) = bufr(1,n)
2380 dsphr(2,indice1) = bufr(2,n)
2381 dsphr(3,indice1) = bufr(3,n)
2382 dsphr(4,indice1) = bufr(4,n)
2383 dsphr(5,indice1) = bufr(5,n)
2384 dsphr(6,indice1) = bufr(6,n)
2385 dsphr(7,indice1) = bufr(7,n)
2386 dsphr(8,indice1) = bufr(8,n)
2387 dsphr(9,indice1) = bufr(9,n)
2388 dsphr(10,indice1) = bufr(10,n)
2389 dsphr(11,indice1) = bufr(11,n)
2390 dsphr(12,indice1) = bufr(12,n)
2391 ENDDO
2392 ideb = ideb + mypsphs(p)
2393 END IF
2394 END DO
2395
2396
2397
2398 DO p = 1, nspmd
2399 IF(mypsphr(p)/=0)THEN
2400 CALL spmd_wait(req_sd3(p))
2401 END IF
2402 END DO
2403
2404
2405
2406 DEALLOCATE(tmp_ippv,mypsphs,mypsphs2,mypsphr)
2407 DEALLOCATE(send_ippv,send_ippv2,rec_ippv,cpt_tmp)
2408
2409#endif
2410 RETURN
subroutine weight1(xi, yi, zi, xj, yj, zj, h, w, wgrad)
subroutine weight0(xi, yi, zi, xj, yj, zj, h, w)