70
71
72
77
78
79
80#include "implicit_f.inc"
81
82
83
84#include "chara_c.inc"
85#include "com01_c.inc"
86#include "com04_c.inc"
87#include "com06_c.inc"
88#include "com08_c.inc"
89#include "param_c.inc"
90#include "scr18_c.inc"
91#include "scr17_c.inc"
92#include "rad2r_c.inc"
93#include "scr05_c.inc"
94#include "scr03_c.inc"
95#include "task_c.inc"
96#include "sphcom.inc"
97
98
99
100 INTEGER IEXLNK(NR2R,NR2RLNK), ITAB(*),
101 . (*), DD_R2R(NSPMD+1,*), IAD_ELEM(2,*), FR_ELEM(*),
102 . IROOT(100), ADDCNEL(0:*),CNEL(0:*),IXC(NIXC,*),ICODR(*),
103 . IPARG(NPARG,*),ICODT(*),IBFV(*),NPBY(*),DD_R2R_ELEM(*),
104 . SDD_R2R_ELEM,WEIGHT_MD(*),ILENXV,NUMSPH_GLO_R2R,FLG_SPHINOUT_R2R
105(NPARI,*)
106
107 my_real x(3,*), dx(3,*),ms(*),in(*),rby(*),stifn(*),stifr(*)
108 .
109 DOUBLE PRECISION XDP(3,*)
110
111 TYPE (GROUP_) , TARGET, DIMENSION(NGRNOD) :: IGRNOD
112 TYPE(NLOCAL_STR_), TARGET, INTENT(IN) :: NLOC_DMG
113
114
115
116 INTEGER I, J, IEX, IDP, IDG, NNG, OFC,NFTC,INFO,TYP,ITSK
117 INTEGER OMP_GET_THREAD_NUM,NUM_SOCK,SIZE_TAG_RBY,LENR,SIZE
118 INTEGER NN,N,SUM,PPID,IDEL_LOC,NSN_GLOB,COMPT
119 INTEGER, DIMENSION(:), ALLOCATABLE :: NDOF_NL
120 CHARACTER*35 ADDR
121
122 INTEGER, DIMENSION(:), POINTER :: GRNOD
123 INTEGER, POINTER, DIMENSION(:) :: ,POSI
124 my_real,
POINTER,
DIMENSION(:) :: msnl
125
126
127
128 info=numels+numelq+numelc
129 nbk = 0
130 size_tag_rby = 0
131 IF((ninter>0).AND.(idtmin(10)/=3).AND.(idtmin(11)/=3).AND.(idtmin(11)/=8)) THEN
132 ilenxv = ilenxv + 2
133 ENDIF
134
135 IF ((r2r_siu==1).OR.(nspmd==1)) THEN
136
137 IF (r2r_siu==1) THEN
138 numsph_glo_r2r = numsph
140 IF ((nsphio>0).AND.(numsph_glo_r2r>0)) flg_sphinout_r2r = 1
141 IF (nspmd>1) THEN
143 flg_sphinout_r2r =
min(1,flg_sphinout_r2r)
144 ENDIF
145 ENDIF
146
147 IF (r2r_siu==1) THEN
148 DO i=1,ninter
149 nsn_glob = ipari(5,i)
151 IF ((nsn_glob==0).AND.(ipari(7,i)==2)) ipari(7,i) = 0
152 END DO
153 ENDIF
154
158 ALLOCATE(
nllnk(nr2rlnk))
161
162 DO i = 1, rootlen
163 iroot(i) = ichar(rootnam(i:i))
164 END DO
165
166 IF (ispmd==0) THEN
169 ENDIF
170
172
173 IF(ispmd==0) THEN
174 DO itsk=2,nthread
176 addr=trim(addr)
178 END DO
179 ELSE
180 DO itsk=1,nthread
181 num_sock = nthread*ispmd+itsk
183 END DO
184 ENDIF
185
187
189
197
198 IF (r2r_siu==1) THEN
199 IF (ispmd==0) THEN
200 DO j=1,10
203 ENDDO
204 ENDIF
205 IF (nspmd>1) THEN
208 ENDIF
209 ENDIF
210
212 ofc=numels+numelq
213
214 DO iex = 1, nr2rlnk
215 idg = iexlnk(1,iex)
216 idp = iexlnk(2,iex)
217 nng = igrnod(idg)%NENTITY
218 nftc = 0
219
220 grnod => igrnod(idg)%ENTITY
221
222 IF (idp>nbk) nbk = idp
223
232 size_tag_rby = size_tag_rby + nng
233 ENDIF
234
235
236 IF ((
typlnk(iex)==5).AND.(main_side==1))
THEN
237 DO nn=1,nng
238 n = igrnod(idg)%ENTITY(nn)
239 weight_md(n) = 0
240 END DO
241 ENDIF
242
246 ENDIF
247
248
249 IF (
nllnk(iex)==1)
THEN
250
251 idxi => nloc_dmg%IDXI(1:numnod)
252 posi => nloc_dmg%POSI(1:nloc_dmg%NNOD+1)
253 compt = 0
254 ALLOCATE(ndof_nl(nng))
255 DO i=1,nng
256 nn = idxi(grnod(i))
257 ndof_nl(i) = posi(nn+1)-posi(nn)
258 compt = compt + ndof_nl(i)
259 ENDDO
262 compt = 0
263 DO i=1,nng
264 nn = idxi(grnod(i))
265 DO j=posi(nn),posi(nn+1)-1
266 compt = compt + 1
268 ENDDO
269 ENDDO
271 DEALLOCATE(ndof_nl)
272
273 IF ((nspmd > 1).AND.(sdd_r2r_elem>0)) THEN
275 DO i=1,nspmd
277 ENDDO
278 DO i=1,nspmd
280 ENDDO
281 ENDIF
282
283 ELSE
284 CALL init_link_c(idp,nng,itab,grnod,x,addcnel,cnel,ixc,
285 . ofc,info,
typlnk(iex),icodt,icodr,ncpri,iroddl,nbk,dx)
286 ENDIF
287
288 END DO
289
291
292
294
297 idel7ng =
max(idel7ng,idel_loc)
298 IF (idel7ng>=1) idel7nok = 1
299
300
301 r2rfx1 = zero
302 r2rfx2 = zero
303 ALLOCATE (
tag_rby(size_tag_rby))
304 DO iex = 1, nr2rlnk
305 idg = iexlnk(1,iex)
306 idp = iexlnk(2,iex)
307 nng = igrnod(idg)%NENTITY
308 grnod => igrnod(idg)%ENTITY
312 ELSEIF (
nllnk(iex)==1)
THEN
313
314 msnl => nloc_dmg%MASS(1:nloc_dmg%L_NLOC)
316 ELSE
318 ENDIF
319 END DO
320
321 IF (tt==zero) THEN
322 DO iex = 1, nr2rlnk
323 idg = iexlnk(1,iex)
324 idp = iexlnk(2,iex)
325 nng = igrnod(idg)%NENTITY
326 grnod => igrnod(idg)%ENTITY
328 CALL get_mass_rby_c(idp,nng,grnod,ms,in,x,npby,nrbody,rby,nnpby,nrby)
329 CALL r2r_rby(nng,itab,grnod,x,ms,in,npby,rby,xdp,1,weight)
330 ELSEIF (
nllnk(iex)==1)
THEN
331
333 ELSE
335 ENDIF
336 END DO
337
338
339 IF (nspmd>1) THEN
340 IF (sdd_r2r_elem>0) THEN
341 SIZE = 3 + iroddl*3
342 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
343
345 1 x ,x ,stifn,stifr ,ms ,
346 2 iad_elem,fr_elem,SIZE ,
347 3 lenr ,dd_r2r,dd_r2r_elem,2)
348
349 SIZE = 1 + iroddl*1
351 1 x ,x ,ms,in ,ms ,
352 2 iad_elem,fr_elem,SIZE ,
353 3 lenr ,dd_r2r,dd_r2r_elem,1)
354
355 SIZE = 28
356 IF (iresp==1) THEN
358 1 npby, rby,
359 2 iad_elem,fr_elem,SIZE ,
360 3 lenr ,dd_r2r,dd_r2r_elem,xdp)
361 ELSE
363 1 npby, rby,
364 2 iad_elem,fr_elem,SIZE ,
365 3 lenr ,dd_r2r,dd_r2r_elem,x)
366 ENDIF
367
368 ENDIF
369 ENDIF
370
371 ENDIF
372
373 ELSE
374
375
377 ALLOCATE(
dbn(nr2rlnk,nspmd),
nbel(nr2rlnk,nspmd))
379 ALLOCATE(
nbeln(nr2rlnk,nspmd))
383 ALLOCATE(
nllnk(nr2rlnk))
384
385
386 DO i = 1, rootlen
387 iroot(i) = ichar(rootnam(i:i))
388 END DO
389
390 IF(ispmd==0) THEN
391
395 1 nthread,nspmd)
396 ENDIF
397
399
400 IF(ispmd==0) THEN
401 DO itsk=2,nthread
403 END DO
404
406 CALL opensem_c(iroot,rootlen,ispmd,nthread,ppid)
407
409
419 ELSE
420
422 DO itsk=1,nthread
423 num_sock = nthread*ispmd+itsk
425 END DO
427 CALL opensem_c(iroot,rootlen,ispmd,nthread,ppid)
428 ENDIF
429
430
431 DO iex = 1, nr2rlnk
432 idg = iexlnk(1,iex)
433 idp = iexlnk(2,iex)
434 nng = igrnod(idg)%NENTITY
435 grnod => igrnod(idg)%ENTITY
436
437 IF (idp>nbk) nbk = idp
438 IF(ispmd==0) THEN
445 ENDIF
446
447 IF(nspmd>1) THEN
452 ENDIF
453
454 IF ((
typlnk(iex)==5).AND.(main_side==1))
THEN
455 DO nn=1,nng
456 n = igrnod(idg)%ENTITY(nn)
457 weight_md(n) = 0
458 END DO
459 ENDIF
460
463 size_tag_rby = size_tag_rby + nng
464 ENDIF
465
467 1 idp ,nng ,itab ,grnod,x,
468 2 dd_r2r(1,iex),dd_r2r(nspmd+1,iex),weight,addcnel,cnel,ixc,
469 3 ofc,iex,info,
typlnk(iex),icodt,icodr,ibfv,dx)
470 END DO
471
472 IF(ispmd==0) THEN
473
475
477
480 idel7ng =
max(idel7ng,idel_loc)
481 END IF
483 IF (idel7ng>=1) idel7nok = 1
484
485
486 r2rfx1 = zero
487 r2rfx2 = zero
488 DO iex = 1, nr2rlnk
489 idg = iexlnk(1,iex)
490 idp = iexlnk(2,iex)
491 nng = igrnod(idg)%NENTITY
492 grnod => igrnod(idg)%ENTITY
495 1 idp,nng,grnod,ms,in,
496 2 dd_r2r(1,iex),dd_r2r(nspmd+1,iex),weight,
rotlnk(iex))
497 ELSE
498 ALLOCATE (
tag_rby(size_tag_rby))
500 1 idp,nng,grnod,ms,in,
501 2 dd_r2r(1,iex),dd_r2r(nspmd+1,iex),weight,
rotlnk(iex),
503 ENDIF
505 END DO
506
507 IF (tt==zero) THEN
508 DO iex = 1, nr2rlnk
509 idg = iexlnk(1,iex)
510 idp = iexlnk(2,iex)
511 nng = igrnod(idg)%NENTITY
512 grnod => igrnod(idg)%ENTITY
515 1 idp,nng,grnod,ms ,in ,
516 2 dd_r2r(1,iex),dd_r2r(nspmd+1,iex),weight,iad_elem,
518 ELSE
520 1 idp,nng,grnod,ms ,in ,
521 2 dd_r2r(1,iex),dd_r2r(nspmd+1,iex),weight,iad_elem,
522 3 fr_elem,
rotlnk(iex),x,npby,rby,itab,iex,xdp)
523 ENDIF
524 END DO
525 ENDIF
526
527 END IF
528
529 RETURN
integer, dimension(:), allocatable nllnk
integer, dimension(:), allocatable rbylnk
integer, dimension(:,:), allocatable dbn
integer, dimension(:), allocatable nbdof_nl
integer, dimension(:), allocatable socket
integer, dimension(:), allocatable offset
integer, dimension(:), allocatable rotlnk
integer, dimension(:,:), allocatable tbcnel
integer, dimension(:), allocatable tag_rby
integer, dimension(:,:), allocatable nbeln
integer, dimension(:), allocatable iadd_nl
integer, dimension(:,:), allocatable nbel
integer, dimension(2) dd_r2r_nl
integer, dimension(:), allocatable add_rby
integer, dimension(:), allocatable typlnk
double precision, dimension(:,:), allocatable r2r_kine
integer, dimension(:,:), allocatable tbcneldb
integer, dimension(:), allocatable kinlnk
subroutine get_mass_spmd(idp, nng, grnod, ms, in, dd_r2r, nglob, weight, iad_elem, fr_elem, flag_rot)
subroutine get_mass_rby_spmd(idp, nng, grnod, ms, in, dd_r2r, nglob, weight, iad_elem, fr_elem, flag_rot, x, npby, rby, itab, iex, xdp)
subroutine init_link_spmd(idp, nng, itab, grnod, x, dd_r2r, nglob, weight, addcnel, cnel, ixc, ofc, iex, info, typ, icodt, icodr, ibfv, dx)
subroutine send_mass_rby_spmd(idp, nng, grnod, ms, in, dd_r2r, nglob, weight, flag_rot, npby, rby, addr)
subroutine send_mass_spmd(idp, nng, grnod, ms, in, dd_r2r, nglob, weight, flag_rot)
void init_link_c(int *igd, int *nng, int *itab, int *nodbuf, my_real_c *x, int *addcnel, int *cnel, int *ixc, int *ofc, int *info, int *typ, int *cdt, int *cdr, int *print, int *rddl, int *nlink, my_real_c *dx)
void opensem_c(int *iroot, int *len, int *ispmd, int *nthr, int *ppid)
void get_name_c(char *name)
void get_fbuf_c(my_real_c *fbuf, int *len)
void init_link_nl_c(int *igd, int *nng, int *itab, int *nodbuf, my_real_c *x, int *print, my_real_c *dx, int *ndof_nl, int *nb_tot_dof, int *nlnk)
void get_mass_rby_c(int *idp, int *nng, int *nodbuf, my_real_c *ms, my_real_c *in, my_real_c *x, int *npby, int *nrbody, my_real_c *rby, int *nnpby, int *nrby)
void get_mass_c(int *idp, int *nng, int *nodbuf, my_real_c *ms, my_real_c *in)
void init_activ_c(int *activ)
void send_fbuf_c(my_real_c *fbuf, int *len)
void send_sock_init_c(int *iroot, int *len, int *ispmd, int *sd, int *maxproc, int *imach)
void send_ibuf_c(int *ibuf, int *len)
void get_ibuf_c(int *ibuf, int *len)
void send_mass_rby_c(int *idp, int *nng, int *nodbuf, my_real_c *ms, my_real_c *in, int *npby, int *nrbody, my_real_c *rby, int *tag, int *add_rby, int *nnpby, int *nrby)
void send_mass_nl_c(int *idp, int *nng, int *iadd_nl, my_real_c *ms)
void connection_sock_c(int *ispmd, int *sd, char *addr)
void send_mass_c(int *idp, int *nng, int *nodbuf, my_real_c *ms, my_real_c *in)
void openfifo_c(int *iroot, int *len, int *fdw, int *fdr, int *sd, int *ispmd, int *nthr, int *ppid)
subroutine spmd_allglob_isum9(v, len)
subroutine spmd_exch_r2r(a, ar, stifn, stifr, ms, iad_elem, fr_elem, size, lenr, dd_r2r, dd_r2r_elem, flag)
subroutine spmd_r2r_sync(addr)
subroutine spmd_exch_r2r_rby(npby, rby, iad_elem, fr_elem, size, lenr, dd_r2r, dd_r2r_elem, x)