OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
cend_driver.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_end_driver( id )
15 USE cmumps_ooc
17 USE cmumps_buf
19 IMPLICIT NONE
20 include 'mpif.h'
21 TYPE( cmumps_struc ) :: id
22 LOGICAL I_AM_SLAVE
23 INTEGER IERR
24 INTEGER MASTER
25 parameter( master = 0 )
26C Explicit needed because of pointer arguments
27 INTERFACE
28 SUBROUTINE cmumps_free_id_data_modules(id_FDM_F_ENCODING,
29 & id_BLRARRAY_ENCODING, KEEP8, K34)
30# if defined(MUMPS_F2003)
31 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
32 & id_blrarray_encoding
33 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
34 & id_fdm_f_encoding
35# else
36 CHARACTER, DIMENSION(:), POINTER :: id_BLRARRAY_ENCODING
37 CHARACTER, DIMENSION(:), POINTER :: id_FDM_F_ENCODING
38# endif
39 INTEGER(8), intent(inout) :: KEEP8(150)
40 INTEGER, intent(in) :: K34
41 END SUBROUTINE cmumps_free_id_data_modules
42 END INTERFACE
43 i_am_slave = ( id%MYID .ne. master .OR. id%KEEP(46) .NE. 0 )
44C ----------------------------------
45C Special stuff for implementations
46C where MPI_CANCEL does not exist or
47C is not correctly implemented.
48C At the moment, this is only
49C required for the slaves.
50C ----------------------------------
51 IF (id%KEEP(201).GT.0 .AND. i_am_slave) THEN
52 CALL cmumps_clean_ooc_data(id,ierr)
53 IF (ierr < 0) THEN
54 id%INFO(1) = -90
55 id%INFO(2) = 0
56 ENDIF
57 END IF
58 CALL mumps_propinfo(id%ICNTL(1), id%INFO(1),
59 & id%COMM, id%MYID)
60 IF (id%root%gridinit_done) THEN
61 IF ( id%KEEP(38).NE.0 .and. id%root%yes ) THEN
62 CALL blacs_gridexit( id%root%CNTXT_BLACS )
63 id%root%gridinit_done = .false.
64 END IF
65 END IF
66 IF ( id%MYID .NE. master .OR. id%KEEP(46) .ne. 0 ) THEN
67C Note that on some old platforms, COMM_NODES would have been
68C freed inside BLACS_GRIDEXIT, which may cause problems
69C in the call to MPI_COMM_FREE. (This was the case on the
70C old SP2 in Bonn.)
71 CALL mpi_comm_free( id%COMM_NODES, ierr )
72C Free communicator related to load messages.
73 CALL mpi_comm_free( id%COMM_LOAD, ierr )
74 END IF
75 CALL mumps_destroy_arch_node_comm( id%KEEP(411) )
76C -----------------------------------
77C Right-hand-side is always user data
78C We do not free it.
79C -----------------------------------
80 IF (associated(id%MEM_DIST)) THEN
81 DEALLOCATE(id%MEM_DIST)
82 NULLIFY(id%MEM_DIST)
83 ENDIF
84C
85C
86C
87C ---------------------------------
88C Allocated by CMUMPS, Used by user.
89C CMUMPS deallocates. User should
90C use them before CMUMPS_END_DRIVER or
91C copy.
92C ---------------------------------
93 IF (associated(id%MAPPING)) THEN
94 DEALLOCATE(id%MAPPING)
95 NULLIFY(id%MAPPING)
96 END IF
97 NULLIFY(id%SCHUR_CINTERFACE)
98C
99C -------------------------------------
100C Always deallocate scaling arrays
101C if they are associated, except
102C when provided by the user (on master)
103C -------------------------------------
104 IF ( id%KEEP(52) .NE. -1 .or. id%MYID .ne. master ) THEN
105 IF (associated(id%COLSCA)) THEN
106 DEALLOCATE(id%COLSCA)
107 NULLIFY(id%COLSCA)
108 ENDIF
109 IF (associated(id%ROWSCA)) THEN
110 DEALLOCATE(id%ROWSCA)
111 NULLIFY(id%ROWSCA)
112 ENDIF
113 END IF
114 IF (associated(id%PTLUST_S)) THEN
115 DEALLOCATE(id%PTLUST_S)
116 NULLIFY(id%PTLUST_S)
117 END IF
118 IF (associated(id%PTRFAC)) THEN
119 DEALLOCATE(id%PTRFAC)
120 NULLIFY(id%PTRFAC)
121 END IF
122 IF (associated(id%IS)) THEN
123 DEALLOCATE(id%IS)
124 NULLIFY(id%IS)
125 ENDIF
126 IF (associated(id%STEP)) THEN
127 DEALLOCATE(id%STEP)
128 NULLIFY(id%STEP)
129 ENDIF
130C Begin PRUN_NODES
131C Info for pruning tree
132 IF (associated(id%Step2node)) THEN
133 DEALLOCATE(id%Step2node)
134 NULLIFY(id%Step2node)
135 ENDIF
136C END PRUN_NODES
137c ---------------------
138 IF (associated(id%NE_STEPS)) THEN
139 DEALLOCATE(id%NE_STEPS)
140 NULLIFY(id%NE_STEPS)
141 ENDIF
142 IF (associated(id%ND_STEPS)) THEN
143 DEALLOCATE(id%ND_STEPS)
144 NULLIFY(id%ND_STEPS)
145 ENDIF
146 IF (associated(id%FRERE_STEPS)) THEN
147 DEALLOCATE(id%FRERE_STEPS)
148 NULLIFY(id%FRERE_STEPS)
149 ENDIF
150 IF (associated(id%DAD_STEPS)) THEN
151 DEALLOCATE(id%DAD_STEPS)
152 NULLIFY(id%DAD_STEPS)
153 ENDIF
154 IF (associated(id%SYM_PERM)) THEN
155 DEALLOCATE(id%SYM_PERM)
156 NULLIFY(id%SYM_PERM)
157 ENDIF
158 IF (associated(id%UNS_PERM)) THEN
159 DEALLOCATE(id%UNS_PERM)
160 NULLIFY(id%UNS_PERM)
161 ENDIF
162 IF (associated(id%PIVNUL_LIST)) THEN
163 DEALLOCATE(id%PIVNUL_LIST)
164 NULLIFY(id%PIVNUL_LIST)
165 ENDIF
166 IF (associated(id%FILS)) THEN
167 DEALLOCATE(id%FILS)
168 NULLIFY(id%FILS)
169 ENDIF
170 IF (associated(id%PTRAR)) THEN
171 DEALLOCATE(id%PTRAR)
172 NULLIFY(id%PTRAR)
173 ENDIF
174 IF (associated(id%FRTPTR)) THEN
175 DEALLOCATE(id%FRTPTR)
176 NULLIFY(id%FRTPTR)
177 ENDIF
178 IF (associated(id%FRTELT)) THEN
179 DEALLOCATE(id%FRTELT)
180 NULLIFY(id%FRTELT)
181 ENDIF
182 IF (associated(id%NA)) THEN
183 DEALLOCATE(id%NA)
184 NULLIFY(id%NA)
185 ENDIF
186 IF (associated(id%PROCNODE_STEPS)) THEN
187 DEALLOCATE(id%PROCNODE_STEPS)
188 NULLIFY(id%PROCNODE_STEPS)
189 ENDIF
190 IF (associated(id%RHSCOMP)) THEN
191 DEALLOCATE(id%RHSCOMP)
192 NULLIFY(id%RHSCOMP)
193 id%KEEP8(25)=0_8
194 ENDIF
195 IF (associated(id%POSINRHSCOMP_ROW)) THEN
196 DEALLOCATE(id%POSINRHSCOMP_ROW)
197 NULLIFY(id%POSINRHSCOMP_ROW)
198 ENDIF
199 IF (id%POSINRHSCOMP_COL_ALLOC) THEN
200 DEALLOCATE(id%POSINRHSCOMP_COL)
201 NULLIFY(id%POSINRHSCOMP_COL)
202 id%POSINRHSCOMP_COL_ALLOC = .false.
203 ENDIF
204C ------------------------------------------------
205C For hybrid host and element entry,
206C and DBLARR have not been allocated
207C on the master except if there was scaing.
208C ------------------------------------------------
209 IF (id%KEEP(46).eq.1 .and.
210 & id%KEEP(55).ne.0 .and.
211 & id%MYID .eq. master .and.
212 & id%KEEP(52) .eq. 0 ) THEN
213 NULLIFY(id%DBLARR)
214 ELSE
215 IF (associated(id%DBLARR)) THEN
216 DEALLOCATE(id%DBLARR)
217 NULLIFY(id%DBLARR)
218 ENDIF
219 END IF
220 IF (associated(id%INTARR)) THEN
221 DEALLOCATE(id%INTARR)
222 NULLIFY(id%INTARR)
223 ENDIF
224 IF (associated(id%root%RG2L_ROW))THEN
225 DEALLOCATE(id%root%RG2L_ROW)
226 NULLIFY(id%root%RG2L_ROW)
227 ENDIF
228 IF (associated(id%root%RG2L_COL))THEN
229 DEALLOCATE(id%root%RG2L_COL)
230 NULLIFY(id%root%RG2L_COL)
231 ENDIF
232C IPIV is used both for ScaLAPACK and RR
233C Keep it outside CMUMPS_RR_FREE_POINTERS
234 IF (associated(id%root%IPIV)) THEN
235 DEALLOCATE(id%root%IPIV)
236 NULLIFY(id%root%IPIV)
237 ENDIF
238 IF (associated(id%root%RHS_CNTR_MASTER_ROOT)) THEN
239 DEALLOCATE(id%root%RHS_CNTR_MASTER_ROOT)
240 NULLIFY(id%root%RHS_CNTR_MASTER_ROOT)
241 ENDIF
242 IF (associated(id%root%RHS_ROOT))THEN
243 DEALLOCATE(id%root%RHS_ROOT)
244 NULLIFY(id%root%RHS_ROOT)
245 ENDIF
247 IF (associated(id%ELTPROC)) THEN
248 DEALLOCATE(id%ELTPROC)
249 NULLIFY(id%ELTPROC)
250 ENDIF
251C id%CANDIDATES,id%I_AM_CAND and id%ISTEP_TO_INIV2
252C can be allocated on non-working master
253C in the case of arrowheads distribution
254 IF (associated(id%CANDIDATES)) THEN
255 DEALLOCATE(id%CANDIDATES)
256 NULLIFY(id%CANDIDATES)
257 ENDIF
258 IF (associated(id%I_AM_CAND)) THEN
259 DEALLOCATE(id%I_AM_CAND)
260 NULLIFY(id%I_AM_CAND)
261 ENDIF
262 IF (associated(id%ISTEP_TO_INIV2)) THEN
263 DEALLOCATE(id%ISTEP_TO_INIV2)
264 NULLIFY(id%ISTEP_TO_INIV2)
265 ENDIF
266C Node partitionning (only allocated on slaves)
267 IF (i_am_slave) THEN
268 IF (associated(id%TAB_POS_IN_PERE)) THEN
269 DEALLOCATE(id%TAB_POS_IN_PERE)
270 NULLIFY(id%TAB_POS_IN_PERE)
271 ENDIF
272 IF (associated(id%FUTURE_NIV2)) THEN
273 DEALLOCATE(id%FUTURE_NIV2)
274 NULLIFY(id%FUTURE_NIV2)
275 ENDIF
276 ENDIF
277 IF(associated(id%DEPTH_FIRST))THEN
278 DEALLOCATE(id%DEPTH_FIRST)
279 NULLIFY(id%DEPTH_FIRST)
280 ENDIF
281 IF(associated(id%DEPTH_FIRST_SEQ))THEN
282 DEALLOCATE(id%DEPTH_FIRST_SEQ)
283 NULLIFY(id%DEPTH_FIRST_SEQ)
284 ENDIF
285 IF(associated(id%SBTR_ID))THEN
286 DEALLOCATE(id%SBTR_ID)
287 NULLIFY(id%SBTR_ID)
288 ENDIF
289 IF(associated(id%SCHED_DEP))THEN
290 DEALLOCATE(id%SCHED_DEP)
291 NULLIFY(id%SCHED_DEP)
292 ENDIF
293 IF(associated(id%SCHED_SBTR))THEN
294 DEALLOCATE(id%SCHED_SBTR)
295 NULLIFY(id%SCHED_SBTR)
296 ENDIF
297 IF(associated(id%SCHED_GRP))THEN
298 DEALLOCATE(id%SCHED_GRP)
299 NULLIFY(id%SCHED_GRP)
300 ENDIF
301 IF(associated(id%CROIX_MANU))THEN
302 DEALLOCATE(id%CROIX_MANU)
303 NULLIFY(id%CROIX_MANU)
304 ENDIF
305 IF (associated(id%MEM_SUBTREE)) THEN
306 DEALLOCATE(id%MEM_SUBTREE)
307 NULLIFY(id%MEM_SUBTREE)
308 ENDIF
309 IF (associated(id%MY_ROOT_SBTR)) THEN
310 DEALLOCATE(id%MY_ROOT_SBTR)
311 NULLIFY(id%MY_ROOT_SBTR)
312 ENDIF
313 IF (associated(id%MY_FIRST_LEAF)) THEN
314 DEALLOCATE(id%MY_FIRST_LEAF)
315 NULLIFY(id%MY_FIRST_LEAF)
316 ENDIF
317 IF (associated(id%MY_NB_LEAF)) THEN
318 DEALLOCATE(id%MY_NB_LEAF)
319 NULLIFY(id%MY_NB_LEAF)
320 ENDIF
321 IF (associated(id%COST_TRAV)) THEN
322 DEALLOCATE(id%COST_TRAV)
323 NULLIFY(id%COST_TRAV)
324 ENDIF
325 IF (associated(id%CB_SON_SIZE)) THEN
326 DEALLOCATE(id%CB_SON_SIZE)
327 NULLIFY(id%CB_SON_SIZE)
328 ENDIF
329 IF (associated(id%SUP_PROC)) THEN
330 DEALLOCATE(id%SUP_PROC)
331 NULLIFY(id%SUP_PROC)
332 ENDIF
333c IF (id%KEEP(201).GT.0) THEN
334 IF(associated (id%OOC_INODE_SEQUENCE))THEN
335 DEALLOCATE(id%OOC_INODE_SEQUENCE)
336 NULLIFY(id%OOC_INODE_SEQUENCE)
337 ENDIF
338 IF(associated (id%OOC_TOTAL_NB_NODES))THEN
339 DEALLOCATE(id%OOC_TOTAL_NB_NODES)
340 NULLIFY(id%OOC_TOTAL_NB_NODES)
341 ENDIF
342 IF(associated (id%OOC_SIZE_OF_BLOCK))THEN
343 DEALLOCATE(id%OOC_SIZE_OF_BLOCK)
344 NULLIFY(id%OOC_SIZE_OF_BLOCK)
345 ENDIF
346 IF(associated (id%OOC_VADDR))THEN
347 DEALLOCATE(id%OOC_VADDR)
348 NULLIFY(id%OOC_VADDR)
349 ENDIF
350 IF(associated (id%OOC_NB_FILES))THEN
351 DEALLOCATE(id%OOC_NB_FILES)
352 NULLIFY(id%OOC_NB_FILES)
353 ENDIF
354c ENDIF
355! IF(id%KEEP(486).NE.0) THEN
356 IF (associated(id%LRGROUPS)) THEN
357 DEALLOCATE(id%LRGROUPS)
358 NULLIFY(id%LRGROUPS)
359 ENDIF
360! ENDIF
361 CALL cmumps_free_id_data_modules(id%FDM_F_ENCODING,
362 & id%BLRARRAY_ENCODING, id%KEEP8(1), id%KEEP(34))
363 IF (associated(id%MPITOOMP_PROCS_MAP)) THEN
364 DEALLOCATE(id%MPITOOMP_PROCS_MAP)
365 NULLIFY(id%MPITOOMP_PROCS_MAP)
366 ENDIF
367 IF (associated(id%SINGULAR_VALUES)) THEN
368 DEALLOCATE(id%SINGULAR_VALUES)
369 NULLIFY(id%SINGULAR_VALUES)
370 ENDIF
371C ----------------------------------------------
372C Deallocate S only after finishing the receives
373C (S is normally the largest memory available)
374C ----------------------------------------------
375 IF (id%KEEP8(24).EQ.0_8) THEN
376C -- deallocate only when not provided/allocated by the user
377 IF (associated(id%S)) DEALLOCATE(id%S)
378 ENDIF
379 NULLIFY(id%S)
380 IF (i_am_slave) THEN
381C ------------------------
382C Deallocate buffer for
383C contrib-blocks (facto/
384C solve). Note that this
385C will cancel all possible
386C pending requests.
387C ------------------------
388 CALL cmumps_buf_deall_cb( ierr )
389C Deallocate buffer for integers (facto/solve)
390 CALL cmumps_buf_deall_small_buf( ierr )
391 END IF
392C Mapping information used during solve
393 IF (associated(id%IPTR_WORKING)) THEN
394 DEALLOCATE(id%IPTR_WORKING)
395 NULLIFY(id%IPTR_WORKING)
396 END IF
397 IF (associated(id%WORKING)) THEN
398 DEALLOCATE(id%WORKING)
399 NULLIFY(id%WORKING)
400 END IF
401 IF (associated(id%IPOOL_B_L0_OMP)) THEN
402 DEALLOCATE(id%IPOOL_B_L0_OMP)
403 NULLIFY(id%IPOOL_B_L0_OMP)
404 END IF
405 IF (associated(id%IPOOL_A_L0_OMP)) THEN
406 DEALLOCATE(id%IPOOL_A_L0_OMP)
407 NULLIFY(id%IPOOL_A_L0_OMP)
408 END IF
409 IF (associated(id%PHYS_L0_OMP)) THEN
410 DEALLOCATE(id%PHYS_L0_OMP)
411 NULLIFY(id%PHYS_L0_OMP)
412 END IF
413 IF (associated(id%VIRT_L0_OMP)) THEN
414 DEALLOCATE(id%VIRT_L0_OMP)
415 NULLIFY(id%VIRT_L0_OMP)
416 END IF
417 IF (associated(id%VIRT_L0_OMP_MAPPING)) THEN
418 DEALLOCATE(id%VIRT_L0_OMP_MAPPING)
419 NULLIFY(id%VIRT_L0_OMP_MAPPING)
420 END IF
421 IF (associated(id%PERM_L0_OMP)) THEN
422 DEALLOCATE(id%PERM_L0_OMP)
423 NULLIFY(id%PERM_L0_OMP)
424 END IF
425 IF (associated(id%PTR_LEAFS_L0_OMP)) THEN
426 DEALLOCATE(id%PTR_LEAFS_L0_OMP)
427 NULLIFY(id%PTR_LEAFS_L0_OMP)
428 END IF
429 IF (associated(id%L0_OMP_MAPPING)) THEN
430 DEALLOCATE(id%L0_OMP_MAPPING)
431 NULLIFY(id%L0_OMP_MAPPING)
432 END IF
433 IF (associated(id%I4_L0_OMP)) THEN
434 DEALLOCATE(id%I4_L0_OMP)
435 NULLIFY(id%I4_L0_OMP)
436 END IF
437 IF (associated(id%I8_L0_OMP)) THEN
438 DEALLOCATE(id%I8_L0_OMP)
439 NULLIFY(id%I8_L0_OMP)
440 END IF
441 IF (associated(id%L0_OMP_FACTORS)) THEN
442 CALL cmumps_free_l0_omp_factors(id%L0_OMP_FACTORS)
443 END IF
444 RETURN
445 END SUBROUTINE cmumps_end_driver
446 SUBROUTINE cmumps_free_id_data_modules(id_FDM_F_ENCODING,
447 & id_BLRARRAY_ENCODING, KEEP8, K34)
452 IMPLICIT NONE
453C
454C Purpose:
455C =======
456C
457C Free data from modules kept from one phase to the other
458C and referenced through the main MUMPS structure, id.
459C
460C Both id%FDM_F_ENCODING and id%BLRARRAY_ENCODING
461C are concerned.
462C
463C
464C
465C Arguments:
466C =========
467C
468# if defined(MUMPS_F2003)
469 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
470 & id_BLRARRAY_ENCODING
471 CHARACTER, DIMENSION(:), POINTER, intent(inout) ::
472 & id_FDM_F_ENCODING
473# else
474 CHARACTER, DIMENSION(:), POINTER :: id_BLRARRAY_ENCODING
475 CHARACTER, DIMENSION(:), POINTER :: id_FDM_F_ENCODING
476# endif
477 INTEGER(8), intent(inout) :: KEEP8(150)
478 INTEGER, intent(in) :: K34
479C
480 IF (associated(id_fdm_f_encoding)) THEN
481C Allow access to FDM_F data for BLR_END_MODULE
482 CALL mumps_fdm_struc_to_mod('F', id_fdm_f_encoding)
483 IF (associated(id_blrarray_encoding)) THEN
484C Pass id_BLRARRAY_ENCODING control to module
485C and terminate BLR module of current instance
486 CALL cmumps_blr_struc_to_mod(id_blrarray_encoding)
487 CALL cmumps_blr_end_module(0, keep8, k34,
488 & lrsolve_act_opt=.true.)
489 ENDIF
490C ---------------------------------------
491C FDM data structures are still allocated
492C in the module and should be freed
493C ---------------------------------------
494 CALL mumps_fdm_end('F')
495 ENDIF
496 RETURN
497 END SUBROUTINE cmumps_free_id_data_modules
subroutine mumps_propinfo(icntl, info, comm, id)
subroutine cmumps_free_id_data_modules(id_fdm_f_encoding, id_blrarray_encoding, keep8, k34)
subroutine cmumps_end_driver(id)
Definition cend_driver.F:15
subroutine cmumps_rr_free_pointers(id)
subroutine mpi_comm_free(comm, ierr)
Definition mpi.f:238
subroutine blacs_gridexit(cntxt)
Definition mpi.f:762
subroutine, public cmumps_buf_deall_small_buf(ierr)
subroutine, public cmumps_buf_deall_cb(ierr)
subroutine, public cmumps_free_l0_omp_factors(id_l0_omp_factors)
subroutine, public cmumps_blr_end_module(info1, keep8, k34, lrsolve_act_opt)
subroutine, public cmumps_blr_struc_to_mod(id_blrarray_encoding)
subroutine cmumps_clean_ooc_data(id, ierr)
Definition cmumps_ooc.F:568
subroutine, public mumps_fdm_struc_to_mod(what, id_fdm_encoding)
subroutine, public mumps_fdm_end(what)
subroutine mumps_destroy_arch_node_comm(arch_node_comm)