7 Module module_heidemann_khalil
12 real :: error_condition2
14 End Module module_heidemann_khalil
24 SUBROUTINE heidemann_khalil
27 USE module_heidemann_khalil
33 SUBROUTINE heidemann_khalil_obj ( iter_no, y, residu, dummy )
34 INTEGER,
INTENT(IN) :: iter_no
35 REAL,
INTENT(IN) :: y(iter_no)
36 REAL,
INTENT(OUT) :: residu(iter_no)
37 INTEGER,
INTENT(IN OUT) :: dummy
38 END SUBROUTINE heidemann_khalil_obj
42 REAL,
ALLOCATABLE :: y(:),diag(:),residu(:)
44 INTEGER :: i, count, nphas_save
45 REAL :: error0, error1, dense0, dfdx, delta_rho
46 CHARACTER (LEN=2) :: ensemble_save
49 ensemble_save = ensemble_flag
68 ALLOCATE( y(n_unkw), diag(n_unkw), residu(n_unkw) )
70 y(i) = 1.0 / sqrt(
REAL( ncomp ) )
76 DO WHILE ( abs( error0) > 0.001 .AND. count < 20 )
79 dense(1) = dense0 + 0.0001
80 CALL hbrd (heidemann_khalil_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
81 error1 = error_condition2
82 IF (sum( abs( residu(1:n_unkw) ) ) > 1.e-5)
write (*,*)
'caution: error 1st inner loop', &
83 sum( abs( residu(1:n_unkw) ) )
86 CALL hbrd (heidemann_khalil_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
87 IF (sum( abs( residu(1:n_unkw) ) ) > 1.e-5)
write (*,*)
'caution: error 2nd inner loop', &
88 sum( abs( residu(1:n_unkw) ) )
89 error0 = error_condition2
93 dfdx = ( error1 - error0 ) / 0.0001
94 delta_rho = min( error0 / dfdx, 0.02)
95 delta_rho = max( delta_rho, -0.02)
96 dense0 = dense0 - delta_rho
104 DEALLOCATE( y, diag, residu )
106 ensemble_flag = ensemble_save
108 IF ( abs( error_condition2 ) > 1.e-1 )
write (*,*)
'caution: error outer loop', abs( error_condition2 )
110 END SUBROUTINE heidemann_khalil
120 SUBROUTINE heidemann_khalil_obj ( iter_no, y, residu, dummy )
124 USE module_heidemann_khalil
128 INTEGER,
INTENT(IN) :: iter_no
129 REAL,
INTENT(IN) :: y(iter_no)
130 REAL,
INTENT(OUT) :: residu(iter_no)
131 INTEGER,
INTENT(IN OUT) :: dummy
135 REAL,
DIMENSION(nc) :: dn
136 REAL,
DIMENSION(nc) :: dhs, rhoi00, rhoi0
139 REAL :: qij(nc,nc), qij0(nc,nc), qijk(nc,nc,nc)
143 dn(1:ncomp) = y(1:ncomp)
147 dhs(1:ncomp) = parame(1:ncomp,2) * ( 1.0 - 0.12 *exp( -3.0*parame(1:ncomp,3)/t ) )
148 rho = dense(1) / sum( pi/6.0*xif(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
149 rhoi00(1:ncomp) = xif(1:ncomp)*rho
155 rhoi0(1:ncomp) = rhoi00(1:ncomp)
156 rhoi0(k) = rhoi00(k) + d_rho
157 CALL qij_matrix ( rhoi0, dhs, d_rho, qij )
160 rhoi0(1:ncomp) = rhoi00(1:ncomp)
161 CALL qij_matrix ( rhoi0, dhs, d_rho, qij )
165 qijk(i,j,k) = ( qij0(i,j) - qij(i,j) ) / d_rho
175 residu(j) = sum( qij(1:ncomp,j)*dn(1:ncomp) )
177 residu(ncomp+1) = 1.0 - sum( dn(1:ncomp)*dn(1:ncomp) )
179 error_condition2 = 0.0
183 error_condition2 = error_condition2 + qijk(i,j,k) * dn(i) * dn(j) * dn(k)
187 error_condition2 = error_condition2 * 1.e-4
195 END SUBROUTINE heidemann_khalil_obj
205 SUBROUTINE binary_tp_spinodal ( rhoi )
208 USE module_heidemann_khalil
214 SUBROUTINE binary_spinodal_obj ( iter_no, y, residu, dummy )
215 INTEGER,
INTENT(IN) :: iter_no
216 REAL,
INTENT(IN) :: y(iter_no)
217 REAL,
INTENT(OUT) :: residu(iter_no)
218 INTEGER,
INTENT(IN OUT) :: dummy
219 END SUBROUTINE binary_spinodal_obj
222 REAL,
dimension(nc) :: rhoi
226 REAL,
ALLOCATABLE :: y(:), diag(:), residu(:)
228 INTEGER :: i, nphas_save
229 CHARACTER (LEN=2) :: ensemble_save
232 ensemble_save = ensemble_flag
244 ALLOCATE( y(n_unkw), diag(n_unkw), residu(n_unkw) )
246 y(i) = 1.0 / sqrt(
REAL( ncomp ) )
249 y( ncomp + i ) = rhoi( i )
252 CALL hbrd (binary_spinodal_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
255 rhoi( i ) = y( ncomp + i )
257 write (*,*)
'info',info
258 write (*,*)
'rhoi',rhoi(1:ncomp)
260 write (*,*)
'x',rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
262 DEALLOCATE( y, diag, residu )
264 ensemble_flag = ensemble_save
267 END SUBROUTINE binary_tp_spinodal
276 SUBROUTINE binary_spinodal_obj ( iter_no, y, residu, dummy )
280 USE module_heidemann_khalil
285 INTEGER,
INTENT(IN) :: iter_no
286 REAL,
INTENT(IN) :: y(iter_no)
287 REAL,
INTENT(OUT) :: residu(iter_no)
288 INTEGER,
INTENT(IN OUT) :: dummy
292 REAL :: p_calculated, zges, p_sp
294 REAL,
DIMENSION(nc) :: dn
295 REAL,
DIMENSION(nc) :: dhs, rhoi
296 REAL,
DIMENSION(nc,nc) :: qij
299 dn(1:ncomp) = y(1:ncomp)
300 rhoi(1:ncomp) = y( (ncomp+1) : (ncomp+ncomp) )
301 dhs(1:ncomp) = parame(1:ncomp,2) * ( 1.0 - 0.12 *exp( -3.0*parame(1:ncomp,3)/t ) )
303 call p_calc ( p_calculated, zges )
309 CALL qij_matrix ( rhoi, dhs, d_rho, qij )
314 write (*,
'(a,3G18.10)')
' t,p,eta ', t, p, dense(1)
316 residu(j) = sum( qij(1:ncomp,j)*dn(1:ncomp) )
318 residu(ncomp+1) = 1.0 - sum( dn(1:ncomp)*dn(1:ncomp) )
319 write (*,*)
'p_sp has to be handed over to the obj fct properly!' 320 write (*,*)
'Can I simply set p = p_sp? In other words is p altered during the calculation?' 322 residu(ncomp+2) = p_sp - p_calculated
324 write (*,
'(a,4G18.10)')
' error',residu(1:4)
327 END SUBROUTINE binary_spinodal_obj
336 SUBROUTINE qij_matrix ( rhoi0, dhs, d_rho, qij )
344 REAL,
DIMENSION(nc),
INTENT(IN) :: rhoi0
345 REAL,
DIMENSION(nc),
INTENT(IN) :: dhs
346 REAL,
INTENT(IN) :: d_rho
347 REAL,
DIMENSION(nc,nc),
INTENT(OUT) :: qij
351 REAL,
DIMENSION(nc) :: rhoi, lnf0, lnf1, lnf2
352 REAL :: lnphi(np,nc), zges
356 rhoi(1:ncomp) = rhoi0(1:ncomp)
357 rhoi(i) = rhoi0(i) + d_rho
358 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
360 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
361 CALL fugacity ( lnphi )
363 zges = (pges * 1.e-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
364 lnf1(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
366 IF (rhoi0(i) - d_rho > 0.0 )
THEN 367 rhoi(1:ncomp) = rhoi0(1:ncomp)
368 rhoi(i) = rhoi0(i) - d_rho
369 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
371 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
372 CALL fugacity ( lnphi )
374 zges = (pges * 1.e-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
375 lnf2(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
378 rhoi(1:ncomp) = rhoi0(1:ncomp)
379 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
381 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
382 CALL fugacity ( lnphi )
384 zges = (pges * 1.e-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
385 lnf0(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
387 IF (rhoi0(i) - d_rho > 0.0 )
THEN 388 qij(i,1:ncomp) = ( lnf1(1:ncomp) - lnf2(1:ncomp) ) / (2.0*d_rho)
390 qij(i,1:ncomp) = ( lnf1(1:ncomp) - lnf0(1:ncomp) ) / d_rho
396 END SUBROUTINE qij_matrix
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...