OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
gradient_limitation.F File Reference
#include "implicit_f.inc"
#include "vect01_c.inc"
#include "com04_c.inc"

Go to the source code of this file.

Functions/Subroutines

subroutine gradient_limitation (ixs, x, trimat)

Function/Subroutine Documentation

◆ gradient_limitation()

subroutine gradient_limitation ( integer, dimension(nixs,numels), intent(in) ixs,
dimension(3,numnod), intent(in) x,
integer, intent(in) trimat )

Definition at line 31 of file gradient_limitation.F.

32C-----------------------------------------------
33C D e s c r i p t i o n
34C limits the amplitude of this gradient in such a way that
35C extrapolated values on the nodes of the element lie between
36C local minimum and maximum values from the neighboring elements
37C -> maximum principle purpose
38C-----------------------------------------------
39C M o d u l e s
40C-----------------------------------------------
41 USE alemuscl_mod
42 use element_mod , only :nixs
43C-----------------------------------------------
44C I m p l i c i t T y p e s
45C-----------------------------------------------
46#include "implicit_f.inc"
47C-----------------------------------------------
48C C o m m o n B l o c k s
49C-----------------------------------------------
50#include "vect01_c.inc"
51#include "com04_c.inc"
52C-----------------------------------------------
53C D u m m y A r g u m e n t s
54C-----------------------------------------------
55 INTEGER, INTENT(IN) :: IXS(NIXS,NUMELS), TRIMAT
56 my_real, INTENT(IN) :: x(3,numnod)
57C-----------------------------------------------
58C L o c a l V a r i a b l e s
59C-----------------------------------------------
60 INTEGER :: I, II, JJ
61 INTEGER :: NODE_ID
62 my_real :: reduc_factor(trimat), nodal_reduc_factor, xn, yn, zn, valnode
63 INTEGER :: ITRIMAT
64 INTEGER :: NNUM
65 my_real :: xk, yk, zk
66C-----------------------------------------------
67C S o u r c e L i n e s
68C-----------------------------------------------
69 !!! Limiting process for the computed gradient -> maximum principle
70 !!! and stability purposes
71 DO i = lft, llt
72 ii = i + nft
73 !!!centroid element
74 xk = alemuscl_buffer%ELCENTER(ii,1) ;
75 yk = alemuscl_buffer%ELCENTER(ii,2) ;
76 zk = alemuscl_buffer%ELCENTER(ii,3) ;
77 reduc_factor = ep30
78 nnum = 0
79 DO itrimat = 1, trimat
80 IF(abs(alemuscl_buffer%GRAD(ii,1,itrimat)) +
81 . abs(alemuscl_buffer%GRAD(ii,2,itrimat)) +
82 . abs(alemuscl_buffer%GRAD(ii,3,itrimat)) > zero) THEN
83 nnum = nnum + 1
84 !!! Check the nodes of the element
85 DO jj = 1, 8
86 node_id = ixs(jj+1, ii)
87 !!! Get the node coordinates
88 xn = x(1, node_id) ; yn = x(2, node_id) ; zn = x(3, node_id)
89 !!! Interpolate the function at the node
90 valnode = alemuscl_buffer%VOLUME_FRACTION(ii,itrimat)
91 . + alemuscl_buffer%GRAD(ii,1,itrimat) * (xn - xk)
92 . + alemuscl_buffer%GRAD(ii,2,itrimat) * (yn - yk)
93 . + alemuscl_buffer%GRAD(ii,3,itrimat) * (zn - zk)
94 nodal_reduc_factor = one
95 IF (valnode - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat) > zero) THEN
96 nodal_reduc_factor =
97 . min((alemuscl_buffer%NODE_MAX_VALUE(node_id,itrimat) - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat))
98 . / (valnode - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat)), alemuscl_param%BETA)
99 ELSE IF (valnode - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat) < zero) THEN
100 nodal_reduc_factor =
101 . min((alemuscl_buffer%NODE_MIN_VALUE(node_id,itrimat) - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat))
102 . / (valnode - alemuscl_buffer%VOLUME_FRACTION(ii,itrimat)), alemuscl_param%BETA)
103 ENDIF
104 reduc_factor(itrimat) = min(reduc_factor(itrimat), nodal_reduc_factor)
105 ENDDO ! JJ = 1, 8
106 ELSE
107 reduc_factor(itrimat) = zero
108 ENDIF
109 ENDDO ! ITRIMAT = 1, TRIMAT
110 !!!IF (NNUM >= 3) THEN
111 !!! reduc_factor = 0.
112 !!!ENDIF
113 DO itrimat = 1, trimat
114 IF(abs(alemuscl_buffer%GRAD(ii,1,itrimat)) +
115 . abs(alemuscl_buffer%GRAD(ii,2,itrimat)) +
116 . abs(alemuscl_buffer%GRAD(ii,3,itrimat)) > zero) THEN
117 !!! Limitation of the gradient
118 alemuscl_buffer%GRAD(ii,1,itrimat) = reduc_factor(itrimat) * alemuscl_buffer%GRAD(ii,1,itrimat)
119 alemuscl_buffer%GRAD(ii,2,itrimat) = reduc_factor(itrimat) * alemuscl_buffer%GRAD(ii,2,itrimat)
120 alemuscl_buffer%GRAD(ii,3,itrimat) = reduc_factor(itrimat) * alemuscl_buffer%GRAD(ii,3,itrimat)
121 ENDIF
122 ENDDO
123 ENDDO ! I = LFT, LLT
124
125C-----------------------------------------------
#define my_real
Definition cppsort.cpp:32
#define min(a, b)
Definition macros.h:20
type(alemuscl_param_) alemuscl_param
type(alemuscl_buffer_) alemuscl_buffer