The TELEMAC-MASCARET system  trunk
disimp.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE disimp
3 ! *****************
4 !
5  &(q,q2bor,numliq,ifrliq,nsoldis,work1,qbor,nptfr,mask,mesh)
6 !
7 !***********************************************************************
8 ! SISYPHE V6P2 24/07/2012
9 !***********************************************************************
10 !
11 !brief Imposes solid discharge boundary conditions. Q2BOR is the
12 !+ discharge in m2/s, the integral of Q2BOR on the boundary QBOR
13 !+ is multiplied by a constant to get the correct discharge Q
14 !
15 !
16 !history J-M HERVOUET (EDF R&D, LNHE)
17 !+ 24/07/2012
18 !+ V6P2
19 !+
20 !
21 !history J,RIEHME (ADJOINTWARE)
22 !+ November 2016
23 !+ V7P2
24 !+ Replaced EXTERNAL statements to parallel functions / subroutines
25 !+ by the INTERFACE_PARALLEL
26 !
27 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28 !| IFRLIQ |-->| RANK OF LIQUID BOUNDARY
29 !| MASK |-->| BLOCK OF MASKS FOR BOUNDARY CONDITIONS
30 !| MESH |-->| MESH STRUCTURE
31 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
32 !| NSOLDIS |-->| NUMBER OF SOLID DISCHARGES GIVEN IN PARAMETER
33 !| | | FILE
34 !| NUMLIQ |-->| LIQUID BOUNDARY NUMBER OF BOUNDARY POINTS
35 !| Q |-->| PRESCRIBED VALUE OF DISCHARGE
36 !| Q2BOR |<--| PRESCRIBED SOLID DISCHARGE
37 !| RATIO |<--| RATIO, QBOR WILL BE RATIO*Q2BOR
38 !| WORK1 |<->| WORK BIEF_OBJ STRUCTURE
39 !| QBOR |<->| THE RESULTING DISCHARGE IN M3/S
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !
42  USE bief
43 !
45  USE interface_parallel, ONLY : p_dsum
46  IMPLICIT NONE
47 !
48 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49 !
50  INTEGER, INTENT(IN) :: NPTFR,IFRLIQ,NSOLDIS
51  INTEGER, INTENT(IN) :: NUMLIQ(nptfr)
52  DOUBLE PRECISION, INTENT(IN) :: MASK(nptfr),Q
53  TYPE(bief_mesh), INTENT(INOUT) :: MESH
54  TYPE(bief_obj), INTENT(INOUT) :: WORK1,QBOR
55  TYPE(bief_obj), INTENT(IN) :: Q2BOR
56 !
57 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
58 !
59  INTEGER K,IELM
60 !
61  DOUBLE PRECISION Q1
62 !
63  INTRINSIC abs
64 !
65 !=======================================================================
66 ! COMPUTES FLUX
67 !=======================================================================
68 !
69 ! IN THE FOLLOWING LOOP ONE RESTRICTS THE MASK OF DIRICHLETS SEGMENTS
70 ! TO THOSE OF THE LIQUID BOUNDARY NUMBER IFRLIQ. AS NUMLIQ IS
71 ! DEFINED AT NODES, ONE RISKS AN ERROR FOR THE SEGMENT FOLLOWING
72 ! THE LAST NODE ON THE BOUNDARY. IN FACT THIS SEGMENT WILL BE SOLID
73 ! AND WILL HAVE A MASK ALREADY SET TO ZERO.
74 !
75  DO k=1,nptfr
76  IF(numliq(k).EQ.ifrliq) THEN
77  work1%R(k)=mask(k)
78  ELSE
79  work1%R(k)=0.d0
80  ENDIF
81  ENDDO
82 !
83 ! Q2BOR IS INTEGRATED ALONG THE BOUNDARY
84 !
85  ielm=11
86  CALL vector(qbor,'=','MASVEC ',ielbor(ielm,1),
87 ! USED VOID VOID VOID VOID VOID
88  & 1.d0,q2bor,q2bor,q2bor,q2bor,q2bor,q2bor,
89  & mesh,.true.,work1)
90 !
91 !=======================================================================
92 ! FINAL QBOR IF Q2BOR ONLY A PROFILE
93 !=======================================================================
94 !
95  IF(nsoldis.GE.ifrliq) THEN
96 !
97 ! A VALUE OF DISCHARGE HAS BEEN GIVEN IN THE PARAMETER FILE
98 ! FOR THIS BOUNDARY. Q2BOR IS CONSIDERED AS ONLY A PROFILE
99 !
100 ! FOR THE USER: POSITIVE DISCHARGE = ENTERING
101  q1 = bief_sum(qbor)
102  IF(ncsize.GT.1) q1 = p_dsum(q1)
103 !
104  IF(abs(q1).LT.1.d-10) THEN
105 ! ZERO FLUX: WARNING MESSAGE
106  IF(abs(q).GT.1.d-10) THEN
107  WRITE(lu,31) ifrliq
108 31 FORMAT(1x,'DISIMP : PROBLEM ON BOUNDARY NUMBER ',1i6,/,1x,
109  & ' GIVE A SOLID DISCHARGE PROFILE ',/,1x,
110  & ' IN THE BOUNDARY CONDITIONS FILE')
111  CALL plante(1)
112  stop
113  ELSE
114  q1 = 1.d0
115  ENDIF
116  ENDIF
117 !
118  DO k=1,nptfr
119  IF(numliq(k).EQ.ifrliq) THEN
120  qbor%R(k) = qbor%R(k) * q / q1
121  ENDIF
122  ENDDO
123 !
124  ENDIF
125 !
126 !-----------------------------------------------------------------------
127 !
128  RETURN
129  END
integer function ielbor(IELM, I)
Definition: ielbor.f:7
subroutine disimp(Q, Q2BOR, NUMLIQ, IFRLIQ, NSOLDIS, WORK1, QBOR, NPTFR, MASK, MESH)
Definition: disimp.f:7
double precision function p_dsum(MYPART)
Definition: p_dsum.F:7
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
Definition: vector.f:7
double precision function bief_sum(X)
Definition: bief_sum.f:7
double precision function q(I)
Definition: q.f:7
Definition: bief.f:3