The TELEMAC-MASCARET system  trunk
diffin.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE diffin
3 ! *****************
4 !
5  &(masktr,limtra,litbor,clt,u,v,xnebor,ynebor,nbor,
6  & nptfr,kent,ksort,klog,kneu,kdir,kddl,
7  & iconv,nelbor,npoin,msk,maskel,
8  & nfrliq,thomfr,frtype,tn,tbor,numliq,iklbor,neleb,nelebx)
9 !
10 !***********************************************************************
11 ! BIEF V7P0 21/08/2010
12 !***********************************************************************
13 !
14 !brief INITIALISES THE BOUNDARY CONDITIONS FOR TRACER DIFFUSION.
15 !
16 !history J-M HERVOUET (LNH)
17 !+ 25/06/2008
18 !+ V5P9
19 !+ MOVED FROM TELEMAC-2D TO ALLOW CALL BY SISYPHE
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (LNH)
34 !+ 28/046/2011
35 !+ V6P1
36 !+ LIQUID BOUNDARIES MASK ADDED
37 !+ CALL PARCOM_BORD DELETED (NOT USEFUL, WE DEAL HERE WITH SEGMENTS
38 !+ WHICH BELONG TO A SINGLE PROCESSOR)
39 !
40 !history J-M HERVOUET (EDF LAB, LNHE)
41 !+ 13/03/2014
42 !+ V7P0
43 !+ Now written to enable different numbering of boundary points and
44 !+ boundary segments.
45 !
46 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
47 !| CLT |<--| A MODIFIED COPY OF LITBOR.
48 !| FRTYPE |-->| TYPE OF BOUNDARY CONDITIONS
49 !| | | 1: NORMAL 2: THOMPSON
50 !| ICONV |-->| OPTION FOR ADVECTION : 1) CHARACTERISTICS
51 !| | | 2) SUPG, ETC.
52 !| IKLBOR |-->| CONNECTIVITY TABLE FOR BOUNDARY ELEMENTS
53 !| KDDL |-->| CONVENTION FOR DEGREE OF FREEDOM
54 !| KDIR |-->| CONVENTION FOR DIRICHLET POINT
55 !| KENT |-->| CONVENTION FOR LIQUID INPUT WITH PRESCRIBED VALUE
56 !| KLOG |-->| CONVENTION FOR SOLID BOUNDARY
57 !| KNEU |-->| CONVENTION FOR NEUMANN CONDITION
58 !| KSORT |-->| CONVENTION FOR LIQUID OUTPUT WITH FREE VALUE
59 !| LIMTRA |<--| TECHNICAL BOUNDARY CONDITIONS FOR TRACERS
60 !| LITBOR |-->| PHYSICAL BOUNDARY CONDITIONS FOR TRACERS
61 !| MASKEL |-->| MASKING OF ELEMENTS
62 !| | | =1. : NORMAL =0. : MASKED ELEMENT
63 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
64 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
65 !| NELBOR |-->| FOR THE KTH BOUNDARY EDGE, GIVES THE CORRESPONDING
66 !| | | ELEMENT.
67 !| NELEB |-->| NUMBER OF BOUNDARY ELEMENTS
68 !| NELEBX |-->| MAXIMUM NUMBER OF BOUNDARY ELEMENTS
69 !| NFRLIQ |-->| NUMBER OF LIQUID BOUNDARIES
70 !| NPOIN |-->| NUMBER OF POINTS
71 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
72 !| TBOR |-->| DIRICHLET BOUNDARY CONDITIONS ON TRACERS
73 !| THOMFR |-->| IF YES, THERE ARE THOMPSON BOUNDARY CONDITIONS
74 !| TN |-->| TRACERS AT OLD TIME STEP
75 !| U |-->| X-COMPONENT OF VELOCITY
76 !| V |-->| Y-COMPONENT OF VELOCITY
77 !| XNEBOR |-->| X-COMPONENT OF EXTERNAL NORMAL BOUNDARY VECTOR
78 !| YNEBOR |-->| Y-COMPONENT OF EXTERNAL NORMAL BOUNDARY VECTOR
79 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
80 !
81  USE bief, ex_diffin => diffin
82 !
84  IMPLICIT NONE
85 !
86 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
87 !
88  TYPE(bief_obj), INTENT(INOUT) :: MASKTR,TBOR
89  TYPE(bief_obj), INTENT(IN) :: TN
90  INTEGER, INTENT(IN) :: NELEB,NELEBX
91  INTEGER, INTENT(IN) :: NPOIN,NPTFR,ICONV,NFRLIQ
92  INTEGER, INTENT(IN) :: LITBOR(nptfr),NBOR(nptfr)
93  INTEGER, INTENT(INOUT) :: LIMTRA(nptfr),CLT(nptfr)
94  INTEGER, INTENT(IN) :: IKLBOR(nelebx,2)
95  INTEGER, INTENT(IN) :: KENT,KSORT,KLOG,KDIR,KDDL,KNEU
96  INTEGER, INTENT(IN) :: NELBOR(nelebx),NUMLIQ(*)
97  INTEGER, INTENT(IN) :: FRTYPE(nfrliq)
98 !
99  DOUBLE PRECISION, INTENT(IN) :: U(npoin), V(npoin)
100  DOUBLE PRECISION, INTENT(IN) :: XNEBOR(nptfr), YNEBOR(nptfr)
101  DOUBLE PRECISION, INTENT(IN) :: MASKEL(*)
102 !
103  LOGICAL, INTENT(IN) :: MSK,THOMFR
104 !
105 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
106 !
107  INTEGER K,K1,K2,IELEM,DIR,DDL,NEU,OND,NONEU,IFRLIQ,IELEB
108  DOUBLE PRECISION USCALN
109 !
110 !-----------------------------------------------------------------------
111 !
112  dir=1
113  ddl=2
114  neu=3
115  ond=4
116  noneu=5
117 !
118 ! CLT CONTAINS ARRAY LITBOR, POSSIBLY MODIFIED ACCORDING TO THE SIGN
119 ! OF U.N ON THE LIQUID BOUNDARIES, WHERE N IS THE OUTGOING NORMAL.
120 !
121  DO k=1,nptfr
122  clt(k) = litbor(k)
123 ! LOCATES THE LIQUID BOUNDARIES:
124  IF(clt(k).EQ.kent) THEN
125  uscaln = u(nbor(k))*xnebor(k) + v(nbor(k))*ynebor(k)
126 ! OUTGOING VELOCITY, FREE TRACER
127  IF(uscaln.GT.0.d0) clt(k) = ksort
128  ELSEIF(clt(k).EQ.ksort) THEN
129  uscaln = u(nbor(k))*xnebor(k) + v(nbor(k))*ynebor(k)
130 !
131 ! INCOMING VELOCITY, TRACER IMPOSED AT THE LAST VALUE
132  IF(uscaln.LT.0.d0) THEN
133  tbor%R(k)=tn%R(nbor(k))
134  clt(k) = kent
135  ENDIF
136  ENDIF
137  ENDDO
138 !
139 ! BUILDS ARRAY MASKTR ACCORDING TO CLT
140 !
141 ! MASKTR EQUALS 1 FOR A SEGMENT OF TYPE NEUMANN, 0 OTHERWISE
142 !
143 ! A SEGMENT IS OF TYPE NEUMANN IF AT LEAST ONE OF ITS POINTS
144 ! IS SPECIFIED AS NEUMANN BY THE USER.
145 !
146 !
147 ! INITIALISES THE MASKS TO 0
148 !
149  CALL os('X=0 ',x=masktr)
150  DO ieleb = 1 , neleb
151  k1=iklbor(ieleb,1)
152  k2=iklbor(ieleb,2)
153  IF(clt(k1).EQ.klog.OR.clt(k2).EQ.klog) THEN
154 ! SEGMENTS OF TYPE NEUMANN
155  masktr%ADR(neu)%P%R(ieleb)=1.d0
156  ELSEIF(clt(k1).EQ.kent.AND.clt(k2).EQ.ksort) THEN
157 ! SEGMENTS OF TYPE EXIT
158  masktr%ADR(ddl)%P%R(ieleb)=1.d0
159  ELSEIF(clt(k1).EQ.ksort.OR.clt(k2).EQ.ksort) THEN
160  masktr%ADR(ddl)%P%R(ieleb)=1.d0
161  ELSEIF(clt(k1).EQ.ksort.AND.clt(k2).EQ.kent) THEN
162 ! SEGMENTS OF TYPE EXIT
163  masktr%ADR(ddl)%P%R(ieleb)=1.d0
164  ELSEIF(clt(k1).EQ.kent.OR.clt(k2).EQ.kent) THEN
165  masktr%ADR(dir)%P%R(ieleb)=1.d0
166  ELSE
167  WRITE(lu,101)
168 101 FORMAT(1x,'DIFFIN : UNEXPECTED CASE')
169  CALL plante(1)
170  stop
171  ENDIF
172  ENDDO
173 !
174 ! POSSIBLE MASKING
175 !
176  IF(msk) THEN
177  DO ieleb = 1 , neleb
178  k1=iklbor(ieleb,1)
179  ielem=nelbor(ieleb)
180  masktr%ADR(dir)%P%R(ieleb) = masktr%ADR(dir)%P%R(ieleb) *
181  & maskel(ielem)
182  masktr%ADR(ddl)%P%R(ieleb) = masktr%ADR(ddl)%P%R(ieleb) *
183  & maskel(ielem)
184  masktr%ADR(neu)%P%R(ieleb) = masktr%ADR(neu)%P%R(ieleb) *
185  & maskel(ielem)
186  masktr%ADR(ond)%P%R(ieleb) = masktr%ADR(ond)%P%R(ieleb) *
187  & maskel(ielem)
188  ENDDO
189  ENDIF
190 !
191 !-----------------------------------------------------------------------
192 !
193 ! LIQUID BOUNDARIES MASK
194 !
195  DO ieleb=1,neleb
196  masktr%ADR(noneu)%P%R(ieleb)=1.d0-masktr%ADR(neu)%P%R(ieleb)
197  ENDDO
198 !
199 !-----------------------------------------------------------------------
200 !
201 ! FROM PHYSICAL TO TECHNICAL CONDITIONS
202 !
203  DO k=1,nptfr
204 !
205  IF(clt(k).EQ.kent ) THEN
206 !
207 ! ENTERING THE DOMAIN: IMPOSED TRACER
208 !
209  limtra(k) = kdir
210 !
211  ELSEIF(clt(k).EQ.ksort) THEN
212 !
213 ! LEAVING THE DOMAIN : FREE IF SUPG OR PSI SCHEME,
214 ! RESULT OF IMPOSED ADVECTION OTHERWISE
215 !
216  IF(iconv.EQ.1) THEN
217 ! SEE DIFFCL : TTILD PUT IN TBOR
218  limtra(k) = kdir
219  ELSE
220  limtra(k) = kddl
221  ENDIF
222 !
223  ELSEIF(clt(k).EQ.klog ) THEN
224 !
225 ! WALL: NEUMANN CONDITIONS (IT'S NOT ACTUALLY USED)
226 !
227  limtra(k) = kneu
228 !
229  ELSE
230 !
231 ! ERROR, UNKNOWN VALUE OF LITBOR
232 !
233  WRITE(lu,12) k,litbor(k)
234 12 FORMAT(1x,'DIFFIN: POINT ',1i6,' LITBOR= ',1i6,' ?????')
235  CALL plante(1)
236  stop
237 !
238  ENDIF
239 !
240  ENDDO
241 !
242 !----------------------------------------------------------------------
243 !
244 ! POST-TREATMENT FOR LIQUID BOUNDARY CONDITIONS (THOMPSON METHOD)
245 ! THE TRACER BOUNDARY CONDITION THEN IS OF TYPE DIRICHLET
246 !
247  IF(nfrliq.GT.0.AND.thomfr) THEN
248 !
249  DO k= 1 , nptfr
250  ifrliq=numliq(k)
251  IF(ifrliq.GT.0) THEN
252  IF(frtype(ifrliq).EQ.2) limtra(k) = kdir
253  ENDIF
254  ENDDO
255 !
256  ENDIF
257 !
258 !-----------------------------------------------------------------------
259 !
260  RETURN
261  END
subroutine diffin(MASKTR, LIMTRA, LITBOR, CLT, U, V, XNEBOR, YNEBOR, NBOR, NPTFR, KENT, KSORT, KLOG, KNEU, KDIR, KDDL, ICONV, NELBOR, NPOIN, MSK, MASKEL, NFRLIQ, THOMFR, FRTYPE, TN, TBOR, NUMLIQ, IKLBOR, NELEB, NELEBX)
Definition: diffin.f:10
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
Definition: bief.f:3