5 SUBROUTINE crit_point_mix(tc,user)
15 #include <finclude/petscsys.h> 20 REAL :: tc_l, tc_v, xi_save(np,nc),p_save
32 xi_save(:,:) = xi(:,:)
45 CALL mpi_bcast(t,1,mpi_double_precision,0,petsc_comm_world,ierr)
47 xif(1:ncomp) = xi_save(1,1:ncomp)
54 xif(1:ncomp) = xi_save(2,1:ncomp)
71 xi(:,:) = xi_save(:,:)
72 densta(1:nphas) = val_conv(1:nphas)
73 dense(1:nphas) = val_conv(1:nphas)
75 IF(user%rank == 0)
THEN 76 WRITE (*,*)
'estimate of critical temperature:',tc,
'K' 84 END SUBROUTINE crit_point_mix
100 SUBROUTINE heidemann_khalil
104 USE module_heidemann_khalil
110 SUBROUTINE heidemann_khalil_obj ( iter_no, y, residu, dummy )
111 INTEGER,
INTENT(IN) :: iter_no
112 REAL,
INTENT(IN) :: y(iter_no)
113 REAL,
INTENT(OUT) :: residu(iter_no)
114 INTEGER,
INTENT(IN OUT) :: dummy
115 END SUBROUTINE heidemann_khalil_obj
119 REAL,
ALLOCATABLE :: y(:),diag(:),residu(:)
121 INTEGER :: i, count, nphas_save
122 REAL :: error0, error1, dense0, dfdx, delta_rho
123 CHARACTER (LEN=2) :: ensemble_save
126 ensemble_save = ensemble_flag
145 ALLOCATE( y(n_unkw), diag(n_unkw), residu(n_unkw) )
147 y(i) = 1.0 / sqrt(
REAL( ncomp ) )
153 DO WHILE ( abs( error0) > 0.001 .AND. count < 20 )
156 dense(1) = dense0 + 0.0001
157 CALL hbrd (heidemann_khalil_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
158 error1 = error_condition2
159 IF (sum( abs( residu(1:n_unkw) ) ) > 1.e-5)
write (*,*)
'caution: error 1st inner loop', sum( abs( residu(1:n_unkw) ) )
162 CALL hbrd (heidemann_khalil_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
163 IF (sum( abs( residu(1:n_unkw) ) ) > 1.e-5)
write (*,*)
'caution: error 2nd inner loop', sum( abs( residu(1:n_unkw) ) )
164 error0 = error_condition2
168 dfdx = ( error1 - error0 ) / 0.0001
169 delta_rho = min( error0 / dfdx, 0.02)
170 delta_rho = max( delta_rho, -0.02)
171 dense0 = dense0 - delta_rho
179 DEALLOCATE( y, diag, residu )
181 ensemble_flag = ensemble_save
183 IF ( abs( error_condition2 ) > 1.e-1 )
write (*,*)
'caution: error outer loop', abs( error_condition2 )
185 END SUBROUTINE heidemann_khalil
194 SUBROUTINE heidemann_khalil_obj ( iter_no, y, residu, dummy )
198 USE module_heidemann_khalil
202 INTEGER,
INTENT(IN) :: iter_no
203 REAL,
INTENT(IN) :: y(iter_no)
204 REAL,
INTENT(OUT) :: residu(iter_no)
205 INTEGER,
INTENT(IN OUT) :: dummy
209 REAL,
DIMENSION(nc) :: dn
210 REAL,
DIMENSION(nc) :: dhs, rhoi00, rhoi0
213 REAL :: qij(nc,nc), qij0(nc,nc), qijk(nc,nc,nc)
217 dn(1:ncomp) = y(1:ncomp)
221 dhs(1:ncomp) = parame(1:ncomp,2) * ( 1.0 - 0.12 *exp( -3.0*parame(1:ncomp,3)/t ) )
222 rho = dense(1) / sum( pi/6.0*xif(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
223 rhoi00(1:ncomp) = xif(1:ncomp)*rho
229 rhoi0(1:ncomp) = rhoi00(1:ncomp)
230 rhoi0(k) = rhoi00(k) + d_rho
231 CALL qij_matrix ( rhoi0, dhs, d_rho, qij )
234 rhoi0(1:ncomp) = rhoi00(1:ncomp)
235 CALL qij_matrix ( rhoi0, dhs, d_rho, qij )
239 qijk(i,j,k) = ( qij0(i,j) - qij(i,j) ) / d_rho
249 residu(j) = sum( qij(1:ncomp,j)*dn(1:ncomp) )
251 residu(ncomp+1) = 1.0 - sum( dn(1:ncomp)*dn(1:ncomp) )
253 error_condition2 = 0.0
257 error_condition2 = error_condition2 + qijk(i,j,k) * dn(i) * dn(j) * dn(k)
261 error_condition2 = error_condition2 * 1.e-4
269 END SUBROUTINE heidemann_khalil_obj
279 SUBROUTINE binary_tp_spinodal ( rhoi, p_sp )
283 USE module_heidemann_khalil
289 SUBROUTINE binary_spinodal_obj ( iter_no, y, residu, dummy )
290 INTEGER,
INTENT(IN) :: iter_no
291 REAL,
INTENT(IN) :: y(iter_no)
292 REAL,
INTENT(OUT) :: residu(iter_no)
293 INTEGER,
INTENT(IN OUT) :: dummy
294 END SUBROUTINE binary_spinodal_obj
297 REAL,
dimension(nc) :: rhoi
302 REAL,
ALLOCATABLE :: y(:), diag(:), residu(:)
304 INTEGER :: i, nphas_save
305 CHARACTER (LEN=2) :: ensemble_save
308 ensemble_save = ensemble_flag
320 ALLOCATE( y(n_unkw), diag(n_unkw), residu(n_unkw) )
322 y(i) = 1.0 / sqrt(
REAL( ncomp ) )
325 y( ncomp + i ) = rhoi( i )
328 CALL hbrd (binary_spinodal_obj, n_unkw, y, residu, step_a, acc_a, info, diag)
331 rhoi( i ) = y( ncomp + i )
333 write (*,*)
'info',info
334 write (*,*)
'rhoi',rhoi(1:ncomp)
336 write (*,*)
'x',rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
338 DEALLOCATE( y, diag, residu )
340 ensemble_flag = ensemble_save
343 END SUBROUTINE binary_tp_spinodal
352 SUBROUTINE binary_spinodal_obj ( iter_no, y, residu, dummy )
356 USE module_heidemann_khalil
360 INTEGER,
INTENT(IN) :: iter_no
361 REAL,
INTENT(IN) :: y(iter_no)
362 REAL,
INTENT(OUT) :: residu(iter_no)
363 INTEGER,
INTENT(IN OUT) :: dummy
367 REAL :: p_calculated, zges, p_sp
369 REAL,
DIMENSION(nc) :: dn
370 REAL,
DIMENSION(nc) :: dhs, rhoi
371 REAL,
DIMENSION(nc,nc) :: qij
374 dn(1:ncomp) = y(1:ncomp)
375 rhoi(1:ncomp) = y( (ncomp+1) : (ncomp+ncomp) )
376 dhs(1:ncomp) = parame(1:ncomp,2) * ( 1.0 - 0.12 *exp( -3.0*parame(1:ncomp,3)/t ) )
378 call p_calc ( p_calculated, zges )
384 CALL qij_matrix ( rhoi, dhs, d_rho, qij )
389 write (*,
'(a,3G18.10)')
' t,p,eta ', t, p, dense(1)
391 residu(j) = sum( qij(1:ncomp,j)*dn(1:ncomp) )
393 residu(ncomp+1) = 1.0 - sum( dn(1:ncomp)*dn(1:ncomp) )
394 write (*,*)
'p_sp has to be handed over to the obj fct properly!' 395 write (*,*)
'Can I simply set p = p_sp? In other words is p altered during the calculation?' 397 residu(ncomp+2) = p_sp - p_calculated
399 write (*,
'(a,4G18.10)')
' error',residu(1:4)
403 END SUBROUTINE binary_spinodal_obj
412 SUBROUTINE qij_matrix ( rhoi0, dhs, d_rho, qij )
420 REAL,
DIMENSION(nc),
INTENT(IN) :: rhoi0
421 REAL,
DIMENSION(nc),
INTENT(IN) :: dhs
422 REAL,
INTENT(IN) :: d_rho
423 REAL,
DIMENSION(nc,nc),
INTENT(OUT) :: qij
427 REAL,
DIMENSION(nc) :: rhoi, lnf0, lnf1, lnf2
428 REAL :: lnphi(np,nc), zges
433 rhoi(1:ncomp) = rhoi0(1:ncomp)
434 rhoi(i) = rhoi0(i) + d_rho
435 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
437 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
438 CALL fugacity ( lnphi )
440 zges = (pges * 1.d-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
441 lnf1(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
443 IF (rhoi0(i) - d_rho > 0.0 )
THEN 444 rhoi(1:ncomp) = rhoi0(1:ncomp)
445 rhoi(i) = rhoi0(i) - d_rho
446 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
448 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
449 CALL fugacity ( lnphi )
451 zges = (pges * 1.d-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
452 lnf2(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
455 rhoi(1:ncomp) = rhoi0(1:ncomp)
456 dense(1) = sum( pi/6.0*rhoi(1:ncomp)*parame(1:ncomp,1)* dhs(1:ncomp)**3 )
458 xi(1,1:ncomp) = rhoi(1:ncomp) / sum( rhoi(1:ncomp) )
459 CALL fugacity ( lnphi )
461 zges = (pges * 1.d-30) / ( kbol*t*sum(rhoi(1:ncomp)) )
462 lnf0(1:ncomp) = lnphi(1,1:ncomp) + log( rhoi(1:ncomp) )
464 IF (rhoi0(i) - d_rho > 0.0 )
THEN 465 qij(i,1:ncomp) = ( lnf1(1:ncomp) - lnf2(1:ncomp) ) / (2.0*d_rho)
467 qij(i,1:ncomp) = ( lnf1(1:ncomp) - lnf0(1:ncomp) ) / d_rho
473 END SUBROUTINE qij_matrix
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
In this module, the application context is defined.
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...