24
24
C User documentation of any code that uses this software can
25
25
C include this complete notice. You can acknowledge (using
26
C references [1], [2], and [3]) the contribution of this package
26
C references [1] and [2]) the contribution of this package
27
27
C in any scientific publication dependent upon the use of the
28
28
C package. You shall use reasonable endeavours to notify
29
29
C the authors of the package of this publication.
31
C [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent,
32
C Multifrontal parallel distributed symmetric and unsymmetric solvers,
33
C in Comput. Methods in Appl. Mech. Eng., 184, 501-520 (2000).
35
C [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent,
31
C [1] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent,
36
32
C A fully asynchronous multifrontal solver using distributed dynamic
37
33
C scheduling, SIAM Journal of Matrix Analysis and Applications,
38
34
C Vol 23, No 1, pp 15-41 (2001).
40
C [3] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and
36
C [2] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and
41
37
C S. Pralet, Hybrid scheduling for the parallel solution of linear
42
38
C systems. Parallel Computing Vol 32 (2), pp 136-156 (2006).
44
40
SUBROUTINE SMUMPS_246(MYID, N, STEP, FRERE, FILS,
45
* NA, LNA, NE, DAD, ND, PROCNODE, SLAVEF,
46
* NRLADU, NIRADU, NIRNEC, NRLNEC,
48
* NIRADU_OOC, NIRNEC_OOC,
50
* KEEP,KEEP8, LOCAL_M, LOCAL_N, SBUF_RECOLD,
51
* SBUF_SEND, SBUF_REC, OPS_SUBTREE, NSTEPS,
52
* I_AM_CAND,NMB_PAR2, ISTEP_TO_INIV2, CANDIDATES,
54
* ,MAX_FRONT_SURFACE_LOCAL
55
* ,MAX_SIZE_FACTOR, ENTRIES_IN_FACTORS_LOC,
56
* ENTRIES_IN_FACTORS_TOT
41
& NA, LNA, NE, DAD, ND, PROCNODE, SLAVEF,
42
& NRLADU, NIRADU, NIRNEC, NRLNEC,
44
& NIRADU_OOC, NIRNEC_OOC,
46
& KEEP,KEEP8, LOCAL_M, LOCAL_N, SBUF_RECOLD,
47
& SBUF_SEND, SBUF_REC, OPS_SUBTREE, NSTEPS,
48
& I_AM_CAND,NMB_PAR2, ISTEP_TO_INIV2, CANDIDATES,
50
& ,MAX_FRONT_SURFACE_LOCAL
51
& ,MAX_SIZE_FACTOR, ENTRIES_IN_FACTORS_LOC,
52
& ENTRIES_IN_FACTORS_TOT
59
55
INTEGER MYID, N, LNA, IFLAG, IERROR
60
56
INTEGER NIRADU, NIRNEC
855
856
DEALLOCATE( LSTKR, TNSTK, IPOOL,
857
858
OPS_SUBTREE = real(OPS_SBTR_LOC)
858
859
OPSA = real(OPSA_LOC)
859
860
KEEP(66) = int(OPSA_LOC/1000000.d0)
861
862
END SUBROUTINE SMUMPS_246
862
863
RECURSIVE SUBROUTINE
863
* SMUMPS_271( COMM_LOAD, ASS_IRECV,
864
* INODE, NELIM_ROOT, root,
866
* BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
867
* IWPOS, IWPOSCB, IPTRLU,
868
* LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
870
* PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
871
* IFLAG, IERROR, COMM,
873
* IPOOL, LPOOL, LEAF,
874
* NBFIN, MYID, SLAVEF,
876
* OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
877
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
878
* LPTRAR, NELT, FRTPTR, FRTELT,
879
* ISTEP_TO_INIV2, TAB_POS_IN_PERE )
864
& SMUMPS_271( COMM_LOAD, ASS_IRECV,
865
& INODE, NELIM_ROOT, root,
867
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
868
& IWPOS, IWPOSCB, IPTRLU,
869
& LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
871
& PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
872
& IFLAG, IERROR, COMM,
874
& IPOOL, LPOOL, LEAF,
875
& NBFIN, MYID, SLAVEF,
877
& OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
878
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
879
& LPTRAR, NELT, FRTPTR, FRTELT,
880
& ISTEP_TO_INIV2, TAB_POS_IN_PERE )
881
882
INCLUDE 'smumps_root.h'
912
914
INTEGER INTARR(max(1,KEEP(14)))
913
915
REAL DBLARR(max(1,KEEP(13)))
914
916
INTEGER ISTEP_TO_INIV2(KEEP(71)),
915
* TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
917
& TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
916
918
INCLUDE 'mumps_tags.h'
917
INTEGER I, J, OPSFAC, APOS, LCONT, NCOL_TO_SEND, LDA
919
INTEGER I, J, LCONT, NCOL_TO_SEND, LDA
920
INTEGER(8) :: OPSFAC, APOS, SHIFT_VAL_SON, POSELT
918
921
INTEGER FPERE, IOLDPS, NFRONT, NPIV, NASS, NSLAVES,
919
* H_INODE, NELIM, NBCOL, LIST_NELIM_ROW,
920
* LIST_NELIM_COL, NELIM_LOCAL, TYPE_SON,
921
* POSELT, NROW, NCOL, NBROW, SHIFT_LIST_ROW_SON,
922
* SHIFT_LIST_COL_SON, SHIFT_VAL_SON,LDAFS, IERR,
923
* STATUS( MPI_STATUS_SIZE ), ISON, PDEST_MASTER_ISON
922
& H_INODE, NELIM, NBCOL, LIST_NELIM_ROW,
923
& LIST_NELIM_COL, NELIM_LOCAL, TYPE_SON,
924
& NROW, NCOL, NBROW, SHIFT_LIST_ROW_SON,
925
& SHIFT_LIST_COL_SON, LDAFS, IERR,
926
& STATUS( MPI_STATUS_SIZE ), ISON, PDEST_MASTER_ISON
924
927
LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
925
928
INTEGER MSGSOU, MSGTAG
926
929
LOGICAL INVERT, FLAG
973
SHIFT_VAL_SON = NPIV * LDAFS + NPIV
976
SHIFT_VAL_SON = int(NPIV,8) * int(LDAFS,8) + int(NPIV,8)
974
977
CALL SMUMPS_80( COMM_LOAD,
977
* PTLUST_S(1), PTRAST(1),
978
* root, NROW, NCOL, SHIFT_LIST_ROW_SON,
979
* SHIFT_LIST_COL_SON , SHIFT_VAL_SON, LDAFS,
980
* ROOT_NON_ELIM_CB, MYID, COMM,
981
* BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
982
* IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
983
* PTRIST, PTLUST_S(1), PTRFAC(1), PTRAST(1),
984
* STEP, PIMASTER, PAMASTER,
985
* NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
986
* IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
987
* OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
988
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, .FALSE., ND, FRERE,
989
* LPTRAR, NELT, FRTPTR, FRTELT,
990
* ISTEP_TO_INIV2, TAB_POS_IN_PERE )
980
& PTLUST_S(1), PTRAST(1),
981
& root, NROW, NCOL, SHIFT_LIST_ROW_SON,
982
& SHIFT_LIST_COL_SON , SHIFT_VAL_SON, LDAFS,
983
& ROOT_NON_ELIM_CB, MYID, COMM,
984
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
985
& IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
986
& PTRIST, PTLUST_S(1), PTRFAC(1), PTRAST(1),
987
& STEP, PIMASTER, PAMASTER,
988
& NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
989
& IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
990
& OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
991
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, .FALSE., ND, FRERE,
992
& LPTRAR, NELT, FRTPTR, FRTELT,
993
& ISTEP_TO_INIV2, TAB_POS_IN_PERE )
991
994
IF (IFLAG.LT.0 ) RETURN
992
995
IF (TYPE_SON.EQ.1) THEN
993
996
NROW = NFRONT - NASS
995
998
SHIFT_LIST_ROW_SON = H_INODE + NASS
996
999
SHIFT_LIST_COL_SON = H_INODE + NFRONT + NPIV
997
SHIFT_VAL_SON = NASS * NFRONT + NPIV
1000
SHIFT_VAL_SON = int(NASS,8) * int(NFRONT,8) + int(NPIV,8)
998
1001
IF ( KEEP( 50 ) .eq. 0 ) THEN
999
1002
INVERT = .FALSE.
1001
1004
INVERT = .TRUE.
1003
1006
CALL SMUMPS_80( COMM_LOAD, ASS_IRECV,
1006
* root, NROW, NCOL, SHIFT_LIST_ROW_SON,
1007
* SHIFT_LIST_COL_SON , SHIFT_VAL_SON, NFRONT,
1008
* ROOT_NON_ELIM_CB, MYID, COMM,
1010
* BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1011
* IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
1012
* PTRIST, PTLUST_S, PTRFAC,
1013
* PTRAST, STEP, PIMASTER, PAMASTER,
1014
* NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
1015
* IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
1016
* OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1017
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, INVERT, ND, FRERE,
1018
* LPTRAR, NELT, FRTPTR, FRTELT,
1019
* ISTEP_TO_INIV2, TAB_POS_IN_PERE )
1009
& root, NROW, NCOL, SHIFT_LIST_ROW_SON,
1010
& SHIFT_LIST_COL_SON , SHIFT_VAL_SON, NFRONT,
1011
& ROOT_NON_ELIM_CB, MYID, COMM,
1013
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1014
& IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
1015
& PTRIST, PTLUST_S, PTRFAC,
1016
& PTRAST, STEP, PIMASTER, PAMASTER,
1017
& NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
1018
& IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
1019
& OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1020
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, INVERT, ND, FRERE,
1021
& LPTRAR, NELT, FRTPTR, FRTELT,
1022
& ISTEP_TO_INIV2, TAB_POS_IN_PERE )
1020
1023
IF (IFLAG.LT.0 ) RETURN
1022
1025
IOLDPS = PTLUST_S(STEP(INODE))
1056
1059
PDEST_MASTER_ISON = MUMPS_275(STEP(ISON),
1057
* PROCNODE_STEPS,SLAVEF)
1060
& PROCNODE_STEPS,SLAVEF)
1061
DO WHILE ( PTRIST(STEP(ISON)) .EQ. 0)
1064
MESSAGE_RECEIVED = .FALSE.
1065
CALL SMUMPS_329( COMM_LOAD, ASS_IRECV,
1066
& BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
1067
& PDEST_MASTER_ISON, MAITRE_DESC_BANDE,
1069
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1070
& IWPOS, IWPOSCB, IPTRLU,
1071
& LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
1073
& PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
1074
& IFLAG, IERROR, COMM,
1076
& IPOOL, LPOOL, LEAF,
1077
& NBFIN, MYID, SLAVEF,
1079
& root, OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1080
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE, LPTRAR,
1081
& NELT, FRTPTR, FRTELT,
1082
& ISTEP_TO_INIV2, TAB_POS_IN_PERE, .TRUE. )
1083
IF ( IFLAG .LT. 0 ) RETURN
1059
* ( IW( PTRIST(STEP(ISON)) + 1 +KEEP(IXSZ)) .NE.
1060
* IW( PTRIST(STEP(ISON)) + 3 +KEEP(IXSZ)) ) .OR.
1061
* ( KEEP(50) .NE. 0 .AND.
1062
* IW( PTRIST(STEP(ISON)) + 6 +KEEP(IXSZ)) .NE. 0 ) )
1086
& ( IW( PTRIST(STEP(ISON)) + 1 +KEEP(IXSZ)) .NE.
1087
& IW( PTRIST(STEP(ISON)) + 3 +KEEP(IXSZ)) ) .OR.
1088
& ( KEEP(50) .NE. 0 .AND.
1089
& IW( PTRIST(STEP(ISON)) + 6 +KEEP(IXSZ)) .NE. 0 ) )
1063
1090
IF ( KEEP(50).eq.0) THEN
1064
1091
MSGSOU = PDEST_MASTER_ISON
1065
1092
MSGTAG = BLOC_FACTO
1067
1094
IF ( IW( PTRIST(STEP(ISON)) + 1 +KEEP(IXSZ)) .NE.
1068
* IW( PTRIST(STEP(ISON)) + 3 +KEEP(IXSZ)) ) THEN
1095
& IW( PTRIST(STEP(ISON)) + 3 +KEEP(IXSZ)) ) THEN
1069
1096
MSGSOU = PDEST_MASTER_ISON
1070
1097
MSGTAG = BLOC_FACTO_SYM
1077
1104
SET_IRECV = .FALSE.
1078
1105
MESSAGE_RECEIVED = .FALSE.
1079
1106
CALL SMUMPS_329( COMM_LOAD, ASS_IRECV,
1080
* BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
1083
* BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1084
* IWPOS, IWPOSCB, IPTRLU,
1085
* LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
1087
* PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
1088
* IFLAG, IERROR, COMM,
1090
* IPOOL, LPOOL, LEAF,
1091
* NBFIN, MYID, SLAVEF,
1093
* root, OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1094
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE, LPTRAR,
1095
* NELT, FRTPTR, FRTELT,
1096
* ISTEP_TO_INIV2, TAB_POS_IN_PERE, .TRUE. )
1107
& BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
1110
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1111
& IWPOS, IWPOSCB, IPTRLU,
1112
& LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
1114
& PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
1115
& IFLAG, IERROR, COMM,
1117
& IPOOL, LPOOL, LEAF,
1118
& NBFIN, MYID, SLAVEF,
1120
& root, OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1121
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE, LPTRAR,
1122
& NELT, FRTPTR, FRTELT,
1123
& ISTEP_TO_INIV2, TAB_POS_IN_PERE, .TRUE. )
1097
1124
IF ( IFLAG .LT. 0 ) RETURN
1099
1126
IOLDPS = PTRIST(STEP(INODE))
1142
1169
INVERT = .TRUE.
1144
1171
CALL SMUMPS_80( COMM_LOAD, ASS_IRECV,
1147
* root, NROW, NCOL_TO_SEND, SHIFT_LIST_ROW_SON,
1148
* SHIFT_LIST_COL_SON , SHIFT_VAL_SON, LDA,
1149
* ROOT_NON_ELIM_CB, MYID, COMM,
1151
* BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1152
* IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
1153
* PTRIST, PTLUST_S, PTRFAC,
1154
* PTRAST, STEP, PIMASTER, PAMASTER,
1155
* NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
1156
* IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
1157
* OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1158
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, INVERT, ND, FRERE,
1159
* LPTRAR, NELT, FRTPTR, FRTELT,
1160
* ISTEP_TO_INIV2, TAB_POS_IN_PERE )
1174
& root, NROW, NCOL_TO_SEND, SHIFT_LIST_ROW_SON,
1175
& SHIFT_LIST_COL_SON , SHIFT_VAL_SON, LDA,
1176
& ROOT_NON_ELIM_CB, MYID, COMM,
1178
& BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
1179
& IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, IW, LIW, A, LA,
1180
& PTRIST, PTLUST_S, PTRFAC,
1181
& PTRAST, STEP, PIMASTER, PAMASTER,
1182
& NSTK_S, COMP, IFLAG, IERROR, NBPROCFILS,
1183
& IPOOL, LPOOL, LEAF, NBFIN, SLAVEF,
1184
& OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
1185
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, INVERT, ND, FRERE,
1186
& LPTRAR, NELT, FRTPTR, FRTELT,
1187
& ISTEP_TO_INIV2, TAB_POS_IN_PERE )
1161
1188
IF (IFLAG.LT.0 ) RETURN
1162
1189
IF (KEEP(214).EQ.2) THEN
1163
1190
CALL SMUMPS_314( N, INODE,
1164
* PTRIST, PTRAST, PTLUST_S, PTRFAC, IW, LIW, A, LA,
1165
* LRLU, LRLUS, IWPOS, IWPOSCB, POSFAC, COMP,
1166
* IPTRLU, OPELIW, STEP, PIMASTER, PAMASTER, ITLOC,
1167
* IFLAG, IERROR, SLAVEF, MYID, COMM, KEEP,KEEP8, TYPE_SON
1191
& PTRIST, PTRAST, PTLUST_S, PTRFAC, IW, LIW, A, LA,
1192
& LRLU, LRLUS, IWPOS, IWPOSCB, POSFAC, COMP,
1193
& IPTRLU, OPELIW, STEP, PIMASTER, PAMASTER, ITLOC,
1194
& IFLAG, IERROR, SLAVEF, MYID, COMM, KEEP,KEEP8, TYPE_SON
1170
1197
IF (IFLAG.LT.0) THEN
1171
1198
CALL SMUMPS_44( MYID, SLAVEF, COMM )
1175
1202
END SUBROUTINE SMUMPS_271
1176
1203
SUBROUTINE SMUMPS_221(NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1177
* INOPV,NOFFW,IFLAG,IOLDPS,POSELT,UU, SEUIL,KEEP,KEEP8,
1178
* DKEEP,PIVNUL_LIST,LPN_LIST,
1180
* PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1181
* PP_LastPIVRPTRFilled_L,
1182
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1183
* PP_LastPIVRPTRFilled_U)
1204
& INOPV,NOFFW,IFLAG,IOLDPS,POSELT,UU, SEUIL,KEEP,KEEP8,
1205
& DKEEP,PIVNUL_LIST,LPN_LIST,
1207
& PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1208
& PP_LastPIVRPTRFilled_L,
1209
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1210
& PP_LastPIVRPTRFilled_U)
1185
INTEGER NFRONT,NASS,N,LA,LIW,INODE,IFLAG,INOPV,NOFFW
1212
INTEGER NFRONT,NASS,N,LIW,INODE,IFLAG,INOPV,NOFFW
1189
INTEGER IOLDPS, POSELT
1217
INTEGER(8) :: POSELT
1190
1219
INTEGER KEEP(500)
1191
1220
INTEGER*8 KEEP8(150)
1192
1221
INTEGER LPN_LIST
1193
1222
INTEGER PIVNUL_LIST(LPN_LIST)
1195
1224
INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1196
* PP_LastPIVRPTRFilled_L,
1197
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1198
* PP_LastPIVRPTRFilled_U
1225
& PP_LastPIVRPTRFilled_L,
1226
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1227
& PP_LastPIVRPTRFilled_U
1199
1228
INCLUDE 'mumps_headers.h'
1231
INTEGER(8) :: APOS, IDIAG
1232
INTEGER(8) :: J1, J2, J3, JJ
1233
INTEGER(8) :: NFRONT8
1203
1235
REAL ZERO,RMAX,ONE
1204
1236
INTEGER NPIV,NASSW,IPIV
1205
INTEGER NPIVP1,JMAX,J1,J3,JJ,J2,IDIAG,ISW,ISWPS1
1237
INTEGER NPIVP1,JMAX,J,ISW,ISWPS1
1206
1238
INTEGER ISWPS2,KSW
1207
1239
INTEGER SMUMPS_IXAMAX
1214
1246
XSIZE = KEEP(IXSZ)
1215
1247
NPIV = IW(IOLDPS+1+XSIZE)
1216
1248
NPIVP1 = NPIV + 1
1249
NFRONT8 = int(NFRONT,8)
1217
1250
IF (KEEP(201).EQ.1) THEN
1218
1251
CALL SMUMPS_667(TYPEF_L, NBPANELS_L,
1219
* I_PIVRPTR_L, I_PIVR_L,
1220
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1252
& I_PIVRPTR_L, I_PIVR_L,
1253
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1222
1255
CALL SMUMPS_667(TYPEF_U, NBPANELS_U,
1223
* I_PIVRPTR_U, I_PIVR_U,
1224
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1256
& I_PIVRPTR_U, I_PIVR_U,
1257
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1227
1260
NASSW = iabs(IW(IOLDPS+3+XSIZE))
1228
1261
IF(INOPV .EQ. -1) THEN
1229
APOS = POSELT + NFRONT*(NPIVP1-1) + NPIV
1262
APOS = POSELT + NFRONT8*int(NPIVP1-1,8) + int(NPIV,8)
1231
1264
IF(abs(A(APOS)).LT.SEUIL) THEN
1232
1265
IF(real(A(APOS)) .GE. ZERO) THEN
1266
A(APOS) = real(SEUIL)
1268
A(APOS) = real(-SEUIL)
1237
1270
KEEP(98) = KEEP(98)+1
1239
1272
IF (KEEP(201).EQ.1) THEN
1240
1273
CALL SMUMPS_680( IW(I_PIVRPTR_L),
1242
* IW(I_PIVR_L), NASS, NPIVP1, NPIVP1,
1243
* PP_LastPanelonDisk_L,
1244
* PP_LastPIVRPTRFilled_L)
1275
& IW(I_PIVR_L), NASS, NPIVP1, NPIVP1,
1276
& PP_LastPanelonDisk_L,
1277
& PP_LastPIVRPTRFilled_L)
1245
1278
CALL SMUMPS_680( IW(I_PIVRPTR_U),
1247
* IW(I_PIVR_U), NASS, NPIVP1, NPIVP1,
1248
* PP_LastPanelonDisk_U,
1249
* PP_LastPIVRPTRFilled_U)
1280
& IW(I_PIVR_U), NASS, NPIVP1, NPIVP1,
1281
& PP_LastPanelonDisk_U,
1282
& PP_LastPIVRPTRFilled_U)
1254
1287
DO 460 IPIV=NPIVP1,NASSW
1255
APOS = POSELT + NFRONT*(IPIV-1) + NPIV
1288
APOS = POSELT + NFRONT8*int(IPIV-1,8) + int(NPIV,8)
1257
1290
IF (UU.GT.ZERO) GO TO 340
1258
1291
IF (abs(A(APOS)).EQ.ZERO) GO TO 630
1260
1293
340 AMROW = ZERO
1262
J2 = APOS - NPIV + NASS - 1
1264
JMAX = SMUMPS_IXAMAX(J3,A(J1),1)
1295
J2 = APOS + int(- NPIV + NASS - 1,8)
1297
JMAX = SMUMPS_IXAMAX(J,A(J1),1)
1298
JJ = J1 + int(JMAX - 1,8)
1266
1299
AMROW = abs(A(JJ))
1269
J2 = APOS - NPIV + NFRONT - 1
1302
J2 = APOS +int(- NPIV + NFRONT - 1,8)
1270
1303
IF (J2.LT.J1) GO TO 370
1271
1304
DO 360 JJ=J1,J2
1272
1305
RMAX = max(abs(A(JJ)),RMAX)
1274
370 IDIAG = APOS + IPIV - NPIVP1
1307
370 IDIAG = APOS + int(IPIV - NPIVP1,8)
1275
1308
IF (RMAX.LE.DKEEP(1)) THEN
1276
1309
KEEP(109) = KEEP(109)+1
1277
1310
ISW = IOLDPS+IW(IOLDPS+1+XSIZE)+6+XSIZE+
1346
1379
IF (KEEP(201).EQ.1) THEN
1347
1380
CALL SMUMPS_680( IW(I_PIVRPTR_L),
1349
* IW(I_PIVR_L), NASS, NPIVP1, IPIV,
1350
* PP_LastPanelonDisk_L,
1351
* PP_LastPIVRPTRFilled_L)
1382
& IW(I_PIVR_L), NASS, NPIVP1, IPIV,
1383
& PP_LastPanelonDisk_L,
1384
& PP_LastPIVRPTRFilled_L)
1352
1385
CALL SMUMPS_680( IW(I_PIVRPTR_U),
1354
* IW(I_PIVR_U), NASS, NPIVP1, NPIV+JMAX,
1355
* PP_LastPanelonDisk_U,
1356
* PP_LastPIVRPTRFilled_U)
1387
& IW(I_PIVR_U), NASS, NPIVP1, NPIV+JMAX,
1388
& PP_LastPanelonDisk_U,
1389
& PP_LastPIVRPTRFilled_U)
1360
1393
END SUBROUTINE SMUMPS_221
1361
1394
SUBROUTINE SMUMPS_220(NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1362
* INOPV,NOFFW,IOLDPS,POSELT,UU,SEUIL,KEEP,
1363
* PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1364
* PP_LastPIVRPTRFilled_L,
1365
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1366
* PP_LastPIVRPTRFilled_U)
1395
& INOPV,NOFFW,IOLDPS,POSELT,UU,SEUIL,KEEP,
1396
& PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1397
& PP_LastPIVRPTRFilled_L,
1398
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1399
& PP_LastPIVRPTRFilled_U)
1368
INTEGER NFRONT,NASS,N,LIW,LA,INODE,INOPV
1401
INTEGER NFRONT,NASS,N,LIW,INODE,INOPV
1369
1403
INTEGER KEEP(500)
1376
INTEGER APOS, POSELT, IOLDPS
1410
INTEGER(8) :: APOS, POSELT
1411
INTEGER(8) :: J1, J2, J3_8, JJ, IDIAG
1412
INTEGER(8) :: NFRONT8
1377
1414
INTEGER NOFFW,NPIV,IPIV
1378
INTEGER NPIVP1,JMAX,J1,J3,JJ,J2,IDIAG,ISW,ISWPS1
1416
INTEGER NPIVP1,JMAX,ISW,ISWPS1
1379
1417
INTEGER ISWPS2,KSW,XSIZE
1380
1418
INTEGER TYPEF_L, I_PIVRPTR_L, I_PIVR_L, NBPANELS_L
1381
1419
INTEGER TYPEF_U, I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
1382
1420
PARAMETER (TYPEF_L=1, TYPEF_U=2)
1383
1421
INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
1384
* PP_LastPIVRPTRFilled_L,
1385
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1386
* PP_LastPIVRPTRFilled_U
1422
& PP_LastPIVRPTRFilled_L,
1423
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
1424
& PP_LastPIVRPTRFilled_U
1387
1425
INTEGER SMUMPS_IXAMAX
1388
1426
INCLUDE 'mumps_headers.h'
1390
1428
DATA ZERO /0.0E0/
1429
NFRONT8 = int(NFRONT,8)
1392
1431
XSIZE = KEEP(IXSZ)
1393
1432
NPIV = IW(IOLDPS+1+XSIZE)
1394
1433
NPIVP1 = NPIV + 1
1395
1434
IF (KEEP(201).EQ.1 .AND. KEEP(50).NE.1) THEN
1396
1435
CALL SMUMPS_667(TYPEF_L, NBPANELS_L,
1397
* I_PIVRPTR_L, I_PIVR_L,
1398
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)
1436
& I_PIVRPTR_L, I_PIVR_L,
1437
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)
1401
1440
CALL SMUMPS_667(TYPEF_U, NBPANELS_U,
1402
* I_PIVRPTR_U, I_PIVR_U,
1403
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1441
& I_PIVRPTR_U, I_PIVR_U,
1442
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
1406
1445
DO 460 IPIV=NPIVP1,NASS
1407
APOS = POSELT + NFRONT*NPIV + (IPIV-1)
1446
APOS = POSELT + NFRONT8*int(NPIV,8) + int(IPIV-1,8)
1411
1450
J3 = NASS -NPIV
1412
1451
JMAX = SMUMPS_IXAMAX(J3,A(J1),NFRONT)
1413
JJ = J1 + (JMAX-1)*NFRONT
1452
JJ = J1 + int(JMAX-1,8)*NFRONT8
1414
1453
AMROW = abs(A(JJ))
1416
J1 = APOS + (NASS-NPIV) * NFRONT
1455
J1 = APOS + int(NASS-NPIV,8) * NFRONT8
1417
1456
J3 = NFRONT - NASS
1418
1457
IF (J3.EQ.0) GOTO 370
1420
1459
RMAX = max(abs(A(J1)),RMAX)
1423
1462
370 IF (RMAX.EQ.ZERO) GO TO 460
1424
IDIAG = APOS + (IPIV - NPIVP1)*NFRONT
1463
IDIAG = APOS + int(IPIV - NPIVP1,8)*NFRONT8
1425
1464
IF (abs(A(IDIAG)).GE.max(UU*RMAX,SEUIL)) THEN
1426
1465
JMAX = IPIV - NPIV
1466
1505
IF (KEEP(201).EQ.1) THEN
1467
1506
CALL SMUMPS_680( IW(I_PIVRPTR_L),
1469
* IW(I_PIVR_L), NASS, NPIVP1, NPIV+JMAX,
1470
* PP_LastPanelonDisk_L,
1471
* PP_LastPIVRPTRFilled_L)
1508
& IW(I_PIVR_L), NASS, NPIVP1, NPIV+JMAX,
1509
& PP_LastPanelonDisk_L,
1510
& PP_LastPIVRPTRFilled_L)
1472
1511
CALL SMUMPS_680( IW(I_PIVRPTR_U),
1474
* IW(I_PIVR_U), NASS, NPIVP1, IPIV,
1475
* PP_LastPanelonDisk_U,
1476
* PP_LastPIVRPTRFilled_U)
1513
& IW(I_PIVR_U), NASS, NPIVP1, IPIV,
1514
& PP_LastPanelonDisk_U,
1515
& PP_LastPIVRPTRFilled_U)
1480
1519
END SUBROUTINE SMUMPS_220
1481
1520
SUBROUTINE SMUMPS_225(IBEG_BLOCK,
1482
* NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1483
* IOLDPS,POSELT,IFINB,LKJIB,LKJIT,XSIZE)
1521
& NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1522
& IOLDPS,POSELT,IFINB,LKJIB,LKJIT,XSIZE)
1485
INTEGER NFRONT,NASS,N,LA,LIW,INODE,IFINB,LKJIB,IBEG_BLOCK
1524
INTEGER NFRONT,NASS,N,LIW,INODE,IFINB,LKJIB,IBEG_BLOCK
1487
1527
INTEGER IW(LIW)
1489
INTEGER APOS, UUPOS, IOLDPS, POSELT
1529
INTEGER(8) :: APOS, POSELT, UUPOS, LPOS
1530
INTEGER(8) :: NFRONT8
1490
1532
INTEGER LKJIT, XSIZE
1491
1533
REAL ONE, ALPHA
1492
1534
INTEGER NPIV,JROW2
1493
INTEGER NEL2,NPIVP1,KROW,LPOS,NEL
1535
INTEGER NEL2,NPIVP1,KROW,NEL
1494
1536
INCLUDE 'mumps_headers.h'
1495
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1537
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1538
NFRONT8= int(NFRONT,8)
1496
1539
NPIV = IW(IOLDPS+1+XSIZE)
1497
1540
NPIVP1 = NPIV + 1
1498
1541
NEL = NFRONT - NPIVP1
1515
1558
IBEG_BLOCK = NPIVP1+1
1518
APOS = POSELT + NPIV*(NFRONT + 1)
1561
APOS = POSELT + int(NPIV,8)*(NFRONT8 + 1_8)
1519
1562
VALPIV = ONE/A(APOS)
1520
LPOS = APOS + NFRONT
1563
LPOS = APOS + NFRONT8
1521
1564
DO 541 KROW = 1,NEL2
1522
1565
A(LPOS) = A(LPOS)*VALPIV
1523
LPOS = LPOS + NFRONT
1566
LPOS = LPOS + NFRONT8
1525
LPOS = APOS + NFRONT
1568
LPOS = APOS + NFRONT8
1527
1570
CALL SGER(NEL,NEL2,ALPHA,A(UUPOS),1,A(LPOS),NFRONT,
1571
& A(LPOS+1_8),NFRONT)
1531
1574
END SUBROUTINE SMUMPS_225
1532
1575
SUBROUTINE SMUMPS_229(NFRONT,N,INODE,IW,LIW,A,LA,IOLDPS,
1535
INTEGER NFRONT,N,INODE,LA,LIW,XSIZE
1578
INTEGER NFRONT,N,INODE,LIW,XSIZE
1537
1581
INTEGER IW(LIW)
1538
1582
REAL ALPHA,VALPIV
1539
INTEGER APOS, POSELT, UUPOS
1583
INTEGER(8) :: APOS, POSELT, UUPOS
1584
INTEGER(8) :: NFRONT8, LPOS, IRWPOS
1540
1585
INTEGER IOLDPS,NPIV,NEL
1541
INTEGER LPOS,JROW,IRWPOS
1542
1587
INCLUDE 'mumps_headers.h'
1588
REAL, PARAMETER :: ONE = 1.0E0
1589
NFRONT8= int(NFRONT,8)
1545
1590
NPIV = IW(IOLDPS+1+XSIZE)
1546
1591
NEL = NFRONT - NPIV - 1
1547
APOS = POSELT + (NPIV)*NFRONT + NPIV
1592
APOS = POSELT + int(NPIV,8) * NFRONT8 + int(NPIV,8)
1548
1593
IF (NEL.EQ.0) GO TO 650
1549
1594
VALPIV = ONE/A(APOS)
1550
LPOS = APOS + NFRONT
1595
LPOS = APOS + NFRONT8
1551
1596
DO 340 JROW = 1,NEL
1552
1597
A(LPOS) = VALPIV*A(LPOS)
1553
LPOS = LPOS + NFRONT
1598
LPOS = LPOS + NFRONT8
1555
LPOS = APOS + NFRONT
1600
LPOS = APOS + NFRONT8
1557
1602
DO 440 JROW = 1,NEL
1559
1604
ALPHA = -A(LPOS)
1560
1605
CALL SAXPY(NEL,ALPHA,A(UUPOS),1,A(IRWPOS),1)
1561
LPOS = LPOS + NFRONT
1606
LPOS = LPOS + NFRONT8
1564
1609
END SUBROUTINE SMUMPS_229
1565
1610
SUBROUTINE SMUMPS_228(NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1566
* IOLDPS,POSELT,IFINB,XSIZE)
1611
& IOLDPS,POSELT,IFINB,XSIZE)
1568
1613
INCLUDE 'mumps_headers.h'
1569
INTEGER NFRONT,NASS,N,LA,LIW,INODE,IFINB
1614
INTEGER NFRONT,NASS,N,LIW,INODE,IFINB
1571
1617
INTEGER IW(LIW)
1572
1618
REAL ALPHA,VALPIV
1573
INTEGER APOS, POSELT,UUPOS
1619
INTEGER(8) :: APOS, POSELT, UUPOS, LPOS, IRWPOS
1620
INTEGER(8) :: NFRONT8
1574
1621
INTEGER IOLDPS,NPIV,KROW, XSIZE
1575
INTEGER NEL,LPOS,ICOL,NEL2,IRWPOS
1622
INTEGER NEL,ICOL,NEL2
1624
REAL, PARAMETER :: ONE = 1.0E0
1625
NFRONT8=int(NFRONT,8)
1579
1626
NPIV = IW(IOLDPS+1+XSIZE)
1580
1627
NPIVP1 = NPIV + 1
1581
1628
NEL = NFRONT - NPIVP1
1582
1629
NEL2 = NASS - NPIVP1
1584
1631
IF (NPIVP1.EQ.NASS) IFINB = 1
1585
APOS = POSELT + NPIV*(NFRONT + 1)
1632
APOS = POSELT + int(NPIV,8)*(NFRONT8 + 1_8)
1586
1633
VALPIV = ONE/A(APOS)
1587
LPOS = APOS + NFRONT
1634
LPOS = APOS + NFRONT8
1588
1635
DO 541 KROW = 1,NEL
1589
1636
A(LPOS) = A(LPOS)*VALPIV
1590
LPOS = LPOS + NFRONT
1637
LPOS = LPOS + NFRONT8
1592
LPOS = APOS + NFRONT
1639
LPOS = APOS + NFRONT8
1594
1641
DO 440 ICOL = 1,NEL
1596
1643
ALPHA = -A(LPOS)
1597
1644
CALL SAXPY(NEL2,ALPHA,A(UUPOS),1,A(IRWPOS),1)
1598
LPOS = LPOS + NFRONT
1645
LPOS = LPOS + NFRONT8
1601
1648
END SUBROUTINE SMUMPS_228
1602
1649
SUBROUTINE SMUMPS_231(A,LA,NFRONT,
1652
INTEGER(8) :: LA,POSELT
1607
1654
INTEGER NFRONT, NPIV, NASS
1608
INTEGER NEL1,NEL11,LPOS2,LPOS1,LPOS
1655
INTEGER(8) :: LPOS, LPOS1, LPOS2
1609
1657
REAL ALPHA, ONE
1610
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1658
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1611
1659
NEL1 = NFRONT - NASS
1612
1660
NEL11 = NFRONT - NPIV
1613
LPOS2 = POSELT + NASS*NFRONT
1661
LPOS2 = POSELT + int(NASS,8)*int(NFRONT,8)
1614
1662
CALL STRSM('L','L','N','N',NPIV,NEL1,ONE,A(POSELT),NFRONT,
1617
LPOS1 = POSELT + NPIV
1664
LPOS = LPOS2 + int(NPIV,8)
1665
LPOS1 = POSELT + int(NPIV,8)
1618
1666
CALL SGEMM('N','N',NEL11,NEL1,NPIV,ALPHA,A(LPOS1),
1619
* NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1667
& NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1621
1669
END SUBROUTINE SMUMPS_231
1622
1670
SUBROUTINE SMUMPS_642(A,LAFAC,NFRONT,
1629
1677
INTEGER NFRONT, NPIV, NASS
1630
INTEGER LAFAC, LIWFAC, TYPEFile, MYID, IFLAG_OOC,
1679
INTEGER LIWFAC, TYPEFile, MYID, IFLAG_OOC,
1631
1680
& LNextPiv2beWritten, UNextPiv2beWritten, STRAT
1633
1682
INTEGER IW(LIWFAC)
1634
1683
INTEGER*8 KEEP8(150)
1635
1684
TYPE(IO_BLOCK) :: MonBloc
1636
INTEGER NEL1,NEL11,LPOS2,LPOS1,LPOS
1685
INTEGER(8) :: LPOS2,LPOS1,LPOS
1637
1687
REAL ALPHA, ONE
1638
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1689
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1639
1690
NEL1 = NFRONT - NASS
1640
1691
NEL11 = NFRONT - NPIV
1641
LPOS2 = 1 + NASS*NFRONT
1692
LPOS2 = 1_8 + int(NASS,8) * int(NFRONT,8)
1642
1693
CALL STRSM('L','L','N','N',NPIV,NEL1,ONE,A(1),NFRONT,
1644
1696
CALL SMUMPS_688
1645
1697
& ( STRAT, TYPEFile,
1646
1698
& A, LAFAC, MonBloc,
1647
1699
& LNextPiv2beWritten, UNextPiv2beWritten,
1649
& MYID, KEEP8(31), IFLAG_OOC )
1701
& MYID, KEEP8(31), IFLAG_OOC,LAST_CALL )
1702
LPOS = LPOS2 + int(NPIV,8)
1703
LPOS1 = int(1 + NPIV,8)
1652
1704
CALL SGEMM('N','N',NEL11,NEL1,NPIV,ALPHA,A(LPOS1),
1653
* NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1705
& NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1655
1707
END SUBROUTINE SMUMPS_642
1656
1708
SUBROUTINE SMUMPS_232(A,LA,NFRONT,NPIV,NASS,POSELT,LKJIB)
1657
INTEGER LA, NFRONT, NPIV, NASS, LKJIB
1709
INTEGER NFRONT, NPIV, NASS, LKJIB
1710
INTEGER (8) :: POSELT, LA
1660
INTEGER POSELT_LOCAL
1661
INTEGER NEL1, NEL11, NPBEG, LPOS, LPOS1, LPOS2
1712
INTEGER(8) :: POSELT_LOCAL, LPOS, LPOS1, LPOS2
1713
INTEGER NEL1, NEL11, NPBEG
1662
1714
REAL ALPHA, ONE
1663
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1715
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1664
1716
POSELT_LOCAL = POSELT
1665
1717
NEL1 = NASS - NPIV
1666
1718
NPBEG = NPIV - LKJIB + 1
1667
1719
NEL11 = NFRONT - NPIV
1668
LPOS2 = POSELT_LOCAL + NPIV*NFRONT + NPBEG - 1
1669
POSELT_LOCAL = POSELT_LOCAL + (NPBEG-1)*NFRONT + NPBEG - 1
1720
LPOS2 = POSELT_LOCAL + int(NPIV,8)*int(NFRONT,8)
1721
& + int(NPBEG - 1,8)
1722
POSELT_LOCAL = POSELT_LOCAL + int(NPBEG-1,8)*int(NFRONT,8)
1670
1724
CALL STRSM('L','L','N','N',LKJIB,NEL1,ONE,A(POSELT_LOCAL),
1671
* NFRONT,A(LPOS2),NFRONT)
1672
LPOS = LPOS2 + LKJIB
1673
LPOS1 = POSELT_LOCAL + LKJIB
1725
& NFRONT,A(LPOS2),NFRONT)
1726
LPOS = LPOS2 + int(LKJIB,8)
1727
LPOS1 = POSELT_LOCAL + int(LKJIB,8)
1674
1728
CALL SGEMM('N','N',NEL11,NEL1,LKJIB,ALPHA,A(LPOS1),
1675
* NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1729
& NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1677
1731
END SUBROUTINE SMUMPS_232
1678
1732
SUBROUTINE SMUMPS_233(IBEG_BLOCK,
1679
* NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1680
* IOLDPS,POSELT,LKJIB_ORIG,LKJIB,LKJIT,XSIZE )
1733
& NFRONT,NASS,N,INODE,IW,LIW,A,LA,
1734
& IOLDPS,POSELT,LKJIB_ORIG,LKJIB,LKJIT,XSIZE )
1682
INTEGER NFRONT, NASS,N,LA,LIW
1736
INTEGER NFRONT, NASS,N,LIW
1684
1739
INTEGER IW(LIW)
1685
1740
INTEGER LKJIB_ORIG,LKJIB, INODE, IBEG_BLOCK
1741
INTEGER(8) :: POSELT, LPOS, LPOS1, LPOS2, POSLOCAL
1742
INTEGER(8) :: IPOS, KPOS
1743
INTEGER(8) :: NFRONT8
1687
1744
INTEGER IOLDPS, NPIV, JROW2, NPBEG
1688
1745
INTEGER NONEL, LKJIW, NEL1, NEL11
1689
INTEGER LBP, IPOS, KPOS, LPOS2, HF
1690
INTEGER LPOS1,LPOS,LBPT,I1,K1,II,ISWOP,LBP1
1691
INTEGER LKJIT, POSLOCAL, XSIZE
1747
INTEGER LBPT,I1,K1,II,ISWOP,LBP1
1748
INTEGER LKJIT, XSIZE
1692
1749
INCLUDE 'mumps_headers.h'
1693
1750
REAL ALPHA, ONE
1694
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1751
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1752
NFRONT8=int(NFRONT,8)
1695
1753
NPIV = IW(IOLDPS+1+XSIZE)
1696
1754
JROW2 = iabs(IW(IOLDPS+3+XSIZE))
1697
1755
NPBEG = IBEG_BLOCK
1708
1766
LKJIW = NPIV - NPBEG + 1
1709
1767
NEL11 = NFRONT - NPIV
1710
1768
IF ((NEL1.NE.0).AND.(LKJIW.NE.0)) THEN
1711
LPOS2 = POSELT + JROW2*NFRONT + NPBEG - 1
1712
POSLOCAL = POSELT + (NPBEG-1)*NFRONT + NPBEG - 1
1769
LPOS2 = POSELT + int(JROW2,8)*NFRONT8 +
1771
POSLOCAL = POSELT + int(NPBEG-1,8)*NFRONT8 + int(NPBEG - 1,8)
1713
1772
CALL STRSM('L','L','N','N',LKJIW,NEL1,ONE,
1714
* A(POSLOCAL),NFRONT,
1716
LPOS = LPOS2 + LKJIW
1717
LPOS1 = POSLOCAL + LKJIW
1773
& A(POSLOCAL),NFRONT,
1775
LPOS = LPOS2 + int(LKJIW,8)
1776
LPOS1 = POSLOCAL + int(LKJIW,8)
1718
1777
CALL SGEMM('N','N',NEL11,NEL1,LKJIW,ALPHA,A(LPOS1),
1719
* NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1778
& NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
1722
1781
END SUBROUTINE SMUMPS_233
1723
1782
SUBROUTINE SMUMPS_236(A,LA,NPIVB,NFRONT,
1726
INTEGER NPIVB,NASS,LA
1728
INTEGER APOS, POSELT
1788
INTEGER(8) :: APOS, POSELT
1729
1789
INTEGER NFRONT, NPIV, NASSL
1730
INTEGER LPOS, LPOS1, LPOS2, NEL1, NEL11, NPIVE
1790
INTEGER(8) :: LPOS, LPOS1, LPOS2
1791
INTEGER NEL1, NEL11, NPIVE
1731
1792
REAL ALPHA, ONE
1732
PARAMETER(ONE=1.0E0, ALPHA=-1.0E0)
1793
PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
1733
1794
NEL1 = NFRONT - NASS
1734
1795
NEL11 = NFRONT - NPIV
1735
1796
NPIVE = NPIV - NPIVB
1736
1797
NASSL = NASS - NPIVB
1737
APOS = POSELT + NPIVB*NFRONT + NPIVB
1738
LPOS2 = APOS + NASSL
1798
APOS = POSELT + int(NPIVB,8)*int(NFRONT,8)
1800
LPOS2 = APOS + int(NASSL,8)
1739
1801
CALL STRSM('R','U','N','U',NEL1,NPIVE,ONE,A(APOS),NFRONT,
1741
LPOS = LPOS2 + NFRONT*NPIVE
1742
LPOS1 = APOS + NFRONT*NPIVE
1803
LPOS = LPOS2 + int(NFRONT,8)*int(NPIVE,8)
1804
LPOS1 = APOS + int(NFRONT,8)*int(NPIVE,8)
1743
1805
CALL SGEMM('N','N',NEL1,NEL11,NPIVE,ALPHA,A(LPOS2),
1744
* NFRONT,A(LPOS1),NFRONT,ONE,A(LPOS),NFRONT)
1806
& NFRONT,A(LPOS1),NFRONT,ONE,A(LPOS),NFRONT)
1746
1808
END SUBROUTINE SMUMPS_236
1747
1809
SUBROUTINE SMUMPS_217(N, NZ, NSCA,
1748
* ASPK, IRN, ICN, COLSCA, ROWSCA, S, MAXS,
1810
& ASPK, IRN, ICN, COLSCA, ROWSCA, WK, LWK, WK_REAL,
1811
& LWK_REAL, ICNTL, INFO)
1750
1813
INTEGER N, NZ, NSCA, MAXS
1751
1814
INTEGER IRN(NZ), ICN(NZ)
1752
1815
INTEGER ICNTL(40), INFO(40)
1754
1817
REAL COLSCA(*), ROWSCA(*)
1818
INTEGER LWK, LWK_REAL
1820
REAL WK_REAL(LWK_REAL)
1757
INTEGER ISPW1, IWNOR
1761
1826
PARAMETER( ONE = 1.0E0 )
1791
1856
IF ((NSCA.EQ.5).OR.
1792
1857
& (NSCA.EQ.6)) THEN
1794
IF (ITOT.GT.MAXS) GOTO 400
1795
ISPW1 = MAXS - NZ + 1
1858
IF (NZ.GT.LWK) GOTO 400
1797
S(ISPW1+K-1) = ASPK(K)
1802
IF (ITOT.GT.MAXS) GOTO 400
1863
IF (5*N.GT.LWK_REAL) GOTO 410
1805
1865
IF (NSCA.EQ.1) THEN
1806
1866
CALL SMUMPS_238(N,NZ,ASPK,IRN,ICN,
1807
* COLSCA,ROWSCA,MPG)
1867
& COLSCA,ROWSCA,MPG)
1808
1868
ELSEIF (NSCA.EQ.2) THEN
1809
1869
CALL SMUMPS_239(N,NZ,ASPK,IRN,ICN,
1810
* ROWSCA,COLSCA,S(IWNOR),MPG,MPG,NSCA)
1870
& ROWSCA,COLSCA,WK_REAL(IWNOR),MPG,MPG,NSCA)
1811
1871
ELSEIF (NSCA.EQ.3) THEN
1812
CALL SMUMPS_241(N,NZ,ASPK,IRN,ICN,S(IWNOR),COLSCA,
1872
CALL SMUMPS_241(N,NZ,ASPK,IRN,ICN,WK_REAL(IWNOR),
1814
1874
ELSEIF (NSCA.EQ.4) THEN
1815
1875
CALL SMUMPS_287(N,NZ,IRN,ICN,ASPK,
1816
* S(IWNOR),S(IWNOR+N),COLSCA,ROWSCA,MPG)
1876
& WK_REAL(IWNOR),WK_REAL(IWNOR+N),COLSCA,ROWSCA,MPG)
1817
1877
ELSEIF (NSCA.EQ.5) THEN
1818
CALL SMUMPS_239(N,NZ,S(ISPW1),IRN,ICN,
1819
* ROWSCA,COLSCA,S(IWNOR),MPG,MPG,NSCA)
1820
CALL SMUMPS_241(N,NZ,S(ISPW1),IRN,ICN,S(IWNOR),
1878
CALL SMUMPS_239(N,NZ,WK,IRN,ICN,
1879
& ROWSCA,COLSCA,WK_REAL(IWNOR),MPG,MPG,NSCA)
1880
CALL SMUMPS_241(N,NZ,WK,IRN,ICN,WK_REAL(IWNOR),
1822
1882
ELSEIF (NSCA.EQ.6) THEN
1823
CALL SMUMPS_239(N,NZ,S(ISPW1),IRN,ICN,
1824
* ROWSCA,COLSCA,S(IWNOR),MPG,MPG,NSCA)
1825
CALL SMUMPS_240(NSCA,N,NZ,IRN,ICN,S(ISPW1),
1826
* S(IWNOR+N),ROWSCA,MPG)
1827
CALL SMUMPS_241(N,NZ,S(ISPW1),IRN,ICN,S(IWNOR),
1883
CALL SMUMPS_239(N,NZ,WK,IRN,ICN,
1884
& ROWSCA,COLSCA,WK_REAL(IWNOR),MPG,MPG,NSCA)
1885
CALL SMUMPS_240(NSCA,N,NZ,IRN,ICN,WK,
1886
& WK_REAL(IWNOR+N),ROWSCA,MPG)
1887
CALL SMUMPS_241(N,NZ,WK,IRN,ICN,
1888
& WK_REAL(IWNOR), COLSCA, MPG)
1831
1891
400 INFO(1) = -5
1833
IF ((LP.GT.0).AND.(ICNTL(4).GE.1))
1834
* WRITE(LP,*) '*** ERROR: Not enough space to scale matrix'
1893
IF ((LP.GT.0).AND.(ICNTL(4).GE.1))
1894
& WRITE(LP,*) '*** ERROR: Not enough space to scale matrix'
1897
INFO(2) = 5*N-LWK_REAL
1898
IF ((LP.GT.0).AND.(ICNTL(4).GE.1))
1899
& WRITE(LP,*) '*** ERROR: Not enough space to scale matrix'
1836
1903
END SUBROUTINE SMUMPS_217
1837
1904
SUBROUTINE SMUMPS_287(N,NZ,IRN,ICN,VAL,
1838
* RNOR,CNOR,COLSCA,ROWSCA,MPRINT)
1905
& RNOR,CNOR,COLSCA,ROWSCA,MPRINT)
1840
REAL VAL(NZ),RNOR(N),CNOR(N)
1908
REAL RNOR(N),CNOR(N)
1841
1909
REAL COLSCA(N),ROWSCA(N)
1842
1910
REAL CMIN,CMAX,RMIN,ARNOR,ACNOR
1843
1911
INTEGER IRN(NZ), ICN(NZ)
2273
2343
IF ( I_AM_SLAVE .and.
2274
* id%NZ_loc .NE. 0 ) THEN
2344
& id%NZ_loc .NE. 0 ) THEN
2275
2345
IF (.NOT.LSCAL) THEN
2276
2346
CALL SMUMPS_207(id%A_loc,
2278
* id%IRN_loc, id%JCN_loc,
2279
* SUMR_LOC, id%KEEP,id%KEEP8 )
2348
& id%IRN_loc, id%JCN_loc,
2349
& SUMR_LOC, id%KEEP,id%KEEP8 )
2281
2351
CALL SMUMPS_289(id%A_loc,
2283
* id%IRN_loc, id%JCN_loc,
2284
* SUMR_LOC, id%KEEP,id%KEEP8,
2353
& id%IRN_loc, id%JCN_loc,
2354
& SUMR_LOC, id%KEEP,id%KEEP8,
2288
SUMR_LOC = real(ZERO)
2290
2360
IF ( id%MYID .eq. MASTER ) THEN
2291
2361
CALL MPI_REDUCE( SUMR_LOC, SUMR,
2293
* MPI_SUM,MASTER,id%COMM, IERR)
2363
& MPI_SUM,MASTER,id%COMM, IERR)
2295
2365
CALL MPI_REDUCE( SUMR_LOC, DUMMY,
2297
* MPI_SUM,MASTER,id%COMM, IERR)
2367
& MPI_SUM,MASTER,id%COMM, IERR)
2299
2369
DEALLOCATE (SUMR_LOC)
4277
4347
SUBROUTINE SMUMPS_628(IW,LREC,SIZE_FREE,XSIZE)
4278
4348
INTEGER, intent(in) :: LREC, XSIZE
4279
4349
INTEGER, intent(in) :: IW(LREC)
4280
INTEGER, intent(out):: SIZE_FREE
4350
INTEGER(8), intent(out):: SIZE_FREE
4281
4351
INCLUDE 'mumps_headers.h'
4282
4352
IF (IW(1+XXS).EQ.S_NOLCBCONTIG .OR.
4283
* IW(1+XXS).EQ.S_NOLCBNOCONTIG) THEN
4284
SIZE_FREE=IW(1+XSIZE+2)*IW(1+XSIZE+3)
4353
& IW(1+XXS).EQ.S_NOLCBNOCONTIG) THEN
4354
SIZE_FREE=int(IW(1+XSIZE+2),8)*int(IW(1+XSIZE+3),8)
4285
4355
ELSE IF (IW(1+XXS).EQ.S_NOLCBCONTIG38 .OR.
4286
* IW(1+XXS).EQ.S_NOLCBNOCONTIG38) THEN
4287
SIZE_FREE=IW(1+XSIZE+2)*(IW(1+XSIZE)+
4290
* - IW(1+XSIZE + 3) ) )
4356
& IW(1+XXS).EQ.S_NOLCBNOCONTIG38) THEN
4357
SIZE_FREE=int(IW(1+XSIZE+2),8)*int(IW(1+XSIZE)+
4360
& - IW(1+XSIZE + 3) ), 8)
4295
4365
END SUBROUTINE SMUMPS_628
4296
4366
SUBROUTINE SMUMPS_629
4297
*(IW,LIW,IXXP,ICURRENT,NEXT, RCURRENT,ISIZE2SHIFT)
4367
&(IW,LIW,IXXP,ICURRENT,NEXT, RCURRENT,ISIZE2SHIFT)
4299
4369
INCLUDE 'mumps_headers.h'
4300
INTEGER LIW,IXXP,ICURRENT,NEXT,RCURRENT,ISIZE2SHIFT
4370
INTEGER(8) :: RCURRENT
4371
INTEGER LIW,IXXP,ICURRENT,NEXT,ISIZE2SHIFT
4301
4372
INTEGER IW(LIW)
4303
RCURRENT=RCURRENT-IW(ICURRENT+XXR)
4375
CALL MUMPS_729( RSIZE, IW(ICURRENT + XXR) )
4376
RCURRENT = RCURRENT - RSIZE
4304
4377
NEXT=IW(ICURRENT+XXP)
4305
4378
IW(IXXP)=ICURRENT+ISIZE2SHIFT
4306
4379
IXXP=ICURRENT+XXP
4340
4413
END SUBROUTINE SMUMPS_631
4341
4414
SUBROUTINE SMUMPS_94(N,KEEP28,IW,LIW,A,LA,
4342
* LRLU,IPTRLU,IWPOS,
4343
* IWPOSCB,PTRIST,PTRAST,STEP,PIMASTER,PAMASTER, ITLOC,
4344
* KEEP216,LRLUS,XSIZE)
4415
& LRLU,IPTRLU,IWPOS,
4416
& IWPOSCB,PTRIST,PTRAST,STEP,PIMASTER,PAMASTER, ITLOC,
4417
& KEEP216,LRLUS,XSIZE)
4346
INTEGER N,LIW,LA,LRLU,KEEP28,
4347
& IPTRLU,IWPOS,IWPOSCB,KEEP216,XSIZE
4348
INTEGER, intent(IN):: LRLUS
4349
INTEGER IW(LIW),PTRIST(KEEP28),PTRAST(KEEP28),
4419
INTEGER(8) :: LA, LRLU, IPTRLU, LRLUS
4420
INTEGER N,LIW,KEEP28,
4421
& IWPOS,IWPOSCB,KEEP216,XSIZE
4422
INTEGER(8) :: PTRAST(KEEP28), PAMASTER(KEEP28)
4423
INTEGER IW(LIW),PTRIST(KEEP28),
4352
* PAMASTER(KEEP28), ITLOC(N)
4354
4428
INCLUDE 'mumps_headers.h'
4355
INTEGER ICURRENT, NEXT, RCURRENT, STATE_NEXT
4356
INTEGER ISIZE2SHIFT, RSIZE2SHIFT
4357
INTEGER IBEGCONTIG, RBEGCONTIG
4429
INTEGER ICURRENT, NEXT, STATE_NEXT
4430
INTEGER(8) :: RCURRENT
4432
INTEGER(8) :: RSIZE2SHIFT
4434
INTEGER(8) :: RBEGCONTIG
4435
INTEGER(8) :: RBEG2SHIFT, REND2SHIFT
4437
INTEGER(8) :: FREE_IN_REC
4438
INTEGER(8) :: RCURRENT_SIZE
4363
4442
ICURRENT = LIW-XSIZE+1
4365
4444
IBEGCONTIG = -999999
4366
RBEGCONTIG = -999999
4445
RBEGCONTIG = -999999_8
4367
4446
NEXT = IW(ICURRENT+XXP)
4368
4447
IF (NEXT.EQ.TOP_OF_STACK) RETURN
4369
4448
STATE_NEXT = IW(NEXT+XXS)
4370
4449
IXXP = ICURRENT+XXP
4372
4451
IF ( STATE_NEXT .NE. S_FREE .AND.
4374
* (STATE_NEXT .NE. S_NOLCBNOCONTIG .AND.
4375
* STATE_NEXT .NE. S_NOLCBCONTIG .AND.
4376
* STATE_NEXT .NE. S_NOLCBNOCONTIG38 .AND.
4377
* STATE_NEXT .NE. S_NOLCBCONTIG38))) THEN
4453
& (STATE_NEXT .NE. S_NOLCBNOCONTIG .AND.
4454
& STATE_NEXT .NE. S_NOLCBCONTIG .AND.
4455
& STATE_NEXT .NE. S_NOLCBNOCONTIG38 .AND.
4456
& STATE_NEXT .NE. S_NOLCBCONTIG38))) THEN
4378
4457
CALL SMUMPS_629(IW,LIW,
4379
* IXXP, ICURRENT, NEXT, RCURRENT, ISIZE2SHIFT)
4458
& IXXP, ICURRENT, NEXT, RCURRENT, ISIZE2SHIFT)
4459
CALL MUMPS_729(RCURRENT_SIZE, IW(ICURRENT+XXR))
4380
4460
IF (IBEGCONTIG < 0) THEN
4381
4461
IBEGCONTIG=ICURRENT+IW(ICURRENT+XXI)-1
4383
IF (RBEGCONTIG < 0) THEN
4384
RBEGCONTIG=RCURRENT+IW(ICURRENT+XXR)-1
4463
IF (RBEGCONTIG < 0_8) THEN
4464
RBEGCONTIG=RCURRENT+RCURRENT_SIZE-1_8
4386
4466
INODE=IW(ICURRENT+XXN)
4387
IF (RSIZE2SHIFT .NE. 0) THEN
4467
IF (RSIZE2SHIFT .NE. 0_8) THEN
4388
4468
IF (PTRAST(STEP(INODE)).EQ.RCURRENT)
4389
* PTRAST(STEP(INODE))=
4390
* PTRAST(STEP(INODE))+RSIZE2SHIFT
4469
& PTRAST(STEP(INODE))=
4470
& PTRAST(STEP(INODE))+RSIZE2SHIFT
4391
4471
IF (PAMASTER(STEP(INODE)).EQ.RCURRENT)
4392
* PAMASTER(STEP(INODE))=
4393
* PAMASTER(STEP(INODE))+RSIZE2SHIFT
4472
& PAMASTER(STEP(INODE))=
4473
& PAMASTER(STEP(INODE))+RSIZE2SHIFT
4395
4475
IF (ISIZE2SHIFT .NE. 0) THEN
4396
4476
IF (PTRIST(STEP(INODE)).EQ.ICURRENT)
4397
* PTRIST(STEP(INODE))=
4398
* PTRIST(STEP(INODE))+ISIZE2SHIFT
4477
& PTRIST(STEP(INODE))=
4478
& PTRIST(STEP(INODE))+ISIZE2SHIFT
4399
4479
IF (PIMASTER(STEP(INODE)).EQ.ICURRENT)
4400
* PIMASTER(STEP(INODE))=
4401
* PIMASTER(STEP(INODE))+ISIZE2SHIFT
4480
& PIMASTER(STEP(INODE))=
4481
& PIMASTER(STEP(INODE))+ISIZE2SHIFT
4403
4483
IF (NEXT .NE. TOP_OF_STACK) THEN
4404
4484
STATE_NEXT=IW(NEXT+XXS)
4415
4495
IBEGCONTIG=-9999
4417
IF (RBEGCONTIG .GT.0 .AND. RSIZE2SHIFT .NE. 0) THEN
4497
IF (RBEGCONTIG .GT.0_8 .AND. RSIZE2SHIFT .NE. 0_8) THEN
4418
4498
CALL SMUMPS_631(A,LA,RCURRENT,RBEGCONTIG,RSIZE2SHIFT)
4422
4502
IF (NEXT.EQ. TOP_OF_STACK) GOTO 100
4423
4503
IF (STATE_NEXT .EQ. S_NOLCBCONTIG .OR.
4424
* STATE_NEXT .EQ. S_NOLCBNOCONTIG .OR.
4425
* STATE_NEXT .EQ. S_NOLCBCONTIG38 .OR.
4426
* STATE_NEXT .EQ. S_NOLCBNOCONTIG38) THEN
4504
& STATE_NEXT .EQ. S_NOLCBNOCONTIG .OR.
4505
& STATE_NEXT .EQ. S_NOLCBCONTIG38 .OR.
4506
& STATE_NEXT .EQ. S_NOLCBNOCONTIG38) THEN
4427
4507
IF ( KEEP216.eq.3) THEN
4428
4508
WRITE(*,*) "Internal error 2 in SMUMPS_94"
4430
IF (RBEGCONTIG > 0) GOTO 25
4510
IF (RBEGCONTIG > 0_8) GOTO 25
4431
4511
CALL SMUMPS_629
4432
* (IW,LIW,IXXP,ICURRENT,NEXT, RCURRENT,ISIZE2SHIFT)
4512
& (IW,LIW,IXXP,ICURRENT,NEXT, RCURRENT,ISIZE2SHIFT)
4433
4513
IF (IBEGCONTIG < 0 ) THEN
4434
4514
IBEGCONTIG=ICURRENT+IW(ICURRENT+XXI)-1
4436
4516
CALL SMUMPS_628(IW(ICURRENT),
4440
4520
IF (STATE_NEXT .EQ. S_NOLCBNOCONTIG) THEN
4441
4521
CALL SMUMPS_627(A,LA,RCURRENT,
4442
* IW(ICURRENT+XSIZE+2),
4443
* IW(ICURRENT+XSIZE),
4444
* IW(ICURRENT+XSIZE)+IW(ICURRENT+XSIZE+3), 0,
4445
* IW(ICURRENT+XXS),RSIZE2SHIFT)
4522
& IW(ICURRENT+XSIZE+2),
4523
& IW(ICURRENT+XSIZE),
4524
& IW(ICURRENT+XSIZE)+IW(ICURRENT+XSIZE+3), 0,
4525
& IW(ICURRENT+XXS),RSIZE2SHIFT)
4446
4526
ELSE IF (STATE_NEXT .EQ. S_NOLCBNOCONTIG38) THEN
4447
4527
CALL SMUMPS_627(A,LA,RCURRENT,
4448
* IW(ICURRENT+XSIZE+2),
4449
* IW(ICURRENT+XSIZE),
4450
* IW(ICURRENT+XSIZE)+IW(ICURRENT+XSIZE+3),
4451
* IW(ICURRENT+XSIZE+4)-IW(ICURRENT+XSIZE+3),
4452
* IW(ICURRENT+XXS),RSIZE2SHIFT)
4453
ELSE IF (RSIZE2SHIFT .GT.0) THEN
4454
CALL SMUMPS_631(A, LA, RCURRENT+FREE_IN_REC,
4455
* RCURRENT+IW(ICURRENT+XXR)-1,
4528
& IW(ICURRENT+XSIZE+2),
4529
& IW(ICURRENT+XSIZE),
4530
& IW(ICURRENT+XSIZE)+IW(ICURRENT+XSIZE+3),
4531
& IW(ICURRENT+XSIZE+4)-IW(ICURRENT+XSIZE+3),
4532
& IW(ICURRENT+XXS),RSIZE2SHIFT)
4533
ELSE IF (RSIZE2SHIFT .GT.0_8) THEN
4534
RBEG2SHIFT = RCURRENT + FREE_IN_REC
4535
CALL MUMPS_729(RCURRENT_SIZE, IW(ICURRENT+XXR))
4536
REND2SHIFT = RCURRENT + RCURRENT_SIZE - 1_8
4537
CALL SMUMPS_631(A, LA,
4538
& RBEG2SHIFT, REND2SHIFT,
4458
4541
INODE=IW(ICURRENT+XXN)
4459
4542
IF (ISIZE2SHIFT.NE.0) THEN
4460
4543
PTRIST(STEP(INODE))=PTRIST(STEP(INODE))+ISIZE2SHIFT
4462
4545
PTRAST(STEP(INODE))=PTRAST(STEP(INODE))+RSIZE2SHIFT+
4464
IW(ICURRENT+XXR)=IW(ICURRENT+XXR)-FREE_IN_REC
4547
CALL MUMPS_724(IW(ICURRENT+XXR),FREE_IN_REC)
4465
4548
IF (STATE_NEXT.EQ.S_NOLCBCONTIG.OR.
4466
* STATE_NEXT.EQ.S_NOLCBNOCONTIG) THEN
4549
& STATE_NEXT.EQ.S_NOLCBNOCONTIG) THEN
4467
4550
IW(ICURRENT+XXS)=S_NOLCLEANED
4469
4552
IW(ICURRENT+XXS)=S_NOLCLEANED38
4471
4554
RSIZE2SHIFT=RSIZE2SHIFT+FREE_IN_REC
4473
4556
IF (NEXT.EQ.TOP_OF_STACK) THEN
4503
4587
END SUBROUTINE SMUMPS_94
4504
4588
SUBROUTINE SMUMPS_632(IREC, IW, LIW,
4505
* ISIZEHOLE, RSIZEHOLE)
4589
& ISIZEHOLE, RSIZEHOLE)
4507
4591
INTEGER, intent(in) :: IREC, LIW
4508
4592
INTEGER, intent(in) :: IW(LIW)
4509
INTEGER, intent(out):: ISIZEHOLE, RSIZEHOLE
4593
INTEGER, intent(out):: ISIZEHOLE
4594
INTEGER(8), intent(out) :: RSIZEHOLE
4510
4595
INTEGER IRECLOC
4596
INTEGER(8) :: RECLOC_SIZE
4511
4597
INCLUDE 'mumps_headers.h'
4514
4600
IRECLOC = IREC + IW( IREC+XXI )
4602
CALL MUMPS_729(RECLOC_SIZE, IW(IRECLOC+XXR))
4516
4603
IF (IW(IRECLOC+XXS).EQ.S_FREE) THEN
4517
4604
ISIZEHOLE=ISIZEHOLE+IW(IRECLOC+XXI)
4518
RSIZEHOLE=RSIZEHOLE+IW(IRECLOC+XXR)
4605
RSIZEHOLE=RSIZEHOLE+RECLOC_SIZE
4519
4606
IRECLOC=IRECLOC+IW(IRECLOC+XXI)
4523
4610
END SUBROUTINE SMUMPS_632
4524
4611
SUBROUTINE SMUMPS_627(A, LA, RCURRENT,
4525
* NROW, NCB, LD, NELIM, NODESTATE, ISHIFT)
4612
& NROW, NCB, LD, NELIM, NODESTATE, ISHIFT)
4527
4614
INCLUDE 'mumps_headers.h'
4528
4615
INTEGER LD, NROW, NCB, NELIM, NODESTATE
4529
INTEGER ISHIFT, LA, RCURRENT
4616
INTEGER(8) :: ISHIFT
4617
INTEGER(8) :: LA, RCURRENT
4531
INTEGER I,J,IOLD,INEW
4620
INTEGER(8) :: IOLD,INEW
4532
4621
LOGICAL NELIM_ROOT
4533
4622
NELIM_ROOT=.TRUE.
4534
4623
IF (NODESTATE.EQ. S_NOLCBNOCONTIG) THEN
4581
4670
END SUBROUTINE SMUMPS_627
4582
4671
SUBROUTINE SMUMPS_700(BUFR,LBUFR,
4584
* root, N, IW, LIW, A, LA,
4585
* NBPROCFILS, LRLU, IPTRLU, IWPOS, IWPOSCB,
4586
* PTRIST, PTLUST_S, PTRFAC, PTRAST, STEP, PIMASTER, PAMASTER,
4587
* COMP, LRLUS, IPOOL, LPOOL, LEAF,
4588
* FILS, MYID, PTRAIW, PTRARW, INTARR, DBLARR,
4589
* KEEP,KEEP8, IFLAG, IERROR, COMM, COMM_LOAD, ITLOC,
4590
* ND,PROCNODE_STEPS,SLAVEF )
4673
& root, N, IW, LIW, A, LA,
4674
& NBPROCFILS, LRLU, IPTRLU, IWPOS, IWPOSCB,
4675
& PTRIST, PTLUST_S, PTRFAC, PTRAST, STEP, PIMASTER, PAMASTER,
4676
& COMP, LRLUS, IPOOL, LPOOL, LEAF,
4677
& FILS, MYID, PTRAIW, PTRARW, INTARR, DBLARR,
4678
& KEEP,KEEP8, IFLAG, IERROR, COMM, COMM_LOAD, ITLOC,
4679
& ND,PROCNODE_STEPS,SLAVEF )
4591
4680
USE SMUMPS_LOAD
4615
4706
REAL DBLARR(max(1,KEEP(13)))
4616
4707
INCLUDE 'mpif.h'
4618
INTEGER POSITION, LOCAL_M, LOCAL_N, POS_ROOT, LREQI, LREQA
4709
INTEGER POSITION, LOCAL_M, LOCAL_N, LREQI
4710
INTEGER(8) :: LREQA, POS_ROOT
4619
4711
INTEGER NROW_SON, NCOL_SON, IROOT, ISON
4620
4712
INTEGER NBROWS_ALREADY_SENT, NBROWS_PACKET
4621
4713
INCLUDE 'mumps_headers.h'
4623
4715
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4624
* ISON, 1, MPI_INTEGER, COMM, IERR )
4625
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4626
* NROW_SON, 1, MPI_INTEGER, COMM, IERR )
4627
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4628
* NCOL_SON, 1, MPI_INTEGER, COMM, IERR )
4629
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4630
* NBROWS_ALREADY_SENT, 1, MPI_INTEGER,
4632
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4633
* NBROWS_PACKET, 1, MPI_INTEGER,
4716
& ISON, 1, MPI_INTEGER, COMM, IERR )
4717
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4718
& NROW_SON, 1, MPI_INTEGER, COMM, IERR )
4719
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4720
& NCOL_SON, 1, MPI_INTEGER, COMM, IERR )
4721
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4722
& NBROWS_ALREADY_SENT, 1, MPI_INTEGER,
4724
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4725
& NBROWS_PACKET, 1, MPI_INTEGER,
4635
4727
IROOT = KEEP( 38 )
4636
4728
IF ( PTRIST( STEP(IROOT) ) .NE. 0 .OR.
4637
* PTLUST_S( STEP(IROOT)) .NE. 0 ) THEN
4729
& PTLUST_S( STEP(IROOT)) .NE. 0 ) THEN
4638
4730
IF (NBROWS_ALREADY_SENT + NBROWS_PACKET .EQ. NROW_SON .OR.
4639
* NROW_SON*NCOL_SON .EQ. 0)THEN
4731
& NROW_SON.EQ.0 .OR. NCOL_SON .EQ. 0)THEN
4640
4732
NBPROCFILS(STEP(IROOT)) = NBPROCFILS(STEP(IROOT))-1
4641
4733
IF ( NBPROCFILS( STEP(IROOT) ) .eq. 0 ) THEN
4642
4734
IF (KEEP(201).EQ.1) THEN
4645
4737
CALL SMUMPS_580(IERR)
4647
4739
CALL SMUMPS_507( N, IPOOL, LPOOL,
4648
* PROCNODE_STEPS, SLAVEF, KEEP(28), KEEP(76),
4649
* KEEP(80), KEEP(47),
4740
& PROCNODE_STEPS, SLAVEF, KEEP(28), KEEP(76),
4741
& KEEP(80), KEEP(47),
4651
4743
IF (KEEP(47) .GE. 3) THEN
4652
4744
CALL SMUMPS_500(
4654
* PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
4655
* MYID, STEP, N, ND, FILS )
4746
& PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
4747
& MYID, STEP, N, ND, FILS )
4660
4752
IF (NBROWS_ALREADY_SENT + NBROWS_PACKET .EQ. NROW_SON
4662
* NROW_SON*NCOL_SON .EQ. 0)THEN
4754
& NROW_SON*NCOL_SON .EQ. 0)THEN
4663
4755
NBPROCFILS(STEP( IROOT ) ) = -1
4665
4757
IF (KEEP(60) == 0) THEN
4666
4758
CALL SMUMPS_284( root, IROOT, N,
4668
* FILS, MYID, PTRAIW, PTRARW, INTARR, DBLARR,
4670
* IWPOS, IWPOSCB, PTRIST, PTRAST,
4671
* STEP, PIMASTER, PAMASTER, ITLOC,
4672
* COMP, LRLUS, IFLAG, KEEP,KEEP8, IERROR )
4760
& FILS, MYID, PTRAIW, PTRARW, INTARR, DBLARR,
4762
& IWPOS, IWPOSCB, PTRIST, PTRAST,
4763
& STEP, PIMASTER, PAMASTER, ITLOC,
4764
& COMP, LRLUS, IFLAG, KEEP,KEEP8, IERROR )
4673
4765
IF ( IFLAG .LT. 0 ) RETURN
4675
4767
PTRIST(STEP(IROOT)) = -55555
4678
4770
LREQI = NBROWS_PACKET + NCOL_SON
4679
LREQA = NBROWS_PACKET * NCOL_SON
4680
IF ( (LREQA.NE.0) .AND.
4681
* (PTRIST(STEP(IROOT)).LT.0).AND.
4771
LREQA = int(NBROWS_PACKET,8) * int(NCOL_SON,8)
4772
IF ( (LREQA.NE.0_8) .AND.
4773
& (PTRIST(STEP(IROOT)).LT.0).AND.
4683
4775
WRITE(*,*) ' Error in SMUMPS_700'
4684
4776
CALL MUMPS_ABORT()
4686
IF (LREQA.NE.0) THEN
4687
CALL SMUMPS_22(.FALSE.,0,.FALSE.,.FALSE.,
4688
* MYID,N,KEEP,KEEP8,IW,LIW,A, LA,
4689
* LRLU, IPTRLU, IWPOS, IWPOSCB, PTRIST,
4690
* PTRAST, STEP, PIMASTER, PAMASTER, ITLOC,
4691
* LREQI, LREQA, -1234, S_NOTFREE, .FALSE.,
4692
* COMP, LRLUS, IFLAG, IERROR
4778
IF (LREQA.NE.0_8) THEN
4779
CALL SMUMPS_22(.FALSE.,0_8,.FALSE.,.FALSE.,
4780
& MYID,N,KEEP,KEEP8,IW,LIW,A, LA,
4781
& LRLU, IPTRLU, IWPOS, IWPOSCB, PTRIST,
4782
& PTRAST, STEP, PIMASTER, PAMASTER, ITLOC,
4783
& LREQI, LREQA, -1234, S_NOTFREE, .FALSE.,
4784
& COMP, LRLUS, IFLAG, IERROR
4694
4786
IF ( IFLAG .LT. 0 ) RETURN
4695
4787
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4696
* IW( IWPOSCB + 1 ), LREQI,
4697
* MPI_INTEGER, COMM, IERR )
4788
& IW( IWPOSCB + 1 ), LREQI,
4789
& MPI_INTEGER, COMM, IERR )
4698
4790
CALL MPI_UNPACK( BUFR, LBUFR_BYTES, POSITION,
4699
* A( IPTRLU + 1 ), LREQA,
4700
* MPI_REAL, COMM, IERR )
4791
& A( IPTRLU + 1_8 ), int(LREQA),
4792
& MPI_REAL, COMM, IERR )
4701
4793
IF (KEEP(60) .EQ.0) THEN
4702
4794
IF ( PTRIST(STEP(IROOT)) .NE. 0 ) THEN
4703
4795
LOCAL_N = -IW( PTRIST(STEP( IROOT )) + KEEP(IXSZ) )
4707
4799
LOCAL_N = IW( PTLUST_S(STEP( IROOT ) ) + 1 + KEEP(IXSZ))
4708
4800
LOCAL_M = IW( PTLUST_S(STEP( IROOT ) ) + 2 + KEEP(IXSZ))
4709
4801
POS_ROOT = PTRFAC(IW(PTLUST_S(STEP(IROOT))+4+
4712
4804
CALL SMUMPS_38( NBROWS_PACKET, NCOL_SON,
4713
* IW( IWPOSCB + 1 ),
4714
* IW( IWPOSCB + NBROWS_PACKET + 1 ),
4716
* A( POS_ROOT ), LOCAL_M, LOCAL_N )
4805
& IW( IWPOSCB + 1 ),
4806
& IW( IWPOSCB + NBROWS_PACKET + 1 ),
4807
& A( IPTRLU + 1_8 ),
4808
& A( POS_ROOT ), LOCAL_M, LOCAL_N )
4718
4810
CALL SMUMPS_38( NBROWS_PACKET, NCOL_SON,
4719
* IW( IWPOSCB + 1 ),
4720
* IW( IWPOSCB + NBROWS_PACKET + 1 ),
4722
* root%SCHUR_POINTER(1),
4723
* root%SCHUR_LLD , root%SCHUR_NLOC)
4811
& IW( IWPOSCB + 1 ),
4812
& IW( IWPOSCB + NBROWS_PACKET + 1 ),
4813
& A( IPTRLU + 1_8 ),
4814
& root%SCHUR_POINTER(1),
4815
& root%SCHUR_LLD , root%SCHUR_NLOC)
4725
4817
IWPOSCB = IWPOSCB + LREQI
4726
4818
IPTRLU = IPTRLU + LREQA
4727
4819
LRLU = LRLU + LREQA
4728
4820
LRLUS = LRLUS + LREQA
4729
4821
CALL SMUMPS_471(.FALSE.,.FALSE.,
4730
* LA-LRLUS,0,-LREQA,KEEP,KEEP8,LRLU)
4822
& LA-LRLUS,0_8,-LREQA,KEEP,KEEP8,LRLU)
4733
4825
END SUBROUTINE SMUMPS_700
4734
4826
SUBROUTINE SMUMPS_224(NFRONT,NASS,IBEGKJI, LPIV, TIPIV,
4735
* N,INODE,IW,LIW,A,LA,
4736
* INOPV,NOFFW,IFLAG,IOLDPS,POSELT,UU,SEUIL,KEEP,KEEP8,
4737
* DKEEP,PIVNUL_LIST,LPN_LIST,
4738
* PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
4739
* PP_LastPIVRPTRFilled_L,
4740
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
4741
* PP_LastPIVRPTRFilled_U)
4827
& N,INODE,IW,LIW,A,LA,
4828
& INOPV,NOFFW,IFLAG,IOLDPS,POSELT,UU,SEUIL,KEEP,KEEP8,
4829
& DKEEP,PIVNUL_LIST,LPN_LIST,
4830
& PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
4831
& PP_LastPIVRPTRFilled_L,
4832
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
4833
& PP_LastPIVRPTRFilled_U)
4743
4835
INTEGER IBEGKJI, LPIV
4744
4836
INTEGER TIPIV(LPIV)
4745
INTEGER NFRONT,NASS,N,LA,LIW,INODE,IFLAG,INOPV,NOFFW
4839
INTEGER NFRONT,NASS,N,LIW,INODE,IFLAG,INOPV,NOFFW
4748
4841
INTEGER IW(LIW)
4749
INTEGER IOLDPS, POSELT
4843
INTEGER(8) :: POSELT
4750
4844
INTEGER KEEP(500)
4751
4845
INTEGER*8 KEEP8(150)
4752
4846
INTEGER LPN_LIST
4753
4847
INTEGER PIVNUL_LIST(LPN_LIST)
4755
4849
INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
4756
* PP_LastPIVRPTRFilled_L,
4757
* PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
4758
* PP_LastPIVRPTRFilled_U
4850
& PP_LastPIVRPTRFilled_L,
4851
& PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
4852
& PP_LastPIVRPTRFilled_U
4854
INTEGER(8) :: APOS, IDIAG
4855
INTEGER(8) :: J1, J2, JJ, J3_8
4856
INTEGER(8) :: NFRONT8
4761
4858
REAL ZERO, RMAX, AMROW, ONE
4762
4859
INTEGER NPIV,NASSW,IPIV
4763
INTEGER NPIVP1,JMAX,J1,J3,JJ,J2,IDIAG,ISW,ISWPS1
4860
INTEGER NPIVP1,JMAX,J3,ISW,ISWPS1
4764
4861
INTEGER ISWPS2,KSW, HF
4765
4862
INCLUDE 'mumps_headers.h'
4766
4863
INTEGER SMUMPS_IXAMAX
4771
4868
INTEGER TYPEF_U, I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
4773
4870
PARAMETER (TYPEF_L=1, TYPEF_U=2)
4871
NFRONT8=int(NFRONT,8)
4774
4872
XSIZE = KEEP(IXSZ)
4775
4873
NPIV = IW(IOLDPS+1+XSIZE)
4776
4874
HF = 6 + IW(IOLDPS+5+XSIZE)+XSIZE
4777
4875
NPIVP1 = NPIV + 1
4778
4876
IF (KEEP(201).EQ.1) THEN
4779
4877
CALL SMUMPS_667(TYPEF_L, NBPANELS_L,
4780
* I_PIVRPTR_L, I_PIVR_L,
4781
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
4878
& I_PIVRPTR_L, I_PIVR_L,
4879
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
4783
4881
CALL SMUMPS_667(TYPEF_U, NBPANELS_U,
4784
* I_PIVRPTR_U, I_PIVR_U,
4785
* IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
4882
& I_PIVRPTR_U, I_PIVR_U,
4883
& IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
4788
4886
ILOC = NPIVP1 - IBEGKJI + 1
4789
4887
TIPIV(ILOC) = ILOC
4790
4888
NASSW = iabs(IW(IOLDPS+3+XSIZE))
4791
4889
IF(INOPV .EQ. -1) THEN
4792
APOS = POSELT + NFRONT*(NPIVP1-1) + NPIV
4890
APOS = POSELT + NFRONT8*int(NPIVP1-1,8) + int(NPIV,8)
4794
4892
IF(abs(A(APOS)).LT.SEUIL) THEN
4795
4893
IF(real(A(APOS)) .GE. ZERO) THEN
4894
A(APOS) = real(SEUIL)
4896
A(APOS) = real(-SEUIL)
4800
4898
KEEP(98) = KEEP(98)+1
4802
4900
IF (KEEP(201).EQ.1.AND.KEEP(50).NE.1) THEN
4803
4901
CALL SMUMPS_680( IW(I_PIVRPTR_L),
4805
* IW(I_PIVR_L), NASS, NPIVP1, NPIVP1,
4806
* PP_LastPanelonDisk_L,
4807
* PP_LastPIVRPTRFilled_L)
4903
& IW(I_PIVR_L), NASS, NPIVP1, NPIVP1,
4904
& PP_LastPanelonDisk_L,
4905
& PP_LastPIVRPTRFilled_L)
4808
4906
CALL SMUMPS_680( IW(I_PIVRPTR_U),
4810
* IW(I_PIVR_U), NASS, NPIVP1, NPIVP1,
4811
* PP_LastPanelonDisk_U,
4812
* PP_LastPIVRPTRFilled_U)
4908
& IW(I_PIVR_U), NASS, NPIVP1, NPIVP1,
4909
& PP_LastPanelonDisk_U,
4910
& PP_LastPIVRPTRFilled_U)
4817
4915
DO 460 IPIV=NPIVP1,NASSW
4818
APOS = POSELT + NFRONT*(IPIV-1) + NPIV
4916
APOS = POSELT + NFRONT8*int(IPIV-1,8) + int(NPIV,8)
4820
4918
IF (UU.GT.ZERO) GO TO 340
4821
IF (A(APOS).EQ.ZERO) GO TO 630
4919
IF (A(APOS).EQ.real(ZERO)) GO TO 630
4823
4921
340 AMROW = ZERO
4825
J2 = APOS - NPIV + NASS - 1
4923
J2 = APOS +int(- NPIV + NASS - 1,8)
4826
4924
J3 = NASS -NPIV
4827
4925
JMAX = SMUMPS_IXAMAX(J3,A(J1),1)
4926
JJ = int(JMAX,8) + J1 - 1_8
4829
4927
AMROW = abs(A(JJ))
4832
J2 = APOS - NPIV + NFRONT - 1
4930
J2 = APOS +int(- NPIV + NFRONT - 1,8)
4833
4931
IF (J2.LT.J1) GO TO 370
4834
4932
DO 360 JJ=J1,J2
4835
4933
RMAX = max(abs(A(JJ)),RMAX)
4837
370 IDIAG = APOS + IPIV - NPIVP1
4935
370 IDIAG = APOS + int(IPIV - NPIVP1,8)
4838
4936
IF (RMAX.LE.DKEEP(1)) THEN
4839
4937
KEEP(109) = KEEP(109)+1
4840
4938
ISW = IOLDPS+IW(IOLDPS+1+KEEP(IXSZ))+6+KEEP(IXSZ)+
4910
5008
IF (KEEP(201).EQ.1) THEN
4911
5009
CALL SMUMPS_680( IW(I_PIVRPTR_L),
4913
* IW(I_PIVR_L), NASS, NPIVP1, IPIV,
4914
* PP_LastPanelonDisk_L,
4915
* PP_LastPIVRPTRFilled_L)
5011
& IW(I_PIVR_L), NASS, NPIVP1, IPIV,
5012
& PP_LastPanelonDisk_L,
5013
& PP_LastPIVRPTRFilled_L)
4916
5014
CALL SMUMPS_680( IW(I_PIVRPTR_U),
4918
* IW(I_PIVR_U), NASS, NPIVP1, NPIV+JMAX,
4919
* PP_LastPanelonDisk_U,
4920
* PP_LastPIVRPTRFilled_U)
5016
& IW(I_PIVR_U), NASS, NPIVP1, NPIV+JMAX,
5017
& PP_LastPanelonDisk_U,
5018
& PP_LastPIVRPTRFilled_U)
4924
5022
END SUBROUTINE SMUMPS_224
4925
5023
SUBROUTINE SMUMPS_294( COMM_LOAD, ASS_IRECV,
4928
* IOLDPS, POSELT, A, LA, LDA_FS,
4929
* IBEGKJI, IEND, TIPIV, LPIV, LASTBL, NB_BLOC_FAC,
4931
* COMM, MYID, BUFR, LBUFR,LBUFR_BYTES,NBFIN,LEAF,
4932
* IFLAG, IERROR, IPOOL,LPOOL,
4933
* SLAVEF, POSFAC, IWPOS, IWPOSCB, IPTRLU, LRLU,
4935
* PTRIST, PTRAST, PTLUST_S, PTRFAC,
4936
* STEP, PIMASTER, PAMASTER,
4937
* NSTK_S,NBPROCFILS,PROCNODE_STEPS, root,
4938
* OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
4939
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
4940
* LPTRAR, NELT, FRTPTR, FRTELT,
4941
* ISTEP_TO_INIV2, TAB_POS_IN_PERE )
5026
& IOLDPS, POSELT, A, LA, LDA_FS,
5027
& IBEGKJI, IEND, TIPIV, LPIV, LASTBL, NB_BLOC_FAC,
5029
& COMM, MYID, BUFR, LBUFR,LBUFR_BYTES,NBFIN,LEAF,
5030
& IFLAG, IERROR, IPOOL,LPOOL,
5031
& SLAVEF, POSFAC, IWPOS, IWPOSCB, IPTRLU, LRLU,
5033
& PTRIST, PTRAST, PTLUST_S, PTRFAC,
5034
& STEP, PIMASTER, PAMASTER,
5035
& NSTK_S,NBPROCFILS,PROCNODE_STEPS, root,
5036
& OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
5037
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
5038
& LPTRAR, NELT, FRTPTR, FRTELT,
5039
& ISTEP_TO_INIV2, TAB_POS_IN_PERE )
4942
5040
USE SMUMPS_COMM_BUFFER
4943
5041
USE SMUMPS_LOAD
4957
5056
INTEGER KEEP(500)
4958
5057
INTEGER*8 KEEP8(150)
4959
5058
INTEGER NBFIN, IFLAG, IERROR, LEAF, LPOOL,
4961
INTEGER POSFAC, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS,
5060
INTEGER(8) :: POSFAC, IPTRLU, LRLU, LRLUS
5061
INTEGER IWPOS, IWPOSCB, COMP
4963
5062
INTEGER BUFR( LBUFR ), IPOOL(LPOOL),
4964
* ITLOC(N), FILS(N),
4965
* PTRARW(LPTRAR), PTRAIW(LPTRAR),
4966
* ND( KEEP(28) ), FRERE( KEEP(28) )
5063
& ITLOC(N), FILS(N),
5064
& PTRARW(LPTRAR), PTRAIW(LPTRAR),
5065
& ND( KEEP(28) ), FRERE( KEEP(28) )
4967
5066
INTEGER INTARR(max(1,KEEP(14)))
4968
INTEGER PTRIST(KEEP(28)), PTRAST(KEEP(28)), PTLUST_S(KEEP(28)),
4971
* PIMASTER(KEEP(28)),
4972
* PAMASTER(KEEP(28)), NSTK_S(KEEP(28)),
4973
* NBPROCFILS(KEEP(28)), PROCNODE_STEPS(KEEP(28))
5067
INTEGER(8) :: PTRAST (KEEP(28))
5068
INTEGER(8) :: PTRFAC (KEEP(28))
5069
INTEGER(8) :: PAMASTER(KEEP(28))
5070
INTEGER PTRIST(KEEP(28)), PTLUST_S(KEEP(28)),
5071
& STEP(N), PIMASTER(KEEP(28)),
5073
& NBPROCFILS(KEEP(28)), PROCNODE_STEPS(KEEP(28))
4974
5074
INTEGER ISTEP_TO_INIV2(KEEP(71)),
4975
* TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
5075
& TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
4976
5076
DOUBLE PRECISION OPASSW, OPELIW
4977
5077
REAL DBLARR(max(1,KEEP(13)))
4978
5078
EXTERNAL SMUMPS_329
4979
5079
INCLUDE 'mumps_headers.h'
4980
INTEGER NPIV, NCOL, APOS, PDEST, NSLAVES
4981
INTEGER IERR, IERR_MPI, LREQA, LREQI
5080
INTEGER(8) :: APOS, LREQA
5081
INTEGER NPIV, NCOL, PDEST, NSLAVES
5082
INTEGER IERR, IERR_MPI, LREQI
4982
5083
INTEGER STATUS( MPI_STATUS_SIZE )
4983
5084
LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
4984
5085
DOUBLE PRECISION FLOP1,FLOP2
5010
5112
DO WHILE (IERR .EQ.-1)
5011
5113
CALL SMUMPS_65( INODE, LDA_FS, NCOL,
5012
* NPIV, FPERE, LASTBL, TIPIV, A(APOS),
5013
* IW(PDEST), NSLAVES, KEEP(50), NB_BLOC_FAC,
5114
& NPIV, FPERE, LASTBL, TIPIV, A(APOS),
5115
& IW(PDEST), NSLAVES, KEEP(50), NB_BLOC_FAC,
5015
5117
IF (IERR.EQ.-1) THEN
5016
5118
BLOCKING = .FALSE.
5017
5119
SET_IRECV = .TRUE.
5018
5120
MESSAGE_RECEIVED = .FALSE.
5019
5121
CALL SMUMPS_329( COMM_LOAD, ASS_IRECV,
5020
* BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
5021
* MPI_ANY_SOURCE, MPI_ANY_TAG,
5022
* STATUS, BUFR, LBUFR,
5024
* PROCNODE_STEPS, POSFAC, IWPOS, IWPOSCB, IPTRLU,
5025
* LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
5027
* PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
5030
* IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
5031
* root, OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
5032
* INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
5033
* LPTRAR, NELT, FRTPTR, FRTELT,
5034
* ISTEP_TO_INIV2, TAB_POS_IN_PERE, .TRUE. )
5122
& BLOCKING, SET_IRECV, MESSAGE_RECEIVED,
5123
& MPI_ANY_SOURCE, MPI_ANY_TAG,
5124
& STATUS, BUFR, LBUFR,
5126
& PROCNODE_STEPS, POSFAC, IWPOS, IWPOSCB, IPTRLU,
5127
& LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
5129
& PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
5132
& IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
5133
& root, OPASSW, OPELIW, ITLOC, FILS, PTRARW, PTRAIW,
5134
& INTARR, DBLARR, ICNTL, KEEP,KEEP8, ND, FRERE,
5135
& LPTRAR, NELT, FRTPTR, FRTELT,
5136
& ISTEP_TO_INIV2, TAB_POS_IN_PERE, .TRUE. )
5035
5137
IF (MESSAGE_RECEIVED) POSELT = PTRAST(STEP(INODE))
5036
5138
IF ( IFLAG .LT. 0 ) GOTO 500
5052
5156
END SUBROUTINE SMUMPS_294
5053
5157
SUBROUTINE SMUMPS_273( ROOT,
5054
* INODE, NELIM, NSLAVES, ROW_LIST,
5055
* COL_LIST, SLAVE_LIST,
5057
* PROCNODE_STEPS, IWPOS, IWPOSCB, IPTRLU,
5058
* LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
5060
* PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, ITLOC, COMP,
5062
* IPOOL, LPOOL, LEAF, MYID, SLAVEF, KEEP,KEEP8,
5063
* COMM,COMM_LOAD,FILS,ND )
5158
& INODE, NELIM, NSLAVES, ROW_LIST,
5159
& COL_LIST, SLAVE_LIST,
5161
& PROCNODE_STEPS, IWPOS, IWPOSCB, IPTRLU,
5162
& LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
5164
& PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, ITLOC, COMP,
5166
& IPOOL, LPOOL, LEAF, MYID, SLAVEF, KEEP,KEEP8,
5167
& COMM,COMM_LOAD,FILS,ND )
5064
5168
USE SMUMPS_LOAD
5066
5170
INCLUDE 'smumps_root.h'
5113
5219
PIMASTER(STEP(INODE)) = 0
5115
5221
NOINT = 6 + NSLAVES + NELIM + NELIM + KEEP(IXSZ)
5117
CALL SMUMPS_22(.FALSE.,0,.FALSE.,.FALSE.,
5118
* MYID,N,KEEP,KEEP8,IW,LIW, A, LA,
5119
* LRLU, IPTRLU,IWPOS,IWPOSCB,
5120
* PTRIST,PTRAST,STEP, PIMASTER, PAMASTER, ITLOC,
5121
* NOINT, NOREAL, INODE, S_NOTFREE, .TRUE.,
5122
* COMP, LRLUS, IFLAG, IERROR
5223
CALL SMUMPS_22(.FALSE.,0_8,.FALSE.,.FALSE.,
5224
& MYID,N,KEEP,KEEP8,IW,LIW, A, LA,
5225
& LRLU, IPTRLU,IWPOS,IWPOSCB,
5226
& PTRIST,PTRAST,STEP, PIMASTER, PAMASTER, ITLOC,
5227
& NOINT, NOREAL, INODE, S_NOTFREE, .TRUE.,
5228
& COMP, LRLUS, IFLAG, IERROR
5124
5230
IF ( IFLAG .LT. 0 ) THEN
5125
5231
WRITE(*,*) ' Failure in int space allocation in CB area ',
5126
* ' during assembly of root : SMUMPS_273',
5127
* ' size required was :', NOINT,
5128
* 'INODE=',INODE,' NELIM=',NELIM, ' NSLAVES=', NSLAVES
5232
& ' during assembly of root : SMUMPS_273',
5233
& ' size required was :', NOINT,
5234
& 'INODE=',INODE,' NELIM=',NELIM, ' NSLAVES=', NSLAVES
5131
5237
PIMASTER(STEP( INODE )) = IWPOSCB + 1
5132
PAMASTER(STEP( INODE )) = IPTRLU + 1
5238
PAMASTER(STEP( INODE )) = IPTRLU + 1_8
5133
5239
IW( IWPOSCB + 1+KEEP(IXSZ) ) = 2*NELIM
5134
5240
IW( IWPOSCB + 2+KEEP(IXSZ) ) = NELIM
5135
5241
IW( IWPOSCB + 3+KEEP(IXSZ) ) = 0
5148
5254
IF (NSTK_S(STEP(IROOT)) .EQ. 0 ) THEN
5149
5255
CALL SMUMPS_507(N, IPOOL, LPOOL, PROCNODE_STEPS,
5150
* SLAVEF, KEEP(28), KEEP(76), KEEP(80), KEEP(47),
5256
& SLAVEF, KEEP(28), KEEP(76), KEEP(80), KEEP(47),
5152
5258
IF (KEEP(47) .GE. 3) THEN
5153
5259
CALL SMUMPS_500(
5155
* PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
5156
* MYID, STEP, N, ND, FILS )
5261
& PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
5262
& MYID, STEP, N, ND, FILS )
5160
5266
END SUBROUTINE SMUMPS_273
5161
5267
SUBROUTINE SMUMPS_534( N,FRERE, FILS,
5162
* NA,NE,ND,PERM,SYM,INFO,LP,K47,K81,K215,K234,K55,
5163
* PROCNODE,SLAVEF,PEAK
5268
& NA,NE,ND,PERM,SYM,INFO,LP,K47,K81,K215,K234,K55,
5269
& PROCNODE,SLAVEF,PEAK
5166
5272
INTEGER N,PERM,SYM, LP, SIZE_MEM_SBTR
5167
5273
INTEGER FRERE(N), FILS(N)
5281
5388
CALL SMUMPS_363(N,FRERE, STEP, FILS,
5283
* DUMMY_DAD, DUMMY_DAD_LENGTH, USE_DAD,
5284
* NSTEPS,PERM,SYM,INFO,LP,K47_LOC,K81_LOC,0,K215,K234,K55,
5285
* PROCNODE,MEM_SUBTREE,SLAVEF, SIZE_MEM_SBTR, PEAK,SBTR_WHICH_M
5286
$ ,1,1,DEPTH_FIRST,COST_TRAV,MY_LEAF,MY_SIZE,MY_ROOT
5390
& DUMMY_DAD, DUMMY_DAD_LENGTH, USE_DAD,
5391
& NSTEPS,PERM,SYM,INFO,LP,K47_LOC,K81_LOC,0,K215,K234,K55,
5392
& PROCNODE,MEM_SUBTREE,SLAVEF, SIZE_MEM_SBTR, PEAK,SBTR_WHICH_M
5393
& ,1,1,DEPTH_FIRST,COST_TRAV,MY_LEAF,MY_SIZE,MY_ROOT
5288
5395
NA(1:NBLEAF)=NEW_NA(3:2+NBLEAF)
5290
5397
IF (N.GT.1) THEN
5308
5415
END SUBROUTINE SMUMPS_534
5309
5416
SUBROUTINE SMUMPS_363(N,FRERE, STEP, FILS,
5310
* NA,LNA,NE,ND, DAD, LDAD, USE_DAD,
5311
* NSTEPS,PERM,SYM,INFO,LP,K47,K81,K76,K215,K234,K55,
5312
* PROCNODE,MEM_SUBTREE,SLAVEF, SIZE_MEM_SBTR, PEAK
5313
$ ,SBTR_WHICH_M,SIZE_DEPTH_FIRST,SIZE_COST_TRAV,
5314
$ DEPTH_FIRST_TRAV,COST_TRAV,MY_FIRST_LEAF,
5315
$ MY_NB_LEAF,MY_ROOT_SBTR
5417
& NA,LNA,NE,ND, DAD, LDAD, USE_DAD,
5418
& NSTEPS,PERM,SYM,INFO,LP,K47,K81,K76,K215,K234,K55,
5419
& PROCNODE,MEM_SUBTREE,SLAVEF, SIZE_MEM_SBTR, PEAK
5420
& ,SBTR_WHICH_M,SIZE_DEPTH_FIRST,SIZE_COST_TRAV,
5421
& DEPTH_FIRST_TRAV,COST_TRAV,MY_FIRST_LEAF,
5422
& MY_NB_LEAF,MY_ROOT_SBTR
5318
5425
INTEGER N,PERM,SYM, NSTEPS, LNA, LP, SIZE_MEM_SBTR,LDAD
5319
5426
INTEGER FRERE(NSTEPS), FILS(N), STEP(N)
5759
5868
IF((SYM.EQ.0).OR.(K215.NE.0))THEN
5762
SIZECB=NCB*(NCB+1)/2
5871
SIZECB=(NCB*(NCB+1_8))/2_8
5764
5873
IF (K234.NE.0 .AND. K55.EQ.0) THEN
5765
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,((ND(STEP(IFATH))
5766
$ *ND(STEP(IFATH)))+SUM-SIZECB_LASTSON+TMP_SUM))
5874
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,
5875
& ( ( int(ND(STEP(IFATH)),8)
5876
& * int(ND(STEP(IFATH)),8) )
5877
& + SUM-SIZECB_LASTSON+TMP_SUM )
5767
5879
ELSE IF (K234.NE.0 .AND. K55.NE.0) THEN
5768
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,((ND(STEP(IFATH))
5769
$ *ND(STEP(IFATH)))+SUM+TMP_SUM))
5880
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,
5881
& ( ( int(ND(STEP(IFATH)),8)
5882
& * int(ND(STEP(IFATH)),8) )
5771
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,((ND(STEP(IFATH))
5772
$ *ND(STEP(IFATH)))+max(SUM,SIZECB)+TMP_SUM))
5886
TOTAL_MEM_SIZE=max(TOTAL_MEM_SIZE,
5887
& ( ( int(ND(STEP(IFATH)),8)
5888
& * int(ND(STEP(IFATH)),8))
5889
& + max(SUM,SIZECB) + TMP_SUM )
5774
5892
IF(II.EQ.1)THEN
5775
5893
TMP_TOTAL_MEM_SIZE=TOTAL_MEM_SIZE
5777
5895
IF((II.EQ.1).OR.(PERM.EQ.7)) THEN
5778
5896
IF (K234.NE.0 .AND. K55.EQ.0) THEN
5779
M(STEP(IFATH))=max(MEM_SIZE,((ND(STEP(IFATH))
5780
$ *ND(STEP(IFATH)))+SUM-SIZECB_LASTSON+
5897
M(STEP(IFATH))=max(MEM_SIZE,((int(ND(STEP(IFATH)),8)
5898
& *int(ND(STEP(IFATH)),8))+SUM-SIZECB_LASTSON+
5782
5900
ELSE IF (K234.NE.0 .AND. K55.NE.0) THEN
5783
M(STEP(IFATH))=max(MEM_SIZE,((ND(STEP(IFATH))
5784
$ *ND(STEP(IFATH)))+SUM+FACT_SIZE))
5901
M(STEP(IFATH))=max(MEM_SIZE,((int(ND(STEP(IFATH)),8)
5902
& *int(ND(STEP(IFATH)),8))+SUM+FACT_SIZE))
5786
M(STEP(IFATH))=max(MEM_SIZE,((ND(STEP(IFATH))
5787
$ *ND(STEP(IFATH)))+max(SUM,SIZECB)+FACT_SIZE))
5904
M(STEP(IFATH))=max(MEM_SIZE,((int(ND(STEP(IFATH)),8)
5905
& *int(ND(STEP(IFATH)),8))+max(SUM,SIZECB)+FACT_SIZE))
5789
5907
IF (SBTR_M.OR.(PERM.EQ.2)) THEN
5790
5908
M_TOTAL(STEP(IFATH))=max(MEM_SIZE_T,
5792
$ *ND(STEP(IFATH)))+max(SUM,SIZECB)+
5909
& ((int(ND(STEP(IFATH)),8)
5910
& *int(ND(STEP(IFATH)),8))+max(SUM,SIZECB)+
5796
5914
IF((II.EQ.2).AND.(PERM.EQ.1).OR.(PERM.EQ.0).OR.
5797
$ (PERM.EQ.5).OR.(PERM.EQ.6).OR.
5798
$ (.NOT.SBTR_M.OR.(SBTR_WHICH_M.NE.1)))THEN
5799
MEM_SEC_PERM=max(MEM_SIZE,((ND(STEP(IFATH))
5800
$ *ND(STEP(IFATH)))+max(SUM,SIZECB)+FACT_SIZE))
5915
& (PERM.EQ.5).OR.(PERM.EQ.6).OR.
5916
& (.NOT.SBTR_M.OR.(SBTR_WHICH_M.NE.1)))THEN
5917
MEM_SEC_PERM=max(MEM_SIZE,((int(ND(STEP(IFATH)),8)
5918
& *int(ND(STEP(IFATH)),8))+max(SUM,SIZECB)+FACT_SIZE))
5802
5920
IF((PERM.EQ.2).OR.(PERM.EQ.3).OR.(PERM.EQ.4))THEN
5803
5921
MEM_SEC_PERM=huge(MEM_SEC_PERM)