The TELEMAC-MASCARET system  trunk
walldist.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE walldist
3 ! *******************
4  &(w_dist,t11,t12,t13,t14,t15,flbor,tb,am1,am2,s,
5  & liubor,ielmnu,nptfr,mesh)
6 
7 !***********************************************************************
8 ! TELEMAC2D V7P3 11/2016
9 !***********************************************************************
10 !
11 !brief COMPUTES THE DISTANCE TO THE CLOSEST WALL FOR
12 ! SPALART ALLMARAS MODEL-2D COMPUTATION.
13 !
14 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 !| AM1,AM2 |<--| WORKING MATRICES
17 !| LIUBOR |-->| BOUNDARY CONDITION ON VELOCITIES
18 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
19 !| S |<--| VOID STRUCTURE
20 !| T12..FLBOR |<--| WORKING ARRAYS
21 !| WDIST |<--| DISTANCE FROM THE CLOSEST WALL
22 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 !***********************************************************************
24  USE bief, ex_walldist => walldist
29 !
30  IMPLICIT NONE
31  INTRINSIC sqrt
32 !
33 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 !
35  INTEGER , INTENT(IN ) :: IELMNU,NPTFR
36  TYPE(bief_obj) , INTENT(IN ) :: LIUBOR
37  TYPE(bief_obj) , INTENT(INOUT) :: W_DIST
38  TYPE(bief_obj) , INTENT(INOUT) :: T11,T12,T13,T14,T15,FLBOR,TB
39  TYPE(bief_obj) , INTENT(INOUT) :: AM1,AM2,S
40  TYPE(bief_mesh), INTENT(INOUT) :: MESH
41 !
42 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 !
44  LOGICAL :: SOLVER_INFO
45  INTEGER :: IPTFR,IP,IELWD,IERR,DEBUG
46  DOUBLE PRECISION :: GRAD_D
47  INTEGER, ALLOCATABLE :: LIMDIST(:)
48  TYPE(slvcfg) :: SLVDIST
49 !
50 !-----------------------------------------------------------------------
51  ALLOCATE(limdist(nptfr))
52  ierr = 0
53  debug= 0
54 ! SETUP LINEAR SOLVER CONFIGURATION STRUCTURE
55  slvdist%SLV = 1
56  slvdist%PRECON = 2
57  slvdist%KRYLOV = 0
58  slvdist%NITMAX = 1000
59  slvdist%EPS = 1.d-8
60  IF(debug.GT.0) THEN
61  solver_info = .true.
62  ELSE
63  solver_info = .false.
64  ENDIF
65 !
66  ielwd = ielmnu ! ELEMENTS USED FOR S-A
67  WRITE(lu,*) 'TELEMAC2D: 31 '
68 !
69  DO ip=1,w_dist%DIM1
70  t11%R(ip) = 1.d0 ! VISC
71  t12%R(ip) = 1.d0 ! RHS SOURCE TERM
72  t13%R(ip) = 0.d0 ! WALL DIST
73  t14%R(ip) = 0.d0 ! WORK
74  t15%R(ip) = 0.d0 ! BCS
75  ENDDO
76 !
77  DO iptfr=1,nptfr
78 !
79  IF(liubor%I(iptfr).EQ.klog.OR.liubor%I(iptfr).EQ.kadh) THEN
80  limdist(iptfr) = kdir
81  flbor%R(iptfr) = 0.d0
82  ELSE
83  limdist(iptfr) = kneu
84  ENDIF
85 !
86  ENDDO
87 !
88 ! CREATES THE MASS MATRIX (AM1)
89 !
90  CALL matrix(am1,'M=N ','MATMAS ',ielwd,ielwd,
91  & 1.d0,s,s,s,s,s,s,mesh,.false.,s)
92 !
93 ! CREATES THE DIFFUSION MATRIX (AM2)
94 !
95  CALL matrix(am2,'M=N ','MATDIF ',ielwd,ielwd,
96  & 1.d0,s,s,s,t11,t11,t11,mesh,.false.,s)
97 !
98 ! PREPARES RHS
99  CALL matvec('X=AY ',t13,am1,t12,1.d0,mesh)
100 !
101 ! IMPOSES DIRICHLET CONDITIONS
102 !
103 ! BE AWARE: T1 AND T2 ARE ERASED BY DIRICH VIA TB
104  IF(nptfr.GT.0) THEN
105  CALL dirich(t14,am2,t13,flbor,limdist,
106  & tb,mesh,kdir,.false.,s)
107  ENDIF
108 !
109 ! SOLVES THE LINEAR SYSTEM
110 !
111 ! BE AWARE: T1 -> T7 ARE ERASED BY SOLVE VIA TB
112  IF (debug.GT.0) WRITE(lu,*) 'SOLVING WALL DISTANCE'
113  CALL solve(t14,am2,t13,tb,slvdist,solver_info,mesh,am2)
114 !
115 ! COMPUTES VERTEX GRADIENT
116  CALL vector(t11,'=','GRADF X',ielwd,
117  & 1.d0,t14,s,s,s,s,s,mesh,.false.,s,asspar=.true.)
118  CALL vector(t12,'=','GRADF Y',ielwd,
119  & 1.d0,t14,s,s,s,s,s,mesh,.false.,s,asspar=.true.)
120  CALL vector(t15 , '=' , 'MASBAS ' , ielwd ,
121  & 1.d0,s,s,s,s,s,s,
122  & mesh,.false.,s,asspar=.true.)
123 ! NORMALIZES GRADIENT
124  CALL os('X=Y/Z ', x=t11, y=t11, z=t15)
125  CALL os('X=Y/Z ', x=t12, y=t12, z=t15)
126 !
127 ! CALCULATES THE WALL DISTANCE
128 !
129  DO ip=1,w_dist%DIM1
130  grad_d = t11%R(ip)**2.d0 + t12%R(ip)**2.d0
131  IF(grad_d + 2.d0*t14%R(ip).GT.0.d0.AND.grad_d.GT.0) THEN
132  w_dist%R(ip) = -sqrt(grad_d) + sqrt(grad_d + 2.d0*t14%R(ip))
133  ELSE
134  w_dist%R(ip) = 0.d0
135  ierr = ierr + 1
136  ENDIF
137  ENDDO
138  IF(ncsize.GT.0)THEN
139  ierr = p_sum(ierr)
140  ENDIF
141 !
142  IF(ierr.NE.0)THEN
143  WRITE(lu,*) 'WALLDIST (BIEF): WARNING WITH THE WALL DISTANCE '
144  WRITE(lu,*) ' COMPUTATION. NEGATIVE DETERMINANT '
145  WRITE(lu,*) ' ON ', ierr, 'NODES'
146  WRITE(lu,*) ' (PROBABLY OVER CONSTRAINT NODES)'
147  ENDIF
148  DEALLOCATE(limdist)
149 !
150 !-----------------------------------------------------------------------
151 !
152  END SUBROUTINE
integer, parameter kadh
subroutine solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
Definition: solve.f:7
subroutine walldist(W_DIST, T11, T12, T13, T14, T15, FLBOR, TB, AM1, AM2, S, LIUBOR, IELMNU, NPTFR, MESH)
Definition: walldist.f:7
integer, parameter kneu
integer, parameter kdir
subroutine matrix(M, OP, FORMUL, IELM1, IELM2, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL)
Definition: matrix.f:7
subroutine dirich(F, S, SM, FBOR, LIMDIR, WORK, MESH, KDIR, MSK, MASKPT)
Definition: dirich.f:7
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
Definition: vector.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine matvec(OP, X, A, Y, C, MESH, LEGO)
Definition: matvec.f:7
integer, parameter klog
Definition: bief.f:3