43 SUBROUTINE imp_mumps1(NDDL0 , NNZK0 , NDDL , NNZK , NNMAX ,
44 . NODGLOB, IDDL , NDOF , INLOC, IKC ,
45 . IADK , JDIK , DIAG_K, LT_K , IAD_ELEM,
46 . FR_ELEM, MUMPS_PAR, CDDLP , IADI , JDII ,
47 . ITOK , DIAG_I , LT_I , NDDLI, NNZI ,
58 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
59#include "implicit_f.inc"
64#include "dmumps_struc.h"
73 INTEGER NDDL0, NNZK0, NDDL, NNZK, NNMAX, NODGLOB(*), IDDL(*),
74 . NDOF(*), INLOC(*), IKC(*), IADK(*), JDIK(*),
75 . IAD_ELEM(2,*), FR_ELEM(*), CDDLP(*), IADI(*), JDII(*),
76 . ITOK(*), NDDLI, NNZI,IMPRINT,TLEN, IT
78 . diag_k(*), lt_k(*), diag_i(*), lt_i(*)
80 TYPE(dmumps_struc) MUMPS_PAR
90 INTEGER NDDLG0, NNZKG0, NDDLG, NNZKG, NNMAXG,
91 . NDDL0P(NSPMD), NNZK0P(NSPMD), NDDLP(NSPMD),
92 . NNZKP(NSPMD), NNMAXP(NSPMD), NKLOC,
93 . NKFRONT, NKFLOC, NZLOC, , NZP(NSPMD-1), IACTI(NDDL),
95 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ITK
97 . ,
DIMENSION(:),
ALLOCATABLE :: RTK
107 IF (ncycle==1.AND.inconv==1)
THEN
108 mumps_par%ICNTL(3) = iout
110 mumps_par%ICNTL(3) = -1
114 mumps_par%ICNTL(3) = iout
115 mumps_par%ICNTL(4) = m_msg
119 mumps_par%ICNTL(7) = 7
121 mumps_par%ICNTL(7) = m_order
124 mumps_par%ICNTL(13) = 1
128 IF (m_ocore > 0)
THEN
129 CALL tmpenvf(mumps_par%OOC_TMPDIR,tlen)
130 mumps_par%ICNTL(22)=1
137 mumps_par%ICNTL(18)=3
138 ELSEIF (imumpsd==2)
THEN
139 mumps_par%ICNTL(18)=0
141 IF (idtc==3) mumps_par%ICNTL(13)=1
149 1 nddlg0 ,nnzkg0 ,nddlg ,nnzkg ,nnmaxg ,
150 2 nddl0p ,nnzk0p ,nddlp ,nnzkp ,nnmaxp )
152 CALL spmd_cddl(nddl, nodglob, iddl, ndof, cddlp,
153 . inloc, ikc, nddlg, nddlp)
156 ALLOCATE(itk(2,nnzt),rtk(nnzt))
163 . iadk, jdik, diag_k, lt_k, cddlp,
164 . nkloc, nkfront, itk, rtk, iddl,
165 . inloc, iad_elem, fr_elem, ndof, ikc,
166 . nddl, nnzk, iacti, nddli, nnzi,
167 . iadi, jdii, itok, diag_i, lt_i )
176 ALLOCATE(mumps_par%A_LOC(nzloc),
177 . mumps_par%IRN_LOC(nzloc),
178 . mumps_par%JCN_LOC(nzloc))
180 ALLOCATE(mumps_par%RHS(nddlg))
182 ALLOCATE(mumps_par%RHS(0))
185 mumps_par%NZ_LOC=nzloc
188 mumps_par%IRN_LOC(i)=itk(1,i)
189 mumps_par%JCN_LOC(i)=itk(2,i)
190 mumps_par%A_LOC(i)=rtk(i)
192 ELSEIF (imumpsd==2)
THEN
196 ALLOCATE(mumps_par%A(nnz),
197 . mumps_par%IRN(nnz),
198 . mumps_par%JCN(nnz),
199 . mumps_par%RHS(nddlg))
203 ALLOCATE(mumps_par%A(0),
210 . itk, rtk, nzloc, mumps_par%A, mumps_par%IRN,
211 . mumps_par%JCN, nzp)
216 mumps_par%ICNTL(18)=0
222 nnzk = nnzk + nddli + nnzi
224 ALLOCATE(mumps_par%A(nddl+nnzk),
225 . mumps_par%IRN(nddl+nnzk),
226 . mumps_par%JCN(nddl+nnzk),
227 . mumps_par%RHS(nddl))
235 mumps_par%A(nnz)=diag_i(i)
236 DO n=iadi(i),iadi(i+1)-1
239 mumps_par%JCN(nnz)=itok(jdii(n))
240 mumps_par%A(nnz)=lt_i(n)
247 mumps_par%A(nnz)=diag_k(i)
248 DO j=iadk(i),iadk(i+1)-1
251 mumps_par%JCN(nnz)=jdik(j)
252 mumps_par%A(nnz)=lt_k(j)
258 WRITE(istdo,
'(A21,I10,A8,I10)')
259 .
' MUMPS DIM : NNZ =',nnzk+nddl,
' NNZFR =',0
263 mumps_par%NZ=nnzk+nddl
268 IF (prstifmat == 1 .AND. (iline==1 .OR. (prstifmat_nc == ncycle
269 . .AND. prstifmat_it == it)))
THEN
277 . cddlp, inloc, ikc, nddlg, nddlp)
2811000
FORMAT(5x,
'--STIFFNESS MATRIX IS PRINTED--')
295 . CDDLP, INLOC, IKC, NDDLG, NDDLP)
299 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
300#include "implicit_f.inc"
305#include "dmumps_struc.h"
308#include "com01_c.inc"
309#include "com04_c.inc"
310#include "impl2_c.inc"
319 TYPE(dmumps_struc) mumps_par
324 INTEGER nddl, nodglob(*), IDDL(*), NDOF(*), CDDLP(*), INLOC(*), IKC(*), NDDLG, NDDLP(*)
329 INTEGER I,J,II,JJ,NROWS,NCOLS,,IItmp,JJtmp,
330 . tmpirows,tmpicols,length,l,ind,count_dup,
331 . nkc,tddl(2,mumps_par%N),n,
id,nd,ierror,offst
334 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IROWS,ICOLS,NENTRIEStmp
335 my_real,
DIMENSION(:),
ALLOCATABLE :: k
337 CHARACTER FILNAME*100,FILNAME2*100,CSPMD
343 WRITE(cspmd,
'(I1)') ispmd
344 filname =
'local_stiffness_matrix_domain'//cspmd
345 OPEN(unit=offst+ispmd,file=filname(1:30),access=
"SEQUENTIAL",
346 . action=
"WRITE",status=
"UNKNOWN")
358 tddl(1,cddlp(
id))=nodglob(i)
374 WRITE(offst+ispmd,1002) mumps_par%N,mumps_par%N,mumps_par%NZ
376 iitmp = mumps_par%IRN(i)
377 jjtmp = mumps_par%JCN(i)
378 ii = 6*(tddl(1,iitmp)-1)+tddl(2,iitmp)
379 jj = 6*(tddl(1,jjtmp)-1)+tddl(2,jjtmp)
385 WRITE(offst+ispmd,1003) ii,jj,mumps_par%A(i)
388 WRITE(offst+ispmd,1002) mumps_par%N,mumps_par%N,mumps_par%NZ_LOC
389 DO i=1,mumps_par%NZ_LOC
390 iitmp = mumps_par%IRN_LOC(i)
391 jjtmp = mumps_par%JCN_LOC(i)
392 ii = 6*(tddl(1,iitmp)-1)+tddl(2,iitmp)
393 jj = 6*(tddl(1,jjtmp)-1)+tddl(2,jjtmp)
399 WRITE(offst+ispmd,1003) ii,jj,mumps_par%A_LOC(i)
402 CLOSE(unit=offst+ispmd)
408 ALLOCATE(nentriestmp(nspmd))
409 WRITE(cspmd,
'(I1)') nspmd
411 filname2 =
'stiffness_matrix_'//cspmd//
'_SPMD'
412 OPEN(unit=offst+nspmd,file=filname2(1:23),access=
"SEQUENTIAL",
413 . action=
"WRITE",status=
"UNKNOWN")
415 WRITE(cspmd,
'(I1)') l
416 filname =
'local_stiffness_matrix_domain'//cspmd
417 OPEN(unit=offst+l,file=filname(1:30),access=
"SEQUENTIAL",
418 . action=
"READ",status=
"UNKNOWN")
419 READ(unit=offst+l,fmt=*) nrows,ncols,nentriestmp(l+1)
420 nentries = nentries + nentriestmp(l+1)
422 ALLOCATE(irows(nentries))
423 ALLOCATE(icols(nentries))
424 ALLOCATE(k(nentries))
428 DO i = 1,nentriestmp(l+1)
430 READ(unit=offst+l,fmt=*) irows(ind),icols(ind),k(ind)
436 DO WHILE ((i>0) .AND. (switch))
439 IF (icols(j) > icols(j+1) .OR. (icols(j) == icols(j+1)
440 . .AND. irows(j) > irows(j+1)))
THEN
442 irows(j) = irows(j+1)
443 irows(j+1) = tmpirows
445 icols(j) = icols(j+1)
446 icols(j+1) = tmpicols
457 DO WHILE (ind <= nentries)
459 DO WHILE (ind <= nentries .AND. irows(ind)==irows(ind+1)
460 . .AND. icols(ind)==icols(ind+1))
464 IF (abs(tmpk)>=prstifmat_tol)
THEN
465 WRITE(offst+nspmd,1003) irows(ind),icols(ind),tmpk
466 sumk = sumk + abs(tmpk)
470 WRITE(offst+nspmd,1001) sumk
474 DEALLOCATE(nentriestmp)
4791000
FORMAT(i10,i10,i10,i10,e10.2)
4801001
FORMAT(
'Sum ABS(K_ij) = ',e10.2)
4811002
FORMAT(i10,i10,i10)
4821003
FORMAT(i10,i10,e10.2)
558 SUBROUTINE mumps_set(IADK , JDIK , DIAG_K , LT_K , CDDLP,
559 . NKLOC, NKFRONT , ITK , RTK , IDDL ,
560 . INLOC, IAD_ELEM, FR_ELEM, NDOF , IKC ,
561 . NDDL , NNZK , IACTI , NDDLI , NNZI ,
562 . IADI , JDII , ITOK , DIAG_I, LT_I )
570 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
571#include "implicit_f.inc"
575#include "com01_c.inc"
576#include "com04_c.inc"
577#include "com08_c.inc"
582 INTEGER IADK(*), JDIK(*), CDDLP(*), NKLOC, NKFRONT, ITK(2,*),
583 . IDDL(*), INLOC(*), IAD_ELEM(2,*), FR_ELEM(*), NDOF(*),
584 . IKC(*), NDDL, NNZK, IACTI(*), NDDLI, NNZI, IADI(*),
587 . DIAG_K(*), LT_K(*), RTK(*), DIAG_I(*), LT_I(*)
592 INTEGER I, IDDL_FRONT(NSPMD+1,NDDL), NKC, N, TNKC(NUMNOD),
593 . J, ND, NOD, INOD, KK, K, ID, NN, ILOC, JJ,
594 . ITAG(2,NSPMD), INDEX, II, IDIAG(NDDL), IADL(NDDL),
595 . IADLFRONT(NDDL), IFOUND, CDDLP_REM(NDDL_SI),
597 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ITKFRONT
598 my_real,
DIMENSION(:),
ALLOCATABLE :: RTKFRONT
600 ALLOCATE(ITKFRONT(2,NDDL+NNZK+NNZI+NZ_SI),
601 . RTKFRONT(NDDL+NNZK+NNZI+NZ_SI))
605 iddl_front(2,i)=ispmd+1
615 IF (ikc(nd)>=1) nkc=nkc+1
622 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
629 iddl_front(1,id)=iddl_front(1,id)+1
631 iddl_front(nn+1,id)=i
642 IF (iacti(i)==0) cycle
645 iadlfront(ii)=nkfront+1
646 IF (iddl_front(1,ii)==1)
THEN
649 itk(1,nkloc)=cddlp(ii)
650 itk(2,nkloc)=cddlp(ii)
655 itkfront(1,nkfront)=cddlp(ii)
656 itkfront(2,nkfront)=cddlp(ii)
657 rtkfront(nkfront)=diag_k(i)
660 DO j=iadk(i),iadk(i+1)-1
664 IF (iddl_front(1,ii)==1.OR.iddl_front(1,jj)==1)
THEN
671 DO k=1,iddl_front(1,ii)
672 kk=iddl_front(1+k,ii)
675 DO k=1,iddl_front(1,jj)
676 kk=iddl_front(1+k,jj)
681 index=index+itag(1,k)*itag(2,k)
688 itk(1,nkloc)=cddlp(ii)
689 itk(2,nkloc)=cddlp(jj)
691 ELSEIF (iloc==1)
THEN
693 itkfront(1,nkfront)=cddlp(ii)
694 itkfront(2,nkfront)=cddlp(jj)
695 rtkfront(nkfront)=lt_k(j)
703 IF (iacti(i)==0) cycle
705 IF (iddl_front(1,ii)==1)
THEN
707 rtk(j)=rtk(j)+diag_i(n)
710 rtkfront(j)=rtkfront(j)+diag_i(n)
713 DO j=iadi(n),iadi(n+1)-1
718 IF (iddl_front(1,ii)==1.OR.iddl_front(1,jj)==1)
THEN
725 DO k=1,iddl_front(1,ii)
726 kk=iddl_front(1+k,ii)
729 DO k=1,iddl_front(1,jj)
730 kk=iddl_front(1+k,jj)
735 index=index+itag(1,k)*itag(2,k)
743 DO WHILE (ifound==0.AND.k<=iadl(ii+1)-1)
744 IF (cddlp(ii)==itk(1,k)
745 . .AND.cddlp(jj)==itk(2,k)) ifound=k
749 rtk(ifound)=rtk(ifound)+lt_i(j)
752 itk(1,nkloc)=cddlp(ii)
753 itk(2,nkloc)=cddlp(jj)
756 ELSEIF (iloc==1)
THEN
759 DO WHILE (ifound==0.AND.k<=iadlfront(ii+1)-1)
760 IF (cddlp(ii)==itkfront(1,k)
761 . .AND.cddlp(jj)==itkfront(2,k)) ifound=k
765 rtkfront(ifound)=rtkfront(ifound)+lt_i(j)
768 itkfront(1,nkfront)=cddlp(ii)
769 itkfront(2,nkfront)=cddlp(jj)
770 rtkfront(nkfront)=lt_i(j)
782 IF (iddl_front(1,ii)==1.OR.iddl_front(1,jj)==1)
THEN
789 DO k=1,iddl_front(1,ii)
790 kk=iddl_front(1+k,ii)
793 DO k=1,iddl_front(1,jj)
794 kk=iddl_front(1+k,jj)
799 index=index+itag(1,k)*itag(2,k)
805 itk(1,nkloc)=cddlp(ii)
806 itk(2,nkloc)=cddlp(jj)
808 ELSEIF (iloc==1)
THEN
810 itkfront(1,nkfront)=cddlp(ii)
811 itkfront(2,nkfront)=cddlp(jj)
812 rtkfront(nkfront)=lt_sl(j)
819 IF (iacti(i)==0) cycle
822 IF (iddl_front(1,ii)==1)
THEN
823 rtk(j)=rtk(j)+diag_sl(n)
825 rtkfront(j)=rtkfront(j)+diag_sl(n)
831 iadl(i) = iddl_front(1,i)
838 IF (iddl_front(1,jj)==1.OR.iddl_rem(i)==1)
THEN
840 itk(1,nkloc)=cddlp_rem(i)
841 itk(2,nkloc)=cddlp(jj)
845 itkfront(1,nkfront)=cddlp_rem(i)
846 itkfront(2,nkfront)=cddlp(jj)
847 rtkfront(nkfront)=lt_si(j)
853 itk(1,nkloc+i)=itkfront(1,i)
854 itk(2,nkloc+i)=itkfront(2,i)
855 rtk(nkloc+i)=rtkfront(i)
858 DEALLOCATE(itkfront, rtkfront)
877 . NKLOC, NKFRONT , ITK , RTK , IDDL ,
878 . INLOC, IAD_ELEM, FR_ELEM, NDOF , IKC ,
879 . NDDL , NNZK , IACTI , NDDLI , NNZI ,
880 . IADI , JDII , ITOK , DIAG_I, LT_I )
888 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
889#include "implicit_f.inc"
893#include "com01_c.inc"
894#include "com04_c.inc"
898 INTEGER IADK(*), JDIK(*), CDDLP(*), NKLOC, NKFRONT, ITK(2,*),
899 . IDDL(*), INLOC(*), IAD_ELEM(2,*), FR_ELEM(*), NDOF(*),
900 . IKC(*), NDDL, NNZK, IACTI(*), NDDLI, NNZI, IADI(*),
903 . diag_k(*), lt_k(*), rtk(*), diag_i(*), lt_i(*)
909 . J, ND, NOD, INOD, KK, K, ID, NN, ILOC, JJ,
910 . ITAG(2,NSPMD), INDEX, II, IDIAG(NDDL), IADL(NDDL+1),
911 . IFOUND, CDDLP_REM(NDDL_SI),
919 IF (ikc(nd)>=1) nkc=nkc+1
925 IF (iacti(i)==0) cycle
930 itk(1,nkloc)=cddlp(ii)
931 itk(2,nkloc)=cddlp(ii)
933 DO j=iadk(i),iadk(i+1)-1
938 itk(1,nkloc)=cddlp(ii)
939 itk(2,nkloc)=cddlp(jj)
943 iadl(nddl+1) = nkloc+1
948 IF (iacti(i)==0) cycle
951 rtk(j)=rtk(j)+diag_i(n)
952 DO j=iadi(n),iadi(n+1)-1
959 DO WHILE (ifound==0.AND.k<=iadl(ii+1)-1)
960 IF (cddlp(ii)==itk(1,k)
961 . .AND.cddlp(jj)==itk(2,k)) ifound=k
965 rtk(ifound)=rtk(ifound)+lt_i(j)
968 itk(1,nkloc)=cddlp(ii)
969 itk(2,nkloc)=cddlp(jj)
982 itk(1,nkloc)=cddlp(ii)
983 itk(2,nkloc)=cddlp(jj)
990 IF (iacti(i)==0) cycle
993 rtk(j)=rtk(j)+diag_sl(n)
1002 itk(1,nkloc)=cddlp_rem(i)
1003 itk(2,nkloc)=cddlp(jj)
subroutine mumps_set(iadk, jdik, diag_k, lt_k, cddlp, nkloc, nkfront, itk, rtk, iddl, inloc, iad_elem, fr_elem, ndof, ikc, nddl, nnzk, iacti, nddli, nnzi, iadi, jdii, itok, diag_i, lt_i)
subroutine mumps_set2(iadk, jdik, diag_k, lt_k, cddlp, nkloc, nkfront, itk, rtk, iddl, inloc, iad_elem, fr_elem, ndof, ikc, nddl, nnzk, iacti, nddli, nnzi, iadi, jdii, itok, diag_i, lt_i)
subroutine imp_mumps1(nddl0, nnzk0, nddl, nnzk, nnmax, nodglob, iddl, ndof, inloc, ikc, iadk, jdik, diag_k, lt_k, iad_elem, fr_elem, mumps_par, cddlp, iadi, jdii, itok, diag_i, lt_i, nddli, nnzi, imprint, it)