OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
cfac_type3_symmetrize.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
14 SUBROUTINE cmumps_symmetrize( BUF, BLOCK_SIZE,
15 & MYROW, MYCOL, NPROW, NPCOL,
16 & A, LOCAL_M, LOCAL_N, N, MYID, COMM )
17 IMPLICIT NONE
18 INTEGER BLOCK_SIZE, NPROW, NPCOL, LOCAL_M, LOCAL_N, N, COMM
19 INTEGER MYROW, MYCOL, MYID
20 COMPLEX BUF( BLOCK_SIZE * BLOCK_SIZE )
21 COMPLEX A( LOCAL_M, LOCAL_N )
22 INTEGER NBLOCK, IBLOCK, JBLOCK, IBLOCK_SIZE, JBLOCK_SIZE
23 INTEGER ROW_SOURCE, ROW_DEST, COL_SOURCE, COL_DEST
24 INTEGER IGLOB, JGLOB
25 INTEGER IROW_LOC_SOURCE, JCOL_LOC_SOURCE
26 INTEGER IROW_LOC_DEST, JCOL_LOC_DEST
27 INTEGER PROC_SOURCE, PROC_DEST
28 nblock = ( n - 1 ) / block_size + 1
29 DO iblock = 1, nblock
30 IF ( iblock .NE. nblock
31 & ) THEN
32 iblock_size = block_size
33 ELSE
34 iblock_size = n - ( nblock - 1 ) * block_size
35 END IF
36 row_source = mod( iblock - 1, nprow )
37 col_dest = mod( iblock - 1, npcol )
38 iglob = ( iblock - 1 ) * block_size + 1
39 irow_loc_source = block_size *
40 & ( ( iglob - 1 ) / (block_size*nprow) )
41 & + mod( iglob - 1, block_size ) + 1
42 jcol_loc_dest = block_size *
43 & ( ( iglob - 1 ) / (block_size*npcol) )
44 & + mod( iglob - 1, block_size ) + 1
45 DO jblock = 1, iblock
46 IF ( jblock .NE. nblock
47 & ) THEN
48 jblock_size = block_size
49 ELSE
50 jblock_size = n - ( nblock - 1 ) * block_size
51 END IF
52 col_source = mod( jblock - 1, npcol )
53 row_dest = mod( jblock - 1, nprow )
54 proc_source = row_source * npcol + col_source
55 proc_dest = row_dest * npcol + col_dest
56 IF ( proc_source .eq. proc_dest ) THEN
57 IF ( myid .eq. proc_dest ) THEN
58 jglob = ( jblock - 1 ) * block_size + 1
59 jcol_loc_source = block_size *
60 & ( ( jglob - 1 ) / (block_size*npcol) )
61 & + mod( jglob - 1, block_size ) + 1
62 irow_loc_dest = block_size *
63 & ( ( jglob - 1 ) / (block_size*nprow) )
64 & + mod( jglob - 1, block_size ) + 1
65 IF ( iblock .eq. jblock ) THEN
66 IF ( iblock_size .ne. jblock_size ) THEN
67 WRITE(*,*) myid,': Error in calling transdiag:unsym'
68 CALL mumps_abort()
69 END IF
70 CALL cmumps_trans_diag( a( irow_loc_source,
71 & jcol_loc_source),
72 & iblock_size, local_m )
73 ELSE
74 CALL cmumps_transpo(
75 & a( irow_loc_source, jcol_loc_source ),
76 & a( irow_loc_dest, jcol_loc_dest ),
77 & iblock_size, jblock_size, local_m )
78 END IF
79 END IF
80 ELSE IF ( myrow .eq. row_source
81 & .AND. mycol .eq. col_source ) THEN
82 jglob = ( jblock - 1 ) * block_size + 1
83 jcol_loc_source = block_size *
84 & ( ( jglob - 1 ) / (block_size*npcol) )
85 & + mod( jglob - 1, block_size ) + 1
86 CALL cmumps_send_block( buf,
87 & a( irow_loc_source, jcol_loc_source ), local_m,
88 & iblock_size, jblock_size, comm, proc_dest )
89 ELSE IF ( myrow .eq. row_dest
90 & .AND. mycol .eq. col_dest ) THEN
91 jglob = ( jblock - 1 ) * block_size + 1
92 irow_loc_dest = block_size *
93 & ( ( jglob - 1 ) / (block_size*nprow) )
94 & + mod( jglob - 1, block_size ) + 1
95 CALL cmumps_recv_block( buf,
96 & a( irow_loc_dest, jcol_loc_dest ), local_m,
97 & jblock_size, iblock_size, comm, proc_source )
98 END IF
99 END DO
100 END DO
101 RETURN
102 END SUBROUTINE cmumps_symmetrize
103 SUBROUTINE cmumps_send_block( BUF, A, LDA, M, N, COMM, DEST )
104 IMPLICIT NONE
105 INTEGER M, N, LDA, DEST, COMM
106 COMPLEX BUF(*), A(LDA,*)
107 INTEGER I, IBUF, IERR
108 INTEGER J
109 include 'mpif.h'
110 include 'mumps_tags.h'
111 ibuf = 1
112 DO j = 1, n
113 buf( ibuf: ibuf + m - 1 ) = a( 1 : m, j )
114 DO i = 1, m
115 END DO
116 ibuf = ibuf + m
117 END DO
118 CALL mpi_send( buf, m * n, mpi_complex,
119 & dest, symmetrize, comm, ierr )
120 RETURN
121 END SUBROUTINE cmumps_send_block
122 SUBROUTINE cmumps_recv_block( BUF, A, LDA, M, N, COMM, SOURCE )
123 IMPLICIT NONE
124 INTEGER LDA, M, N, COMM, SOURCE
125 COMPLEX BUF(*), A( LDA, *)
126 INTEGER I, IBUF, IERR
127 include 'mpif.h'
128 include 'mumps_tags.h'
129 INTEGER :: STATUS(MPI_STATUS_SIZE)
130 CALL mpi_recv( buf(1), m * n, mpi_complex, source,
131 & symmetrize, comm, status, ierr )
132 ibuf = 1
133 DO i = 1, m
134 CALL ccopy( n, buf(ibuf), 1, a(i,1), lda )
135 ibuf = ibuf + n
136 END DO
137 RETURN
138 END SUBROUTINE cmumps_recv_block
139 SUBROUTINE cmumps_trans_diag( A, N, LDA )
140 IMPLICIT NONE
141 INTEGER N,LDA
142 COMPLEX A( LDA, * )
143 INTEGER I, J
144 DO i = 2, n
145 DO j = 1, i - 1
146 a( j, i ) = a( i, j )
147 END DO
148 END DO
149 RETURN
150 END SUBROUTINE cmumps_trans_diag
151 SUBROUTINE cmumps_transpo( A1, A2, M, N, LD )
152 IMPLICIT NONE
153 INTEGER M,N,LD
154 COMPLEX A1( LD,* ), A2( LD, * )
155 INTEGER I, J
156 DO j = 1, n
157 DO i = 1, m
158 a2( j, i ) = a1( i, j )
159 END DO
160 END DO
161 RETURN
162 END SUBROUTINE cmumps_transpo
#define mumps_abort
Definition VE_Metis.h:25
subroutine cmumps_trans_diag(a, n, lda)
subroutine cmumps_symmetrize(buf, block_size, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, comm)
subroutine cmumps_recv_block(buf, a, lda, m, n, comm, source)
subroutine cmumps_send_block(buf, a, lda, m, n, comm, dest)
subroutine cmumps_transpo(a1, a2, m, n, ld)
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
Definition ccopy.f:81
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
Definition mpi.f:461
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
Definition mpi.f:480