OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
ale51_antidiff3.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| ale51_antidiff3 ../engine/source/ale/ale51/ale51_antidiff3.F
25!||--- called by ------------------------------------------------------
26!|| afluxt ../engine/source/ale/ale51/afluxt.F
27!||--- uses -----------------------------------------------------
28!|| ale_connectivity_mod ../common_source/modules/ale/ale_connectivity_mod.F
29!|| ale_mod ../common_source/modules/ale/ale_mod.F
30!|| i22bufbric_mod ../common_source/modules/interfaces/cut-cell-search_mod.F
31!|| i22tri_mod ../common_source/modules/interfaces/cut-cell-search_mod.F
32!|| segvar_mod ../engine/share/modules/segvar_mod.F
33!||====================================================================
34 SUBROUTINE ale51_antidiff3(FLUX , ALE_CONNECT , ALPH, VOL , IXS,
35 . FLUX_VOIS, N4_VOIS, ITAB, NV46, ITRIMAT,
36 . SEGVAR)
37C-----------------------------------------------
38C D e c r i p t i o n
39C-----------------------------------------------
40C
41C ** Warning, this formulation (for volume fractions) using \eta_3 parameter from /UPWIND option is not conservative.
42C It was marked as obsolete. Forget it and use MUSCL instead
43C
44C-----------------------------------------------
45C M o d u l e s
46C-----------------------------------------------
48 USE i22tri_mod
49 USE segvar_mod
51 USE ale_mod
52C-----------------------------------------------
53C I m p l i c i t T y p e s
54C-----------------------------------------------
55#include "implicit_f.inc"
56C-----------------------------------------------
57C G l o b a l P a r a m e t e r s
58C-----------------------------------------------
59#include "mvsiz_p.inc"
60C-----------------------------------------------
61C C o m m o n B l o c k s
62C-----------------------------------------------
63#include "spmd_c.inc"
64#include "com01_c.inc"
65#include "com04_c.inc"
66#include "com08_c.inc"
67#include "vect01_c.inc"
68#include "inter22.inc"
69C-----------------------------------------------
70C D u m m y A r g u m e n t s
71C-----------------------------------------------
72 INTEGER IXS(NIXS,NUMELS),N4_VOIS(NUMELS+NSVOIS,8),ITAB(NUMNOD),NV46,ITRIMAT
73 my_real FLUX(NV46,*),ALPH(*),VOL(*),FLUX_VOIS(NUMELS+NSVOIS,NV46)
74 TYPE(t_segvar),INTENT(IN) :: SEGVAR
75 TYPE(t_ale_connectivity), INTENT(IN) :: ALE_CONNECT
76C-----------------------------------------------
77C L o c a l V a r i a b l e s
78C-----------------------------------------------
79 INTEGER I,J,II,K,JV(NV46),KV(NV46),IFV,NIN, ib, ie,ISKIP(MVSIZ),IEV,IAD2, IAD3
80 my_real VOL0,AV0,UAV0,ALPHI,UALPHI,AAA,FF(NV46),UDT,PHI0,facev
81 my_real :: debug_tmp
82 LOGICAL :: debug_outp
83C-----------------------------------------------
84C S o u r c e L i n e s
85C-----------------------------------------------
86
87 !----------------------------------------------
88 ! WET SURFACE
89 !-----------------------------------------------
90 IF(dt1 > zero)THEN
91 udt = one/dt1
92 ELSE
93 udt = zero
94 ENDIF
95
96 !INTER22
97 nin = 1
98
99 !INTERFACE 22 ONLY - OUTPUT---------------!
100 debug_outp = .false.
101 if(int22>0)then
102 if(ibug22_antidiff /= 0)then
103 debug_outp = .false.
104 if(ibug22_antidiff > 0)then
105 do i=lft,llt
106 ie=i+nft
107 if(ixs(11,ie) == ibug22_antidiff)then
108 debug_outp=.true.
109 exit
110 endif
111 enddo
112 elseif(ibug22_antidiff==-1)then
113 debug_outp = .true.
114 endif
115 if(((itrimat /= ibug22_itrimat).and.(ibug22_itrimat /= -1)))debug_outp=.false.
116 endif
117 if(debug_outp)then
118 print *, " |----ale51_antidiff3.F-----|"
119 print *, " | THREAD INFORMATION |"
120 print *, " |--------------------------|"
121 print *, " NCYCLE =", ncycle
122 print *, " ITRIMAT =", itrimat
123 endif
124 endif
125
126 !INTER22 : skip bricks in cut cell buffer
127 nin = 1
128 iskip(1:mvsiz) = zero
129 IF(int22>0)THEN
130 DO i=lft,llt
131 ib=iiad22(nin,i+nft)
132 IF(ib /= 0)iskip(i)=1
133 ENDDO
134 ENDIF
135
136 DO i=lft,llt
137 IF(iskip(i)==1)cycle !unplug for cut cells.
138 ii = i + nft
139 iad2 = ale_connect%ee_connect%iad_connect(ii)
140 vol0 = vol(i)*udt
141 av0 = alph(ii) * vol0
142 uav0 = vol0 - av0
143 alphi = zero
144 ualphi = zero
145 phi0 = zero
146 !-----------------------------------------------
147 ! face number from adjacent elem
148 ! & total volume flux (outgoing)
149 !-----------------------------------------------
150 DO k=1,nv46
151 IF(flux(k,ii) > zero)THEN
152 jv(k) = ale_connect%ee_connect%connected(iad2 + k - 1)
153 kv(k) = k
154 IF(jv(k) == 0)THEN
155 jv(k) = ii
156 ff(k) = alph(ii)*flux(k,ii)
157 ELSEIF(jv(k) < 0)THEN
158 !case <0 : ebcs (-IVOIS is then segment identifier)
159 ff(k) = segvar%PHASE_ALPHA(itrimat,-jv(k)) * flux(k,ii)
160 ELSEIF(jv(k) <= numels)THEN
161 iad3 = ale_connect%ee_connect%iad_connect(jv(k))
162 DO j=1,nv46
163 IF(ale_connect%ee_connect%connected(iad3 + j - 1) == ii) kv(k) = j
164 ENDDO
165 ff(k) = alph(jv(k))*flux(k,ii)
166 ELSE
167 !spmd
168 ff(k) = alph(jv(k))*flux(k,ii)
169 ENDIF
170 !outgoing volume flux (estimation)
171 alphi = alphi + ff(k)
172 !outgoing volume flux (initial)
173 phi0 = phi0 + flux(k,ii)
174 ENDIF
175 ENDDO
176 !outgoing rest (estimation)
177 ualphi = phi0 - alphi
178 !-----------------------------------------------
179 ! outgoing volume flux (by face)
180 !-----------------------------------------------
181 IF(alphi > av0.AND.av0 > zero)THEN
182 !-----------------------------------------------
183 ! outgoing volume flux > volume
184 !-----------------------------------------------
185 aaa = av0 / alphi
186 DO k=1,nv46
187 IF(flux(k,ii) > zero)THEN
188 ff(k) = ff(k) * aaa
189 ENDIF
190 ENDDO
191 ELSEIF(ualphi > uav0.AND.uav0 > zero)THEN
192 !-----------------------------------------------
193 ! outgoing rest > available
194 !-----------------------------------------------
195 aaa = uav0/ualphi
196 DO k=1,nv46
197 IF(flux(k,ii) > zero)THEN
198 ff(k) = flux(k,ii) + (ff(k)-flux(k,ii))*aaa
199 ENDIF
200 ENDDO
201 ENDIF
202 !-----------------------------------------------
203 ! outgoing volume fluxes
204 !-----------------------------------------------
205 DO k=1,nv46
206 IF(flux(k,ii) > zero)THEN
207 ff(k) = half * ( ff(k)*(one-ale%UPWIND%UPWSM)+alph(ii)*flux(k,ii)*(one+ale%UPWIND%UPWSM) )
208
209 !INTERFACE 22 ONLY------------------------! (OBSOLETE)
210 if(int22>0)then
211 if(debug_outp)then
212 if(ibug22_antidiff == ixs(11,i+nft) .OR. ibug22_antidiff == -1)then
213 print *, " brique =", ixs(11,i+nft)
214 print *, " FACE =", k
215 write (*,fmt='(A,6E26.14)')" WAS Flux(J) =", flux(k,ii)
216 write (*,fmt='(A,6E26.14)')" IS Flux(J) =", ff(k)
217 print *, " ------------------------"
218 endif
219 endif
220 endif
221 !-----------------------------------------!
222
223
224 flux(k,ii) = ff(k)
225
226 IF(jv(k) < 0)THEN
227 ! do nothing
228 ELSEIF(jv(k) <= numels)THEN
229 IF(int22 == 0)THEN
230 debug_tmp = flux(kv(k),jv(k))
231 flux(kv(k),jv(k)) = -flux(k,ii)
232 ELSE
233 IF(iiad22(nin,jv(k))==0)THEN
234 !NOT IN CUT CELL BUFFER(INTER22)
235 debug_tmp = flux(kv(k),jv(k))
236 flux(kv(k),jv(k)) = -flux(k,ii)
237 ELSE
238 !IN CUT CELL BUFFER (INTER22)
239 nin = 1
240 ifv = kv(k)
241 !(icellv,iadjv) = (1,1) since it is supposed to be an uncut cell from cut cell buffer (TZINF ensures this)
242 debug_tmp = brick_list(nin,iiad22(nin,jv(k)))%POLY(1)%FACE(ifv)%Adjacent_UpwFLUX(1)
243 brick_list(nin,iiad22(nin,jv(k)))%POLY(1)%FACE(ifv)%Adjacent_UpwFLUX(1) = -flux(k,ii)
244 ENDIF
245 ENDIF
246 ELSE
247 flux_vois(ii,k) = flux(k,ii) !Sign is updated in AFLUX3TA after calling SPMD_I8VOIS
248 n4_vois(ii,1) = itab(ixs(2,ii))
249 n4_vois(ii,2) = itab(ixs(3,ii))
250 n4_vois(ii,3) = itab(ixs(4,ii))
251 n4_vois(ii,4) = itab(ixs(5,ii))
252 n4_vois(ii,5) = itab(ixs(6,ii))
253 n4_vois(ii,6) = itab(ixs(7,ii))
254 n4_vois(ii,7) = itab(ixs(8,ii))
255 n4_vois(ii,8) = itab(ixs(9,ii))
256 ENDIF
257
258 !INTERFACE 22 ONLY------------------------!
259 if(int22>0)then
260 if(debug_outp)then
261 if(ibug22_antidiff == ixs(11,i+nft) .OR. ibug22_antidiff == -1)then
262 iev = jv(k)
263 facev=kv(k)
264 print *, " => Setting adjacent flux consequently :"
265 print *, " brique.V=", ixs(11,iev)
266 print *, " FACE.V =", ifv
267 write (*,fmt='(A,6E26.14)')
268 . " WAS Flux(J) =", debug_tmp
269 write (*,fmt='(A,6E26.14)')
270 . " IS Flux(J) =", -flux(k,ii)
271 print *, " ---"
272 endif
273 endif
274 endif
275 !-----------------------------------------!
276
277 ENDIF
278 ENDDO
279C-----------------------------------------------
280C incoming volume flux from EBCS
281C-----------------------------------------------
282 IF(nsegflu > 0)THEN
283 iad2 = ale_connect%ee_connect%iad_connect(ii)
284 DO k=1,nv46
285 IF(flux(k,ii) < zero .AND. ale_connect%ee_connect%connected(iad2 + k - 1) < 0)THEN
286 flux(k,ii) = segvar%PHASE_ALPHA(itrimat,-ale_connect%ee_connect%connected(iad2 + k - 1))*flux(k,ii)
287 ENDIF
288 ENDDO
289 ENDIF
290
291C-------------
292 enddo!next I
293C-----------------------------------------------
294 RETURN
295 END
296C
subroutine ale51_antidiff3(flux, ale_connect, alph, vol, ixs, flux_vois, n4_vois, itab, nv46, itrimat, segvar)
type(ale_) ale
Definition ale_mod.F:249
type(brick_entity), dimension(:,:), allocatable, target brick_list