32
33
34
35 USE elbufdef_mod
36 USE matparam_def_mod
38
39
40
41#include "implicit_f.inc"
42
43
44
45#include "param_c.inc"
46#include "com01_c.inc"
47#include "tabsiz_c.inc"
48
49
50
51 INTEGER, INTENT(IN) :: NUMMAT
52 INTEGER, INTENT(IN) :: NEL, NG, MATID, IPM(NPROPMI, *), LIST(NEL),NELG, IMAT, MLW
53 my_real,
INTENT(IN) :: grav0, depth(*), pm(npropm, *), bufmat(*),psurf
54 my_real,
INTENT(INOUT) :: pres(nel)
55 TYPE(ELBUF_STRUCT_), DIMENSION(NGROUP), TARGET, INTENT(IN) :: ELBUF_TAB
57 INTEGER,INTENT(IN)::NPF(SNPC)
59 TYPE(MATPARAM_STRUCT_) ,DIMENSION(NUMMAT), INTENT(IN) :: MAT_PARAM
60
61
62
63 INTEGER :: I,K
64 INTEGER :: EOSTYPE, ITER, MAX_ITER, MAT(NEL), REMAINING_ELTS, NBMAT, NVAREOS, NVARTMP_EOS
67 my_real :: func(nel), dfunc(nel), error(nel), rhozero(nel), rho(nel),
68 . mu(nel), mu2(nel), espe(nel), dvol(nel), df(nel), vol(nel), psh(nel),
69 . dpdrho(nel), dpdm(nel), dpde(nel), theta(nel), ecold(nel), p0(nel),
70 . grun(nel),pref(nel), off(nel), eint(nel), sig(nel,6),rho_old,v0(nel)
71
72 LOGICAL :: CONT, CONVERGED(NEL)
73 TYPE(G_BUFEL_), POINTER :: GBUF
74 TYPE(L_BUFEL_), POINTER :: LBUF
75 TYPE(BUF_EOS_), POINTER :: EBUF
76
77
78
79
80
81
82
83
84
85 gbuf => elbuf_tab(ng)%GBUF
86 NULLIFY(lbuf)
87 NULLIFY(ebuf)
88 ebuf => elbuf_tab(ng)%BUFLY(1)%EOS(1, 1, 1)
89 nvareos = elbuf_tab(ng)%BUFLY(1)%NVAR_EOS
90 nvartmp_eos = elbuf_tab(ng)%BUFLY(1)%NVARTMP_EOS
91 IF(imat>0)THEN
92 lbuf => elbuf_tab(ng)%BUFLY(imat)%LBUF(1, 1, 1)
93 ebuf => elbuf_tab(ng)%BUFLY(imat)%EOS(1, 1, 1)
94 nvareos = elbuf_tab(ng)%BUFLY(imat)%NVAR_EOS
95 nvartmp_eos = elbuf_tab(ng)%BUFLY(imat)%NVARTMP_EOS
96 ENDIF
97
98 eostype = mat_param(matid)%IEOS
99 eostype = ipm(4, matid)
100 iter = 0
101 max_iter = 30
102 cont =.true.
103 error(1:nel) = ep30
104 tol = em4
105 converged(1:nel) =.false.
106 dvol(1:nel) = zero
107 theta(1:nel) = zero
108
109
110
111
112
113
114 DO k = 1, nel
115 rhozero(k) = pm(1,matid)
116 psh(k) = pm(88, matid)
117 mat(k) = matid
118 pref(k) = psurf - rho0 * grav0 * depth(k)
119 vol(k) = one
120 mu(k) = zero
121 sig(k,1) = -pm(31,matid)
122 sig(k,2) = -pm(31,matid)
123 sig(k,3) = -pm(31,matid)
124 sig(k,4) = zero
125 sig(k,5) = zero
126 sig(k,6) = zero
127 ENDDO
128
129 IF(imat==0)THEN
130 DO k = 1, nel
131 i = list(k)
132 rho(k) = gbuf%RHO(k)
133 off(k) = gbuf%OFF(i)
134 eint(k) = gbuf%EINT(i)
135 v0(k) = gbuf%VOL(i)
136 ENDDO
137 ELSE
138 DO k = 1, nel
139 i = list(k)
140 rho(k) = pm(1,matid)
141 off(k) = lbuf%OFF(i)
142 eint(k) = lbuf%EINT(i)
143 v0(k) = lbuf%VOL(i)
144 ENDDO
145 ENDIF
146
147
148
149
150 remaining_elts = nel
151 DO WHILE(cont .AND. iter < max_iter)
152 iter = iter + 1
153 DO k = 1, nel
154 mu(k) = rho(k) / rhozero(k) - one
155 df(k) = rhozero(k) / rho(k)
156 eint(k) = eint(k) / df(k)
157 ENDDO
158 CALL eosmain(2 , nel , eostype , pm , off , eint,
159 . rho , rhozero , mu , mu2
160 . dvol , df , vol , mat , psh ,
161 . pres , dpdm , dpde , theta ,
162 . bufmat, sig , mu , mlw ,
163 . npf , tf , ebuf%VAR , nvareos, mat_param(matid),
164 . bid , nvartmp_eos, ebuf%VARTMP)
165 DO k=1,nel
166 eint(k)=eint(k)*df(k)
167 ENDDO
168
169
170
171
172 DO k = 1, nel
173 IF (.NOT. converged(k)) THEN
174 dpdrho(k) = dpdm(k) / rhozero(k)
175
176 func(k) = pres(k)-pref(k)
177 dfunc(k) = dpdrho(k)
178 incr = - func(k) / dfunc(k)
179 rho_old = rho(k)
180 rho(k) = rho(k) + incr
181 error(k)=
max( abs(incr)/rhozero(k) , abs(func(k)) )
182
183 incr = - (pres(k)+psh(k)+half*dpdrho(k)*incr)*(rhozero(k)/rho(k)-rhozero(k)/rho_old)
184 eint(k) = eint(k) + incr
185 IF(dpde(k)==zero)eint(k)=zero
186
187 IF (error(k) < tol .OR. iter == max_iter) THEN
188 converged(k) = .true.
189 remaining_elts = remaining_elts - 1
190 vol(k) = zero
191 i = list(k)
192 df(k) = rhozero(i) / rho(k)
193 IF(imat==0)THEN
194 gbuf%RHO(i) = rho(k)
195 gbuf%SIG(i ) = - pres(k)
196 gbuf%SIG(i + nelg) = - pres(k)
197 gbuf%SIG(i + 2 * nelg) = - pres(k)
198 gbuf%EINT(i) = eint(k)/df(k)
199 ELSE
200 lbuf%RHO(i) = rho(k)
201 lbuf%SIG(i ) = - pres(k)
202 lbuf%SIG(i + nelg) = - pres(k)
203 lbuf%SIG(i + 2 * nelg) = - pres(k)
204 lbuf%EINT(i) = eint(k)/df(k)
205 ENDIF
206 ENDIF
207 ENDIF
208 ENDDO
209 cont = (remaining_elts /= 0)
210 ENDDO
211
212
subroutine eosmain(iflag, nel, eostyp, pm, off, eint, rho, rho0, mu, mu2, espe, dvol, df, vnew, mat, psh, pnew, dpdm, dpde, theta, bufmat, sig, mu_bak, mlw, npf, tf, vareos, nvareos, mat_param, bfrac, nvartmp, vartmp)