35
36
37
39 USE spmd_mod
40
41
42
43#include "implicit_f.inc"
44
45
46
47#include "spmd.inc"
48
49
50
51#include "com01_c.inc"
52#include "param_c.inc"
53#include "task_c.inc"
54
55
56
57 INTEGER NODGLOB(*),NOD_PXFEM(*),EMPSIZPL
58 INTEGER IPLY,IDPLY
60 . x(3,*),zi_ply(nplyxfe,*)
61 REAL R4
62
63
64
65#ifdef MPI
66 INTEGER MSGOFF,MSGOFF2,STAT(MPI_STATUS_SIZE,NSPMD-1), IERR
67
68 DATA msgoff/7055/
69 DATA msgoff2/7056/
70
71 INTEGER I,N,II,ND,EMPL,P,ITAG
72 INTEGER PLYSIZ
75
76 REAL , DIMENSION(:,:), ALLOCATABLE :: WRTBUF
78 * , DIMENSION(:,:), ALLOCATABLE :: fsendbuf,frecbuf
79 INTEGER, DIMENSION(:), ALLOCATABLE :: ISENDBUF,IRECBUF
80
81
82 ii = idply
83
84
85 IF (ispmd ==0) THEN
86 plysiz =
plynod(iply)%PLYNUMNODS
87 ALLOCATE(wrtbuf(3,
plysizg(iply)))
88
89
90 DO nd=1,plysiz
92 n = nod_pxfem(i)
93 norm = sqrt(vn_nod(1,n)**2+vn_nod(2,n)**2+vn_nod(3,n)**2)
95 empl =
plynod(iply)%PLYNODID(nd)-empsizpl
96
98 val = x(1,i)+zi_ply(n,iply)*vn +
ply(iply)%U(1,n)
99 wrtbuf(1,empl)= val
100
101 vn = vn_nod(2,n)*
norm
102 val = x(2,i)+zi_ply(n,iply)*vn +
ply(iply)%U(2,n)
103 wrtbuf(2,empl)= val
104
105 vn = vn_nod(3,n)*
norm
106 val = x(3,i)+zi_ply(n,iply)*vn +
ply(iply)%U(3,n)
107 wrtbuf(3,empl)= val
108 END DO
109
110 DO p=2,nspmd
114 itag=msgoff
116 . it_spmd(p),itag, spmd_comm_world, stat, ierr)
117 itag=msgoff2
119 . it_spmd(p),itag, spmd_comm_world, stat, ierr)
121 empl = irecbuf(i)-empsizpl
122 wrtbuf(1,empl)=frecbuf(1,i)
123 wrtbuf(2,empl)=frecbuf(2,i)
124 wrtbuf(3,empl)=frecbuf(3,i)
125 ENDDO
126 DEALLOCATE(irecbuf,frecbuf)
127 ENDIF
128 ENDDO
129
131 DEALLOCATE(wrtbuf)
132 empsizpl=empsizpl+
plysizg(iply)
133 ELSE
134 plysiz =
plynod(iply)%PLYNUMNODS
135 ALLOCATE (fsendbuf(3,plysiz))
136 ALLOCATE (isendbuf(plysiz))
137 IF (plysiz > 0) THEN
138 DO nd=1,plysiz
139 i =
plynod(iply)%NODES(nd)
140 n = nod_pxfem(i)
141 norm = sqrt(vn_nod(1,n)**2+vn_nod(2,n)**2+vn_nod(3,n)**2)
143 vn = vn_nod(1,n)*
norm
144 fsendbuf(1,nd) = x(1,i)+zi_ply(n,iply)*vn +
ply(iply)%U(1,n)
145 vn = vn_nod(2,n)*
norm
146 fsendbuf(2,nd) = x(2,i)+zi_ply(n,iply)*vn +
ply(iply)%U(2,n)
147 vn = vn_nod(3,n)*
norm
148 fsendbuf(3,nd) = x(3,i)+zi_ply(n,iply)*vn +
ply(iply)%U(3,n)
149 isendbuf(nd) =
plynod(iply)%PLYNODID(nd)
150 END DO
151 itag=msgoff
152 CALL mpi_send(isendbuf,plysiz,mpi_integer,it_spmd(1),
153 . itag,spmd_comm_world,ierr)
154
155 itag=msgoff2
156 CALL mpi_send(fsendbuf,plysiz*3,real,it_spmd(1),
157 . itag,spmd_comm_world,ierr)
158
159 DEALLOCATE(isendbuf,fsendbuf)
160 ENDIF
161 ENDIF
162
163
164#endif
165 RETURN
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
type(plynods), dimension(:), allocatable plynod
type(ply_data), dimension(:), allocatable ply
integer, dimension(:), allocatable plysizg
integer, dimension(:,:), allocatable plyiadnod
void write_r_c(float *w, int *len)