OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
estim_flops.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 mumps_estim_flops( INODE, N, PROCNODE_STEPS,
15 & KEEP199,
16 & ND, FILS, FRERE_STEPS, STEP, PIMASTER,
17 & KEEP28, KEEP50, KEEP253,
18 & FLOP1,
19 & IW, LIW, XSIZE )
20 IMPLICIT NONE
21 INTEGER INODE, N, KEEP50, LIW, KEEP199, KEEP28, KEEP253
22 INTEGER PROCNODE_STEPS(KEEP28), ND(KEEP28),
23 & FILS(N), FRERE_STEPS(KEEP28),
24 & STEP(N),
25 & pimaster(keep28),
26 & iw( liw )
27 INTEGER XSIZE
28 DOUBLE PRECISION FLOP1
29 INTEGER NUMORG, IN, NASS, IFSON, NUMSTK, NFRONT, NPIV, NCB,
30 & LEVEL, ISON
31 LOGICAL MUMPS_IN_OR_ROOT_SSARBR
32 INTEGER MUMPS_TYPENODE
33 EXTERNAL mumps_in_or_root_ssarbr, mumps_typenode
34 include 'mumps_headers.h'
35 flop1 = 0.0d0
36 IF (mumps_in_or_root_ssarbr(procnode_steps(step(inode)),
37 & keep199) ) RETURN
38 in = inode
39 numorg = 0
40 10 numorg = numorg + 1
41 in = fils(in)
42 IF (in .GT. 0) GOTO 10
43 numstk = 0
44 nass = 0
45 ifson = -in
46 ison = ifson
47 IF (ison .EQ. 0) GOTO 30
48 20 numstk = numstk + 1
49 nass = nass + iw(pimaster(step(ison)) + 1 +xsize)
50 ison = frere_steps(step(ison))
51 IF (ison .GT. 0) GOTO 20
52 30 nfront = nd(step(inode)) + nass + keep253
53 npiv = nass + numorg
54 ncb = nfront - npiv
55 level = mumps_typenode(procnode_steps(step(inode)),keep199)
56 CALL mumps_get_flops_cost(nfront,npiv,npiv,keep50,level,flop1)
57 RETURN
58 END SUBROUTINE mumps_estim_flops
59 SUBROUTINE mumps_update_flops_root(OPELIW, KEEP50, NFRONT, NPIV,
60 & NPROW, NPCOL, MYID)
61 DOUBLE PRECISION, intent(inout) :: OPELIW
62 INTEGER, intent(in) :: KEEP50, NFRONT, NPIV,
63 & nprow, npcol, myid
64 DOUBLE PRECISION :: COST, COST_PER_PROC
65 INTEGER, PARAMETER :: LEVEL3 = 3
66 call mumps_get_flops_cost(nfront, npiv, nfront, keep50, level3,
67 & cost)
68 cost_per_proc = dble(int( cost,8) / int(nprow * npcol,8))
69 opeliw = opeliw + cost_per_proc
70 RETURN
71 END SUBROUTINE mumps_update_flops_root
72 SUBROUTINE mumps_get_flops_cost(NFRONT,NPIV,NASS,
73 & KEEP50,LEVEL,COST)
74 IMPLICIT NONE
75 INTEGER, intent(in) :: NFRONT,NPIV,KEEP50,LEVEL, NASS
76 DOUBLE PRECISION, intent(out) :: COST
77 IF (keep50.EQ.0) THEN
78 IF (level.EQ.1 .OR. level.EQ.3) THEN
79 cost = dble(2) * dble(nfront) * dble(npiv) *
80 & dble(nfront - npiv - 1) +
81 & dble(npiv) * dble(npiv + 1) * dble(2 * npiv + 1)
82 & / dble(3)
83 cost = cost + dble(2 * nfront - npiv - 1)
84 & * dble(npiv) /dble(2)
85 ELSEIF (level.EQ.2) THEN
86 cost = dble(2*nass)*dble(nfront) -
87 & dble(nass+nfront)*dble(npiv+1)
88 cost = dble(npiv)*cost +
89 & dble(2 * nass - npiv - 1) * dble(npiv) / dble(2) +
90 & dble(npiv) * dble(npiv + 1) *
91 & dble(2 * npiv + 1) /dble(3)
92 ENDIF
93 ELSE
94 IF (level.EQ.1 .OR. (level.EQ.3 .AND. keep50.EQ.1)) THEN
95 cost = dble(npiv) * (
96 & dble( nfront ) * dble( nfront ) +
97 & dble( nfront ) - (
98 & dble( nfront)*dble(npiv) + dble(npiv+1)
99 & )) +( dble(npiv)*dble(npiv+1)
100 & *dble(2*npiv+1))/ dble(6)
101 ELSE IF (level.EQ.3.AND.keep50.EQ.2) THEN
102 cost = dble(2) * dble(nfront) * dble(npiv) *
103 & dble(nfront - npiv - 1) +
104 & dble(npiv) * dble(npiv + 1) *
105 & dble(2 * npiv + 1) / dble(3)
106 cost = cost + dble(2 * nfront - npiv - 1)
107 & * dble(npiv) / dble(2)
108 ELSE
109 cost = dble(npiv) * (
110 & dble( nass ) * dble( nass ) + dble( nass )
111 & - ( dble( nass) * dble(npiv) + dble( npiv + 1 ) ) )
112 & + ( dble(npiv)*dble(npiv+1)*dble(2*npiv+1) )
113 & / dble( 6 )
114 ENDIF
115 ENDIF
116 RETURN
117 END SUBROUTINE mumps_get_flops_cost
118 SUBROUTINE mumps_print_still_active(MYID, KEEP, DKEEP17, OPELIW,
119 & OPLAST_PRINTED, MPA)
120 IMPLICIT NONE
121 INTEGER, intent(in) :: KEEP (500), MYID, MPA
122 DOUBLE PRECISION :: DKEEP17
123 DOUBLE PRECISION, intent(in) :: OPELIW
124 DOUBLE PRECISION, intent(inout) :: OPLAST_PRINTED
125 IF (mpa.GT.0) THEN
126 IF ( (opeliw-oplast_printed).GT. dkeep17) THEN
127 WRITE(mpa,'(A,I6,A,A,1PD10.3)')
128 & ' ... MPI process', myid,
129 & ': theoretical number of flops locally performed',
130 & ' so far = ',
131 & opeliw
132 oplast_printed = opeliw
133 ENDIF
134 ENDIF
135 RETURN
136 END SUBROUTINE mumps_print_still_active
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
Definition estim_flops.F:74
subroutine mumps_print_still_active(myid, keep, dkeep17, opeliw, oplast_printed, mpa)
subroutine mumps_estim_flops(inode, n, procnode_steps, keep199, nd, fils, frere_steps, step, pimaster, keep28, keep50, keep253, flop1, iw, liw, xsize)
Definition estim_flops.F:20
subroutine mumps_update_flops_root(opeliw, keep50, nfront, npiv, nprow, npcol, myid)
Definition estim_flops.F:61