37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
53 USE elbufdef_mod
55 use element_mod , only : nixs
56
57
58
59#include "implicit_f.inc"
60
61
62
63#include "param_c.inc"
64#include "com01_c.inc"
65#include "com04_c.inc"
66
67
68
70 INTEGER,INTENT(IN) :: IDLOC,IPARG(NPARG,*), NG, IXS(NIXS,NUMELS), brickID, IPM(NPROPMI,*)
71 TYPE(BUF_MAT_) ,POINTER :: MBUF
72 my_real,
INTENT(IN),
TARGET :: bufmat(*)
73 TYPE(G_BUFEL_) ,POINTER :: GBUF
74 TYPE(L_BUFEL_) ,POINTER :: LBUF
75 TYPE(ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
76
77
78
79
80
81
82
83
84
85
86
87 INTEGER NITER, ITER,MT, LLT_, IADBUF
89 . ssp,c1,r1,pmin,rho10,rho20,
90 . rho1,rho2, p,gam,p0,
91 . tol, mas, mas1, mas2,
92 . error, p1,p2,f1,f2,df11,df12,df21,df22,det,drho1,drho2,
93 . psh, ssp1, ssp2, rho, uvar(5)
94
95
96
97
98
99
100
101 llt_ = iparg(2,ng)
102 mbuf => elbuf_tab(ng)%BUFLY(1)%MAT(1,1,1)
103 gbuf => elbuf_tab(ng)%GBUF
104 lbuf => elbuf_tab(ng)%BUFLY(1)%LBUF(1,1,1)
105
106
107
108 uvar(1) = mbuf%VAR((0*llt_ + idloc))
109 uvar(2) = mbuf%VAR((1*llt_ + idloc))
110 uvar(3) = mbuf%VAR((2*llt_ + idloc))
111 uvar(4) = mbuf%VAR((3*llt_ + idloc))
112 uvar(5) = mbuf%VAR((4*llt_ + idloc))
113
114
115 mt = ixs(1,brickid)
116 iadbuf = ipm(7,mt)
117 rho10 = bufmat(iadbuf-1+11)
118 rho20 = bufmat(iadbuf-1+12)
119 r1 = bufmat(iadbuf-1+06)
120 p0 = bufmat(iadbuf-1+09)
121 gam = bufmat(iadbuf-1+05)
122 c1 = bufmat(iadbuf-1+04)
123 pmin = bufmat(iadbuf-1+08)
124 psh = bufmat(iadbuf-1+16)
125
126 rho = gbuf%RHO(idloc)
127
128 uvar(1) = mbuf%VAR((1-1)*llt_ +idloc)
129 uvar(2) = mbuf%VAR((2-1)*llt_ +idloc)
130 uvar(3) = mbuf%VAR((3-1)*llt_ +idloc)
131 uvar(4) = mbuf%VAR((4-1)*llt_ +idloc)
132 uvar(5) = mbuf%VAR((5-1)*llt_ +idloc)
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 tol = em10
149 niter = 20
150
151 mas = rho * vol
152 mas1 = uvar(1) * vol
153 mas2 = mas - mas1
154 rho2 = uvar( 2)
155 rho1 = uvar( 3)
156 IF (mas1 / mas < em10) THEN
157
158 uvar( 1) = zero
159 uvar( 4) = zero
160 uvar( 5) = one
161 rho2 = mas / vol
162 uvar( 2) = rho2
163 p = p0 * (rho2/rho20)**gam
164 ELSEIF (mas2 / mas < em10) THEN
165
166 rho1 = mas / vol
167 uvar( 1) = rho1
168 uvar( 3) = rho1
169 uvar( 4) = one
170 uvar( 5) = zero
171
172 ELSE
173 error = ep30
174 iter = 1
175 DO WHILE(iter < niter .AND. error > tol
176 p1 = r1 * rho1 - c1 + p0
177 p2 = p0 * (rho2/rho20)**gam
178 f1 = mas1 / rho1 + mas2 / rho2 - vol
179 f2 = p1 - p2
180 df11 = - mas1 / (rho1 * rho1)
181 df12 = - mas2 / (rho2 * rho2)
182 df21 = r1
183 df22 = - gam * p0 / (rho20**gam) * rho2**(gam - one)
184 det = df11 * df22 - df12 * df21
185 drho1 = (-df22 * f1 + df12 * f2) / det
186 drho2 = (df21 * f1 - df11 * f2) / det
187 drho1 =
min(three * rho1,
max(drho1, - half * rho1))
188 drho2 =
min(three * rho2,
max(drho2, - half * rho2))
189 rho1 = rho1 + drho1
190 rho2 = rho2 + drho2
191 error = abs(drho1 / rho1) + abs(drho2 / rho2)
192 iter = iter + 1
193 ENDDO
194 IF (abs(p1 - p2) > 1.d-5) THEN
195
196 ENDIF
197 IF (error > tol) THEN
198 print*, "*** WARNING LAW37, convergence tol. ", error, tol
199 ENDIF
200 p = r1 * rho1 - c1 + p0
201 ENDIF
202 ssp1 = r1 * rho1
203 ssp2 = gam * p0 * (rho2/rho20)**gam
204 ! p2 = p0 * ((rho2/rho20)**gam-one)
205
206 uvar(2) = rho2
207 uvar(3) = rho1
208 uvar(4) = uvar(1)/rho1
209 IF(uvar(4)<em20)uvar(4)=zero
210 uvar(5) = one-uvar(4)
211 IF (ssp1 > zero) THEN
212 ssp1 = uvar(4) / ssp1
213 ELSE
214 ssp1 = zero
215 ENDIF
216 IF (ssp2 > zero) THEN
217 ssp2 = uvar(5) / ssp2
218 ELSE
219 ssp2 = zero
220 ENDIF
221 ssp = ssp1 + ssp2
222 ssp = sqrt(one / ssp / rho)
223
224 p =
max(pmin, p) + psh
225
226 uvar(1) =
max(zero, uvar(1))
227 uvar(2) =
max(zero, uvar(2))
228 uvar(3) =
max(zero, uvar(3))
229 uvar(4) =
max(zero, uvar(4))
230 uvar(5) =
max(zero, uvar(5))
231
232
233
234 mbuf%VAR((1-1)*llt_ +idloc) = uvar(1)
235 mbuf%VAR((2-1)*llt_ +idloc) = uvar(2)
236 mbuf%VAR((3-1)*llt_ +idloc) = uvar(3)
237 mbuf%VAR((4-1)*llt_ +idloc) = uvar(4)
238 mbuf%VAR((5-1)*llt_ +idloc) = uvar(5)
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253 lbuf%SSP(idloc) = ssp ;
254
257
258
259 RETURN
type(alefvm_buffer_), target alefvm_buffer