OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
multi_evolve_global.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!|| multi_evolve_global ../engine/source/multifluid/multi_evolve_global.F
25!||--- called by ------------------------------------------------------
26!|| multi_timeevolution ../engine/source/multifluid/multi_timeevolution.F
27!||--- uses -----------------------------------------------------
28!|| elbufdef_mod ../common_source/modules/mat_elem/elbufdef_mod.F90
29!|| element_mod ../common_source/modules/elements/element_mod.F90
30!|| initbuf_mod ../engine/share/resol/initbuf.F
31!|| multi_fvm_mod ../common_source/modules/ale/multi_fvm_mod.F90
32!||====================================================================
33 SUBROUTINE multi_evolve_global(TIMESTEP, NG, ELBUF_TAB,
34 . IPARG, ITASK, IXS, IXQ, IXTG, MULTI_FVM, GRAVITY, WFEXT)
35C-----------------------------------------------
36C M o d u l e s
37C-----------------------------------------------
38 USE initbuf_mod
39 USE elbufdef_mod
40 USE multi_fvm_mod
41 use element_mod , only : nixs,nixq,nixtg
42C-----------------------------------------------
43C I m p l i c i t T y p e s
44C-----------------------------------------------
45#include "implicit_f.inc"
46C-----------------------------------------------
47C C o m m o n B l o c k s
48C-----------------------------------------------
49#include "com01_c.inc"
50#include "com06_c.inc"
51#include "param_c.inc"
52C-----------------------------------------------
53C D u m m y A r g u m e n t s
54C-----------------------------------------------
55 my_real, INTENT(IN) :: timestep
56 INTEGER, INTENT(IN) :: NG
57 TYPE(elbuf_struct_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
58 INTEGER, INTENT(IN) :: IPARG(NPARG, *)
59 INTEGER, INTENT(IN) :: ITASK ! SMP TASK
60 INTEGER, INTENT(IN), TARGET :: IXS(NIXS, *), IXQ(NIXQ, *), IXTG(NIXTG, *)
61 TYPE(multi_fvm_struct), INTENT(INOUT) :: MULTI_FVM
62 my_real, INTENT(IN) :: gravity(4, *)
63 DOUBLE PRECISION,INTENT(INOUT) :: WFEXT
64C-----------------------------------------------
65C L o c a l V a r i a b l e s
66C-----------------------------------------------
67 TYPE(g_bufel_), POINTER :: GBUF
68 INTEGER :: II, I, J, ITY, NEL, NFT, ISOLNOD
69 INTEGER :: NODEID, NVERTEX
70 my_real :: vel2, vol, sumflux(5)
71 my_real :: vii(5), gravii(3), pres, vx, vy, vz, wext
72 INTEGER :: NB_FACE, NB_NODE, NODE_LIST(8)
73 INTEGER, DIMENSION(:, :), POINTER :: IX
74 DOUBLE PRECISION :: WFEXTT
75C-----------------------------------------------
76C B e g i n n i n g o f s u b r o u t i n e
77C-----------------------------------------------
78 gbuf =>elbuf_tab(ng)%GBUF
79 nel = iparg(2, ng)
80 nft = iparg(3, ng)
81 ity = iparg(5, ng)
82 isolnod = iparg(28, ng)
83 nb_face = 6
84 wfextt = zero
85 ix =>ixs(1:nixs, 1 + nft : nel + nft)
86 IF (isolnod == 8) THEN
87 nb_node = 8
88 DO j = 1, nb_node
89 node_list = j + 1
90 ENDDO
91 ELSE
92 nb_node = 4
93 node_list(1) = 2
94 node_list(2) = 4
95 node_list(3) = 7
96 node_list(4) = 6
97 ENDIF
98
99 IF (multi_fvm%SYM /= 0) THEN
100 IF (ity == 2) THEN
101C QUADS
102 nb_face = 4
103 nb_node = 4
104 node_list(1) = 2
105 node_list(2) = 3
106 node_list(3) = 4
107 node_list(4) = 5
108
109 ix => ixq(1:nixq, 1 + nft : nel + nft)
110 ELSEIF (ity == 7) THEN
111C TRIANGLES
112 nb_face = 3
113 nb_node = 3
114 node_list(1) = 2
115 node_list(2) = 3
116 node_list(3) = 4
117 ix => ixtg(1:nixtg, 1 + nft : nel + nft)
118 ENDIF
119 ENDIF
120
121C Update global quantities
122 DO ii = 1, nel
123 i = ii + nft
124C Velocity components
125 vx = gbuf%MOM(ii + 0 * nel)
126 vy = gbuf%MOM(ii + 1 * nel)
127 vz = gbuf%MOM(ii + 2 * nel)
128! Square norm of the velocity
129 vel2 = vx * vx + vy * vy + vz * vz
130! Conserved variable
131 vii(1) = gbuf%RHO(ii)
132 vii(2) = vii(1) * vx
133 vii(3) = vii(1) * vy
134 vii(4) = vii(1) * vz
135 vii(5) = gbuf%EINT(ii) + half * vii(1) * vel2
136
137! Volume
138 vol = gbuf%VOL(ii)
139! Sum of fluxes
140 IF (multi_fvm%SYM == 0 .AND. isolnod /= 4) THEN
141 sumflux(1:5) = multi_fvm%FLUXES(1:5, 1, i) + multi_fvm%FLUXES(1:5, 2, i) +
142 . multi_fvm%FLUXES(1:5, 3, i) + multi_fvm%FLUXES(1:5, 4, i) +
143 . multi_fvm%FLUXES(1:5, 5, i) + multi_fvm%FLUXES(1:5, 6, i)
144 ELSEIF (isolnod == 4) THEN
145 sumflux(1:5) = multi_fvm%FLUXES(1:5, 5, i) + multi_fvm%FLUXES(1:5, 6, i) +
146 . multi_fvm%FLUXES(1:5, 2, i) + multi_fvm%FLUXES(1:5, 4, i)
147 ELSE
148C TRIANGLES
149 sumflux(1:5) = multi_fvm%FLUXES(1:5, 1, i) + multi_fvm%FLUXES(1:5, 2, i) +
150 . multi_fvm%FLUXES(1:5, 3, i)
151 IF (ity == 2) THEN
152C QUADS
153 sumflux(1:5) = sumflux(1:5) + multi_fvm%FLUXES(1:5, 4, i)
154 ENDIF
155 ENDIF
156! Time evolution
157 vii(1:5) = vol * vii(1:5) - timestep * sumflux(1:5)
158! 2D axi
159 IF (multi_fvm%SYM == 1) THEN
160 pres = multi_fvm%PRES(i)
161 vii(3) = vii(3) + timestep * gbuf%AREA(ii) * pres
162 ENDIF
163! Gravity
164 gravii(1:3) = zero
165 nvertex = 0
166! TODO(DC) :check the case of tetrahedra
167 DO j = 1, nb_node
168 nodeid = ix(node_list(j), ii)
169 IF(gravity(4, nodeid) == zero) cycle
170 nvertex = nvertex + 1
171 gravii(1) = gravii(1) + gravity(1, nodeid)
172 gravii(2) = gravii(2) + gravity(2, nodeid)
173 gravii(3) = gravii(3) + gravity(3, nodeid)
174 ENDDO
175 IF (nvertex > 0) THEN
176 gravii(1:3) = gravii(1:3) / nvertex
177 ENDIF
178 vii(2:4) = vii(2:4) + timestep * gbuf%RHO(ii) * vol * gravii(1:3)
179 wext = timestep * gbuf%RHO(ii) * vol * (
180 . gravii(1) * multi_fvm%VEL(1, i) +
181 . gravii(2) * multi_fvm%VEL(2, i) +
182 . gravii(3) * multi_fvm%VEL(3, i))
183 vii(5) = vii(5) + wext
184 wfextt = wfextt + wext
185! Mass is stored in RHO
186 multi_fvm%RHO(i) = vii(1)
187! Mass times velocity is stored in VEL
188 multi_fvm%VEL(1, i) = vii(2)
189 multi_fvm%VEL(2, i) = vii(3)
190 multi_fvm%VEL(3, i) = vii(4)
191! Total energy is stored in EINT
192 multi_fvm%EINT(i) = vii(5)
193 ENDDO
194
195C-------------------------------------------
196!$OMP ATOMIC
197 wfext=wfext+wfextt
198C-------------------------------------------
199
200C-----------------------------------------------
201C E n d o f s u b r o u t i n e
202C-----------------------------------------------
203 END SUBROUTINE multi_evolve_global
#define my_real
Definition cppsort.cpp:32
subroutine multi_evolve_global(timestep, ng, elbuf_tab, iparg, itask, ixs, ixq, ixtg, multi_fvm, gravity, wfext)