OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
fac_maprow_data_m.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
15 IMPLICIT NONE
16#if ! defined(NO_FDM_MAPROW)
17C =========================================
18C The MUMPS_FAC_MAPROW_DATA_M module stores
19C the MAPROW messages that arrive too early.
20C It is based on the MUMPS_FRONT_DATA_MGT_M
21C module.
22C
23C An array of structures that contain MAPROW
24C information is used as a global variable in
25C this module. It is indexed by an "IWHANDLER"
26C (stored in the main IW array) that is
27C managed by the MUMPS_FRONT_DATA_MGT_M module.
28C
29C The same handler can be used for other data
30C stored for active type 2 fronts (DESCBAND
31C information, typically)
32C ========================================
33C
34 PRIVATE
40 INTEGER :: inode, ison, nslaves_pere, nfront_pere,
41 & nass_pere, lmap, nfs4father
42 INTEGER,POINTER, DIMENSION(:) :: slaves_pere !size NSLAVES_PERE
43 INTEGER,POINTER, DIMENSION(:) :: trow !size LMAP
44 END TYPE maprow_struc_t
45 TYPE (maprow_struc_t), POINTER, DIMENSION(:), SAVE :: fmrd_array
46 CONTAINS
47 FUNCTION mumps_fmrd_is_maprow_stored( IWHANDLER )
49 INTEGER, INTENT(IN) :: iwhandler
50 IF (iwhandler .LT. 0 .OR. iwhandler .GT. size(fmrd_array)) THEN
52 ELSE
54 & (fmrd_array(iwhandler)%INODE .GE. 0 )
55 IF (fmrd_array(iwhandler)%INODE .EQ.0) THEN
56 WRITE(*,*) " Internal error 1 in MUMPS_FMRD_IS_MAPROW_STORED"
57 CALL mumps_abort()
58 ENDIF
59 ENDIF
60 RETURN
62C
63 SUBROUTINE mumps_fmrd_init( INITIAL_SIZE, INFO )
64C
65C Purpose:
66C =======
67C
68C Module initialization
69C
70C Arguments
71C =========
72C
73 INTEGER, INTENT(IN) :: initial_size
74 INTEGER, INTENT(INOUT) :: info(2)
75c
76C Local variables
77C ===============
78C
79 INTEGER :: i, ierr
80C
81 ALLOCATE(fmrd_array( initial_size ), stat=ierr)
82 IF (ierr > 0 ) THEN
83 info(1)=-13
84 info(2)=initial_size
85 RETURN
86 ENDIF
87 DO i=1, initial_size
88 fmrd_array(i)%INODE=-9999
89 NULLIFY(fmrd_array(i)%SLAVES_PERE)
90 NULLIFY(fmrd_array(i)%TROW)
91 ENDDO
92 RETURN
93 END SUBROUTINE mumps_fmrd_init
94C
96 & IWHANDLER,
97 & INODE, ISON, NSLAVES_PERE, NFRONT_PERE,
98 & NASS_PERE, LMAP, NFS4FATHER,
99 & SLAVES_PERE, !size NSLAVES_PERE
100 & TROW, !size LMAP
101 & INFO)
102C
103C Arguments:
104C =========
105C
106 INTEGER, INTENT(IN) :: inode, ison, nslaves_pere, nfront_pere,
107 & nass_pere, lmap, nfs4father
108 INTEGER, INTENT(IN) :: slaves_pere (max(1,nslaves_pere))
109 INTEGER, INTENT(IN) :: trow( lmap)
110 INTEGER, INTENT(INOUT) :: iwhandler, info(2)
111C
112C Local variables:
113C ===============
114C
115 TYPE(MAPROW_STRUC_T) :: maprow_struc
116C
117 CALL mumps_fmrd_fill_maprow( maprow_struc,
118 & inode, ison, nslaves_pere, nfront_pere,
119 & nass_pere, lmap, nfs4father,
120 & slaves_pere, !size NSLAVES_PERE
121 & trow, !size LMAP
122 & info)
123 IF (info(1) .LT. 0) RETURN
124 CALL mumps_fmrd_store_maprow(iwhandler, maprow_struc, info)
125 RETURN
126 END SUBROUTINE mumps_fmrd_save_maprow
127C
128 SUBROUTINE mumps_fmrd_store_maprow(IWHANDLER, MAPROW_STRUC, INFO)
130C
131C Purpose:
132C =======
133C
134C Given an IWHANDLER and a MAPROW structure, store the MAPROW
135C structure into the main array of the module.
136C
137C If IWHANDLER is larger than the current array size, the
138C array is reallocated.
139C
140C Arguments:
141C =========
142C
143 INTEGER, INTENT(INOUT) :: IWHANDLER, INFO(2)
144 TYPE(MAPROW_STRUC_T), INTENT(IN) :: MAPROW_STRUC
145C
146C Local variables:
147C ===============
148C
149 TYPE(maprow_struc_t), POINTER, DIMENSION(:) :: FMRD_ARRAY_TMP
150 INTEGER :: OLD_SIZE, NEW_SIZE
151 INTEGER :: I
152 INTEGER :: IERR
153C
154 CALL MUMPS_FDM_START_IDX('A', 'MAPROW', IWHANDLER, INFO)
155 IF (info(1) .LT. 0) RETURN
156 IF (iwhandler > size(fmrd_array)) THEN
157C Reallocate in a bigger array
158 old_size = size(fmrd_array)
159 new_size = max( (old_size * 3) / 2 + 1, iwhandler)
160C
161 ALLOCATE(fmrd_array_tmp(new_size),stat=ierr)
162 IF (ierr.GT.0) THEN
163 info(1)=-13
164 info(2)=new_size
165 RETURN
166 ENDIF
167 DO i=1, old_size
168 fmrd_array_tmp(i)=fmrd_array(i)
169 ENDDO
170C Similar to code in MUMPS_FMRD_INIT:
171 DO i=old_size+1, new_size
172 fmrd_array_tmp(i)%INODE = -9999
173 NULLIFY(fmrd_array_tmp(i)%SLAVES_PERE)
174 NULLIFY(fmrd_array_tmp(i)%TROW)
175 ENDDO
176 DEALLOCATE(fmrd_array)
177 fmrd_array=>fmrd_array_tmp
178 NULLIFY(fmrd_array_tmp)
179 ENDIF
180 fmrd_array(iwhandler) = maprow_struc
181 RETURN
182 END SUBROUTINE mumps_fmrd_store_maprow
183 SUBROUTINE mumps_fmrd_fill_maprow(MAPROW_STRUC,
184 & INODE, ISON, NSLAVES_PERE, NFRONT_PERE,
185 & NASS_PERE, LMAP, NFS4FATHER,
186 & SLAVES_PERE, !size NSLAVES_PERE
187 & TROW, !size LMAP
188 & INFO)
189C
190C Purpose:
191C =======
192C Fill the MAPROW_STRUC into
193C
194C Arguments:
195C =========
196C
197 INTEGER, INTENT(IN) :: INODE, ISON, NSLAVES_PERE, NFRONT_PERE,
198 & NASS_PERE, LMAP, NFS4FATHER
199 INTEGER, INTENT(IN) :: SLAVES_PERE(max(1,NSLAVES_PERE))
200 INTEGER, INTENT(IN) :: TROW( LMAP)
201 TYPE (MAPROW_STRUC_T), INTENT(OUT) :: MAPROW_STRUC
202 INTEGER, INTENT(INOUT) :: INFO(2)
203C
204C Local variables:
205C ===============
206C
207 INTEGER :: IERR, I
208C
209 maprow_struc%INODE = inode
210 maprow_struc%ISON = ison
211 maprow_struc%NSLAVES_PERE = nslaves_pere
212 maprow_struc%NFRONT_PERE = nfront_pere
213 maprow_struc%NASS_PERE = nass_pere
214 maprow_struc%LMAP = lmap
215 maprow_struc%NFS4FATHER = nfs4father
216 ALLOCATE(maprow_struc%SLAVES_PERE(max(1,nslaves_pere)),
217 & maprow_struc%TROW(lmap), stat=ierr)
218 IF (ierr .GT.0) THEN
219 info(1) = -13
220 info(2) = nslaves_pere + lmap
221 RETURN
222 ENDIF
223 DO i=1, nslaves_pere
224 maprow_struc%SLAVES_PERE(i) = slaves_pere(i)
225 ENDDO
226 DO i=1, lmap
227 maprow_struc%TROW(i) = trow(i)
228 ENDDO
229 RETURN
230 END SUBROUTINE mumps_fmrd_fill_maprow
231C
232 SUBROUTINE mumps_fmrd_free_maprow_struc(IWHANDLER)
234C
235C Purpose:
236C =======
237C
238C Free internal arrays of MAPROW_STRUC.
239C Typically used after a MAPROW_STRUC has been retrieved
240C from the module and late-received message has finally
241C been processed.
242C
243C MAPROW_STRUC normally corresponds to a local variable
244C of the calling routine and will not be reused.
245C
246C Arguments:
247C =========
248C
249 INTEGER, INTENT(INOUT) :: iwhandler
250C
251C Local variables:
252C ===============
253C
254 TYPE (maprow_struc_t), POINTER :: maprow_struc
255C
256 maprow_struc => fmrd_array(iwhandler)
257 maprow_struc%INODE = -7777 ! Special value: negative means unused
258 DEALLOCATE(maprow_struc%SLAVES_PERE, maprow_struc%TROW)
259 NULLIFY (maprow_struc%SLAVES_PERE, maprow_struc%TROW)
260C Release handler IWHANDLER and store it
261C in a new free position for future reuse
262 CALL mumps_fdm_end_idx('A', 'maprow', IWHANDLER)
263 RETURN
264 END SUBROUTINE MUMPS_FMRD_FREE_MAPROW_STRUC
265C
266 SUBROUTINE MUMPS_FMRD_RETRIEVE_MAPROW(IWHANDLER, MAPROW_STRUC)
267C
268C Purpose:
269C =======
270C
271C Given an IWHANDLER, return a pointer to a MAPROW structure,
272C containing information on a previously received MAPROW message.
273C
274C Arguments:
275C =========
276C
277 INTEGER, INTENT(IN) :: IWHANDLER
278#if defined(MUMPS_F2003)
279 TYPE (MAPROW_STRUC_T), POINTER, INTENT(OUT) :: MAPROW_STRUC
280#else
281 TYPE (MAPROW_STRUC_T), POINTER :: MAPROW_STRUC
282#endif
283 MAPROW_STRUC => FMRD_ARRAY(IWHANDLER)
284 RETURN
285 END SUBROUTINE MUMPS_FMRD_RETRIEVE_MAPROW
286C
287 SUBROUTINE MUMPS_FMRD_END(INFO1)
288C
289C Purpose:
290C =======
291C Module final termination.
292C
293C Arguments:
294C =========
295C
296 INTEGER, INTENT(IN) :: INFO1
297C Local variables:
298C ===============
299 INTEGER :: I, IWHANDLER
300C
301.NOT. IF ( associated(FMRD_ARRAY)) THEN
302 WRITE(*,*) "Internal error 1 in MUMPS_FAC_FMRD_END"
303 CALL MUMPS_ABORT()
304 ENDIF
305 DO I=1, size(FMRD_ARRAY)
306.GE. IF (FMRD_ARRAY(I)%INODE 0) THEN
307C Node is not free: possible only in
308C case of fatal error (INFO1 < 0)
309.GE. IF (INFO1 0) THEN
310C Should have been freed earlier while consuming MAPLIG
311 WRITE(*,*) "Internal error 2 in MUMPS_FAC_FMRD_END",I
312 CALL MUMPS_ABORT()
313 ELSE
314C May happen in case an error has forced finishing
315C factorization before all MAPROW msgs were processed.
316C We copy the loop index I in the local variable IWHANDLER
317C because there would otherwise be a risk for the loop index
318C I to be modified by MUMPS_FMRD_FREE_MAPROW_STRUC
319 IWHANDLER=I
320 CALL MUMPS_FMRD_FREE_MAPROW_STRUC(IWHANDLER)
321 ENDIF
322 ENDIF
323 ENDDO
324 DEALLOCATE(FMRD_ARRAY)
325 RETURN
326 END SUBROUTINE MUMPS_FMRD_END
327#endif
328 END MODULE MUMPS_FAC_MAPROW_DATA_M
#define mumps_abort
Definition VE_Metis.h:25
#define max(a, b)
Definition macros.h:21
logical function, public mumps_fmrd_is_maprow_stored(iwhandler)
subroutine, public mumps_fmrd_free_maprow_struc(iwhandler)
type(maprow_struc_t), dimension(:), pointer, save fmrd_array
subroutine, public mumps_fmrd_save_maprow(iwhandler, inode, ison, nslaves_pere, nfront_pere, nass_pere, lmap, nfs4father, slaves_pere, trow, info)
subroutine mumps_fmrd_store_maprow(iwhandler, maprow_struc, info)
subroutine, public mumps_fmrd_retrieve_maprow(iwhandler, maprow_struc)
subroutine, public mumps_fmrd_init(initial_size, info)
subroutine mumps_fmrd_fill_maprow(maprow_struc, inode, ison, nslaves_pere, nfront_pere, nass_pere, lmap, nfs4father, slaves_pere, trow, info)
subroutine, public mumps_fmrd_end(info1)
subroutine, public mumps_fdm_end_idx(what, from, iwhandler)
subroutine, public mumps_fdm_start_idx(what, from, iwhandler, info)