The TELEMAC-MASCARET system  trunk
sd_solve_4.f
Go to the documentation of this file.
1 ! *********************
2  SUBROUTINE sd_solve_4
3 ! *********************
4 !
5  &(npoin,nsegb,glosegb,dab1,dab2,dab3,dab4,xab1,xab2,xab3,xab4,
6  & xx1,xx2,cvb1,cvb2,infogr,typext1,typext2,typext3,typext4)
7 !
8 !***********************************************************************
9 ! BIEF V6P2 08/2012
10 !***********************************************************************
11 !
12 !brief DIRECT RESOLUTION OF A SYSTEM 2 X 2 WITH
13 !+ MINIMUM DEGREE PERMUTATION AND LDLT DECOMPOSITION.
14 !+
15 !+ FROM SEGMENT STORAGE TO COMPACT STORAGE (MORSE).
16 !
17 !note IMPORTANT: INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
18 !
19 !history E. RAZAFINDRAKOTO (LNH)
20 !+ 20/11/06
21 !+ V5P9
22 !+
23 !
24 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
25 !+ 13/07/2010
26 !+ V6P0
27 !+ Translation of French comments within the FORTRAN sources into
28 !+ English comments
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 21/08/2010
32 !+ V6P0
33 !+ Creation of DOXYGEN tags for automated documentation and
34 !+ cross-referencing of the FORTRAN sources
35 !
36 !history J.PARISI (HRW)
37 !+ 09/08/2012
38 !+ V6P2
39 !+
40 !
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !| CVB1,CVB2 |-->| SECOND MEMBERS OF THE 2 SUB-SYSTEMS
43 !| DABX |-->| DIAGONAL TERMS OF SUB-MATRIX X
44 !| GLOSEGB |-->| GLOBAL NUMBER OF SEGMENT OF A SUB-MATRIX
45 !| INFOGR |-->| IF, YES INFORMATIONS ON LISTING
46 !| NPOIN |-->| NOMBRE D'INCONNUES
47 !| NSEGB |-->| NOMBRE DE SEGMENTS
48 !| TYPEXT1 |-->| TYPE OF MATRIX STORAGE : BLOCK 1
49 !| TYPEXT2 |-->| TYPE OF MATRIX STORAGE : BLOCK 2
50 !| TYPEXT3 |-->| TYPE OF MATRIX STORAGE : BLOCK 3
51 !| TYPEXT4 |-->| TYPE OF MATRIX STORAGE : BLOCK 4
52 !| XABX |-->| OFF-DIAGONAL TERMS OF SUB-MATRIX X
53 !| XX1,XX2 |<--| SOLUTIONS
54 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
55 !
56  USE bief, ex_sd_solve_4 => sd_solve_4
58  & rhs_ss4,xinc_ss4,size_gloseg4,
59  & size_da,size_xa,size_rhs,
60  & size_xinc
61 !
63  IMPLICIT NONE
64 !
65 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66 !
67  INTEGER, INTENT(IN) :: NPOIN,NSEGB
68  INTEGER, INTENT(IN) :: GLOSEGB(nsegb*2)
69  LOGICAL, INTENT(IN) :: INFOGR
70  DOUBLE PRECISION, INTENT(IN) :: DAB1(npoin),DAB2(npoin)
71  DOUBLE PRECISION, INTENT(IN) :: DAB3(npoin),DAB4(npoin)
72  DOUBLE PRECISION, INTENT(IN) :: XAB1(*),XAB2(*)
73  DOUBLE PRECISION, INTENT(IN) :: XAB3(*),XAB4(*)
74  DOUBLE PRECISION, INTENT(INOUT) :: XX1(npoin),XX2(npoin)
75  DOUBLE PRECISION, INTENT(IN) :: CVB1(npoin),CVB2(npoin)
76  CHARACTER(LEN=1), INTENT(IN) :: TYPEXT1,TYPEXT2
77  CHARACTER(LEN=1), INTENT(IN) :: TYPEXT3,TYPEXT4
78 !
79 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 !
81  INTEGER NPBLK,NSEGBLK,I
82 !
83 !-----------------------------------------------------------------------
84 !
85  npblk=npoin*2
86  nsegblk=4*nsegb+npoin
87 !
88  IF(size_gloseg4.EQ.0) THEN
89  ALLOCATE(gloseg4_ss4(2*nsegblk))
90  size_gloseg4= 2*nsegblk
91  ELSEIF( 2*nsegblk.GT.size_gloseg4) THEN
92  DEALLOCATE(gloseg4_ss4)
93  ALLOCATE(gloseg4_ss4(2*nsegblk))
94  size_gloseg4= 2*nsegblk
95  ENDIF
96  IF(size_da.EQ.0) THEN
97  ALLOCATE(da_ss4(npblk))
98  size_da= npblk
99  ELSEIF( npblk.GT.size_da) THEN
100  DEALLOCATE(da_ss4)
101  ALLOCATE(da_ss4(npblk))
102  size_da= npblk
103  ENDIF
104  IF(size_xa.EQ.0) THEN
105  ALLOCATE(xa_ss4(2*nsegblk))
106  size_xa= 2*nsegblk
107  ELSEIF( 2*nsegblk.GT.size_xa) THEN
108  DEALLOCATE(xa_ss4)
109  ALLOCATE(xa_ss4(2*nsegblk))
110  size_xa= 2*nsegblk
111  ENDIF
112  IF(size_rhs.EQ.0) THEN
113  ALLOCATE(rhs_ss4(npblk))
114  size_rhs= npblk
115  ELSEIF( npblk.GT.size_rhs) THEN
116  DEALLOCATE(rhs_ss4)
117  ALLOCATE(rhs_ss4(npblk))
118  size_rhs= npblk
119  ENDIF
120  IF(size_xinc.EQ.0) THEN
121  ALLOCATE(xinc_ss4(npblk))
122  size_xinc= npblk
123  ELSEIF( npblk.GT.size_xinc) THEN
124  DEALLOCATE(xinc_ss4)
125  ALLOCATE(xinc_ss4(npblk))
126  size_xinc= npblk
127  ENDIF
128 !
129 !-----------------------------------------------------------------------
130 !
131 ! 1. SECOND MEMBER OF THE SYSTEM
132 ! ===========================
133 !
134  DO i=1,npoin
135  rhs_ss4(i) = cvb1(i)
136  rhs_ss4(i+npoin)= cvb2(i)
137  ENDDO
138 !
139 ! 2. BUILDS SEGMENT STORAGE MATRIX BLOCK (OF 4)
140 ! =====================================================
141 !
142  CALL sd_strsg4(npoin,nsegb,glosegb,nsegblk,gloseg4_ss4)
143 !
144  CALL sd_fabsg4(npoin,nsegb,dab1,dab2,dab3,dab4,
145  & xab1,xab2,xab3,xab4,npblk,nsegblk,da_ss4,xa_ss4,
146  & typext1,typext2,typext3,typext4)
147 !
148 ! 3. SOLVES LIKE A STANDARD SYMMETRICAL MATRIX
149 ! ==================================================
150 !
151 ! HERE TYPEXT1 IS TENTATIVE ACTUALLY IT WOULD BE BETTER TO
152 ! DECLARE THE SYSTEM AS ALWAYS NON-SYMMETRIC
153 !
154  CALL sd_solve_1(npblk,nsegblk,gloseg4_ss4,nsegblk,da_ss4,xa_ss4,
155  & xinc_ss4,rhs_ss4,infogr,typext1)
156 !
157 ! 4. RECOVERS THE UNKNOWNS
158 ! =============================
159 !
160  DO i=1,npoin
161  xx1(i) = xinc_ss4(i)
162  xx2(i) = xinc_ss4(i+npoin)
163  ENDDO
164 !
165 !-----------------------------------------------------------------------
166 !
167  RETURN
168  END
integer, dimension(:), allocatable gloseg4_ss4
subroutine sd_strsg4(NPOIN, NSEG, GLOSEGB, NSEGBLK, GLOSEG4)
Definition: sd_strsg4.f:7
double precision, dimension(:), allocatable da_ss4
subroutine sd_fabsg4(NPOIN, NSEG, DAB1, DAB2, DAB3, DAB4, XAB1, XAB2, XAB3, XAB4, NPBLK, NSEGBLK, DA, XA, TYPEXT1, TYPEXT2, TYPEXT3, TYPEXT4)
Definition: sd_fabsg4.f:8
subroutine sd_solve_1(NPOIN, NSEGB, GLOSEG, MAXSEG, DA, XA, XINC, RHS, INFOGR, TYPEXT)
Definition: sd_solve_1.f:7
double precision, dimension(:), allocatable xa_ss4
subroutine sd_solve_4(NPOIN, NSEGB, GLOSEGB, DAB1, DAB2, DAB3, DAB4, XAB1, XAB2, XAB3, XAB4, XX1, XX2, CVB1, CVB2, INFOGR, TYPEXT1, TYPEXT2, TYPEXT3, TYPEXT4)
Definition: sd_solve_4.f:8
Definition: bief.f:3