8 Module pure_fit_parameters
14 INTEGER,
PARAMETER :: cont = 4
15 INTEGER,
PARAMETER :: npmax = 40
16 INTEGER,
PARAMETER :: mmx = 3500
18 INTEGER :: nlv, nliq, n_vir, n_en
19 REAL,
DIMENSION(npmax) :: rel
20 REAL,
DIMENSION(cont) :: type_weight
22 REAL,
DIMENSION(MMX) :: plvcal, v_cal, b_cal, u_cal
23 REAL,
DIMENSION(MMX) :: plv, tlv
24 REAL,
DIMENSION(MMX) :: pliq, tliq, vliq
25 REAL,
DIMENSION(MMX) :: b_vir, t_vir
26 REAL,
DIMENSION(MMX) :: u_en, t_en, rho_en
29 INTEGER,
DIMENSION(10) :: fit_array
30 CHARACTER (LEN=25),
DIMENSION(npmax) :: aa_txt
31 INTEGER,
DIMENSION(cont) :: eqa
33 CHARACTER (LEN=50) :: pure_fit_file
35 End Module pure_fit_parameters
48 SUBROUTINE pure_residual (lm_m_dat, lm_n_par, para, fvec, iflag)
52 USE pure_fit_parameters
53 USE utilities
, only: si_dens, dens_calc, p_calc, error_message
58 INTEGER,
INTENT(IN) :: lm_m_dat
59 INTEGER,
INTENT(IN) :: lm_n_par
60 REAL,
INTENT(IN) :: para(:)
61 REAL,
INTENT(IN OUT) :: fvec(:)
62 INTEGER,
INTENT(IN OUT) :: iflag
65 INTEGER :: converg, crit_dat
68 LOGICAL :: scan,vapor,nocon
69 REAL :: weigh, tc, v_dum, plv_dum
71 REAL :: density(np), w(np,nc)
73 CHARACTER (LEN=4) :: char_len
80 IF ( (nliq >= 1) .OR. (nlv >= 1) .OR. (n_vir >= 1) .OR. (n_en >= 1) )
THEN 84 IF (fit_array(j) == i) ps=j
86 IF (i == 1 .AND. ps >= 1) parame(1,1) = mm(1)*para(ps)*rel(ps)
87 IF (i == 2 .AND. ps >= 1) parame(1,2) = para(ps)*rel(ps)
88 IF (i == 3 .AND. ps >= 1) parame(1,3) = para(ps)*rel(ps)
89 IF (i == 5 .AND. ps >= 1) parame(1,13)= para(ps)*rel(ps)
90 IF (i == 6 .AND. ps >= 1) parame(1,6) = para(ps)*rel(ps)
91 IF (i == 7 .AND. ps >= 1) parame(1,8) = para(ps)*rel(ps)
92 IF (i == 8 .AND. ps >= 1) parame(1,7) = para(ps)*rel(ps)
93 IF (i == 9 .AND. ps >= 1) parame(1,9) = para(ps)*rel(ps)
94 IF (i == 11.AND. ps >= 1) parame(1,11)= para(ps)*rel(ps)
95 IF (i == 4 .AND. ps >= 1)
THEN 96 IF ( nint(parame(1,12)) == 2 )
THEN 98 parame(1,15) = para(ps)*rel(ps)
99 parame(1,16) = para(ps)*rel(ps)
101 ELSE IF ( nint(parame(1,12)) == 1 )
THEN 102 parame(1,14) = para(ps)*rel(ps)
104 call error_message(
'extend pure_par_fit for this association case')
127 IF (eos == 0) parame(1,4) = 10.0
132 WRITE (char_len,
'(I3)') lm_n_par
133 IF (iflag == 1)
WRITE (*,
'(a,'//char_len//
'(G15.8))')
' parameter ',(para(i)*rel(i),i=1,lm_n_par)
136 IF ( minval( parame(1,1:25) ) < 0.0 )
THEN 137 fvec(:) = fvec(:) * 2.0
138 write (*,*)
'warning negative pure component parameters encountered',parame(1,minloc(parame(1,1:25)))
151 IF ( pliq(i) > 0.0 )
THEN 165 IF ( vliq(i) <= v_crit )
THEN 168 IF (d_kond(1,i) /= 0.0) densta(1) = d_kond(1,i)
172 IF (d_kond(1,i) /= 0.0) densta(1) = d_kond(1,i)
176 IF (scan) densta(1) = densta(1) + 0.002
178 CALL dens_calc ( rho_phas )
179 CALL si_dens ( density, w )
180 v_cal(i) = 1.0 / density(1)
182 IF ((v_cal(i)-vliq(i))*1.e2/vliq(i) < 5.0 .AND. .NOT. scan)
THEN 183 d_kond(1,i) = dense(1)
189 IF ( vapor .AND. (1.0/density(1)) <= (v_crit/1.1) )
THEN 190 IF ( densta(1) <= 0.228 )
THEN 199 IF (dense(1) > 0.55)
WRITE (*,*)
'density ',i,dense(1)
202 IF (nocon) weigh = weigh / 4.0
204 fvec(j_dat) = weigh * sqrt(type_weight(1))*(v_cal(i)-vliq(i))/ &
205 (sqrt(abs(vliq(i)))*sqrt(abs(v_cal(i))))
221 val_init(3) = tliq(i)
223 IF (d_kond(1,j_dat) /= 0.0) val_init(1) = d_kond(1,j_dat)
224 IF (d_kond(2,j_dat) /= 0.0) val_init(2) = d_kond(2,j_dat)
225 IF (d_kond(1,j_dat) /= 0.0 .AND. d_kond(2,j_dat) /= 0.0) val_init(4) = plv_kon(j_dat)
229 CALL pure_equilibrium_fit ( crit_dat, tc, tliq(i), pliq(i), converg, v_cal(i), plv_dum )
231 IF ( converg == 1 )
THEN 232 d_kond(1,j_dat) = dense(1)
233 d_kond(2,j_dat) = dense(2)
234 plv_kon(j_dat) = val_conv(4)
236 d_kond(1,j_dat) = 0.0
237 d_kond(2,j_dat) = 0.0
238 plv_kon(j_dat) = 10.0
240 v_cal(i) = vliq(i) * 0.75
241 IF (crit_dat == 1 .AND. tliq(i) > tc ) v_cal(i) = vliq(i)*1.1
246 fvec(j_dat) = weigh * sqrt(type_weight(1))*(v_cal(i)-vliq(i)) &
247 / (sqrt(abs(vliq(i)))*sqrt(abs(v_cal(i))))
271 IF (d_kond(1,j_dat) /= 0.0) val_init(1) = d_kond(1,j_dat)
272 IF (d_kond(2,j_dat) /= 0.0) val_init(2) = d_kond(2,j_dat)
273 IF (d_kond(1,j_dat) /= 0.0 .AND. d_kond(2,j_dat) /= 0.0) val_init(4) = plv_kon(j_dat)
277 CALL pure_equilibrium_fit ( crit_dat, tc, tlv(i), plv(i), converg, v_dum, plvcal(i) )
279 IF ( converg == 1 )
THEN 280 d_kond(1,j_dat) = dense(1)
281 d_kond(2,j_dat) = dense(2)
282 plv_kon(j_dat) = val_conv(4)
284 d_kond(1,j_dat) = 0.0
285 d_kond(2,j_dat) = 0.0
286 plv_kon(j_dat) = plv(i)
287 IF ( crit_dat == 1 .AND. tc > tlv(i) )
THEN 288 plvcal(i) = plv(i) * 0.75
291 WRITE (*,
'(a,i3,2G14.5,G15.8)')
' loose ! ',i,tlv(i),t,plv(i)
295 IF (plvcal(i-2) > 0.0 .AND. plvcal(i-1) > 0.0 .AND. &
296 tlv(i-1) /= tlv(i-2))
THEN 297 plvcal(i) = exp( log(plvcal(i-1)) + (log(plvcal(i-1))-log(plvcal(i-2))) &
298 /(1.0/tlv(i-1)-1.0/tlv(i-2)) *(1.0/tlv(i)-1.0/tlv(i-1)) )
305 fvec(j_dat) = 0.2*sqrt(type_weight(2))*abs(plvcal(i)-plv(i)) &
306 / ((sqrt(abs(plv(i)))*sqrt(abs(plvcal(i)))))**0.85
308 IF (tc < tlv(i) .AND. crit_dat == 1)
THEN 309 fvec(j_dat)=fvec(j_dat) + 5.0*(tlv(i)-tc)
310 WRITE (*,
'(a,i3,3(f15.5))')
' skipped ! ',i,tlv(i),tc
325 j_dat = i + nliq + nlv
333 CALL p_calc (pges,zges)
334 CALL si_dens (density,w)
336 b_cal(i) = (zges-1.0)/density(1)*1000.0*mm(1)
338 weigh = (parame(1,3)/t)**3
339 fvec(j_dat) = type_weight(3)*weigh*(b_cal(i)-b_vir(i)) &
340 / (sqrt(abs(b_vir(i)))*sqrt(abs(b_cal(i))))
352 j_dat = i + nliq + nlv + n_vir
365 fvec(j_dat) = type_weight(4)*weigh*(u_cal(i)-u_en(i))/ abs(u_en(i))
369 IF (j_dat /= lm_m_dat)
write (*,*)
'array length not matching!' 434 END SUBROUTINE pure_residual
444 SUBROUTINE pure_equilibrium_fit (crit_dat, tc, t_in, p_in, converg, v_cal, plvcal)
448 use utilities
, only: si_dens, critical
452 INTEGER,
INTENT(IN OUT) :: crit_dat
453 REAL,
INTENT(IN OUT) :: tc
454 REAL,
INTENT(IN) :: t_in
455 REAL,
INTENT(IN) :: p_in
456 INTEGER,
INTENT(OUT) :: converg
457 REAL,
INTENT(OUT) :: v_cal
458 REAL,
INTENT(OUT) :: plvcal
462 REAL :: density(np), w(np,nc)
463 REAL :: p_high, p_low
483 CALL objective_ctrl (converg)
491 IF ( converg /= 1 .AND. crit_dat == 0 )
THEN 494 CALL critical ( tc, pc, rhoc )
495 IF ( tc < 0.0 )
write (*,*)
'error: negative Tc calculated' 496 IF ( tc < 0.0 ) tc = 500.0
503 IF ( converg /= 1 .AND. tc > temp )
THEN 505 CALL perturbation_parameter
507 CALL pressure_spinodal
510 CALL pressure_spinodal
515 val_init(4) = 0.8 * p_high + 0.2 * max( p_low, 0.0 )
516 CALL objective_ctrl (converg)
522 IF ( converg /= 1 .AND. tc > temp )
THEN 525 val_init(3) = temp - 0.1*temp
526 val_init(4) = press / 10.0
527 IF (val_init(4) == 0.0) val_init(4) = exp( ( 1.0 - tc/val_init(3) )*7.0 ) * pc
530 CALL phase_equilib ( temp, 4.0, converg )
531 IF ( converg == 1 )
write (*,
'(a,G14.5,G15.8)')
' win ! ',temp, p
534 IF ( converg == 1 )
THEN 536 CALL si_dens (density,w)
537 v_cal = 1.0 / density(1)
540 END SUBROUTINE pure_equilibrium_fit
558 USE levenberg_marquardt
559 USE pure_fit_parameters
, ONLY: pure_fit_file
560 use utilities
, only: file_open
565 SUBROUTINE pure_residual(lm_m_dat, lm_n_par, para, fvec, iflag)
567 INTEGER,
INTENT(IN) :: lm_m_dat, lm_n_par
568 REAL,
INTENT(IN) :: para(:)
569 REAL,
INTENT(IN OUT) :: fvec(:)
570 INTEGER,
INTENT(IN OUT) :: iflag
571 END SUBROUTINE pure_residual
573 SUBROUTINE paini( lm_n_par, para )
575 INTEGER,
INTENT(OUT) :: lm_n_par
576 REAL,
ALLOCATABLE,
INTENT(OUT) :: para(:)
579 SUBROUTINE pure_output( lm_n_par, para )
581 INTEGER,
INTENT(IN) :: lm_n_par
582 REAL,
INTENT(IN) :: para(:)
583 END SUBROUTINE pure_output
590 INTEGER,
ALLOCATABLE :: ipvt(:)
591 REAL,
ALLOCATABLE :: para(:)
592 REAL,
ALLOCATABLE :: fvec(:)
603 IF ( num == 0 ) epsfcn = 1.0e-6**2
604 IF ( num == 1 ) epsfcn = 1.0e-5**2
607 IF ( num == 2 )
write (*,*)
'fitting with RGT is not yet supported. Set num <= 1' 614 WRITE (*,*)
' SPECIFY INPUT FILE: ( ./input_file/pure_comp/ )' 615 READ (*,*) pure_fit_file
618 CALL file_open(
'./input_file/pure_comp/'//pure_fit_file,22)
619 OPEN (23,file=
'./output_file/pure_comp/'//pure_fit_file)
620 pure_fit_file=
'./input_file/pure_comp/'//pure_fit_file
622 CALL datin( lm_m_dat )
623 CALL paini( lm_n_par, para )
625 ALLOCATE( fvec(lm_m_dat) )
626 ALLOCATE( ipvt(lm_n_par) )
633 CALL lmdif1 (pure_residual,lm_m_dat,lm_n_par,para,fvec,tol,epsfcn,lm_factor,info,ipvt)
645 WRITE (23,*)
'SOLVER STATUS: Users FCN returned INFO = ', -info
646 WRITE (*, *)
'SOLVER STATUS: Users FCN returned INFO = ', -info
648 WRITE (23,*)
'SOLVER STATUS: Improper values for input parameters' 649 WRITE (*, *)
'SOLVER STATUS: Improper values for input parameters' 651 WRITE (23,*)
'SOLVER STATUS: Convergence' 652 WRITE (*, *)
'SOLVER STATUS: Convergence' 654 WRITE (23,*)
'SOLVER STATUS: Residuals orthogonal to the Jacobian' 655 WRITE (*, *)
'SOLVER STATUS: Residuals orthogonal to the Jacobian' 656 WRITE (*, *)
'There may be an error in FCN' 658 WRITE (23,*)
'SOLVER STATUS: Too many calls to FCN' 659 WRITE (*, *)
'SOLVER STATUS: Too many calls to FCN' 660 WRITE (*, *)
'Either slow convergence, or an error in FCN' 662 WRITE (23,*)
'SOLVER STATUS: TOL was set too small' 663 WRITE (*, *)
'SOLVER STATUS: TOL was set too small' 665 WRITE (23,*)
'SOLVER STATUS: INFO =', info,
' ???' 666 WRITE (*, *)
'SOLVER STATUS: INFO =', info,
' ???' 669 WRITE (*,*)
'-------------' 670 WRITE (23,*)
'-------------' 672 CALL pure_output ( lm_n_par, para )
677 DEALLOCATE( fvec, ipvt )
679 END SUBROUTINE fitting
694 SUBROUTINE datin ( lm_m_dat )
697 USE pure_fit_parameters
701 INTEGER,
INTENT(OUT) :: lm_m_dat
705 INTEGER :: datatype_available(cont)
706 INTEGER :: data_no, data_low, data_up, alldata
708 CHARACTER (LEN=80) :: info_line
723 READ(22,
'(A80)') info_line
724 WRITE(23,
'(a)') info_line
728 READ(22,
'(A80)') info_line
729 WRITE(23,
'(A)') info_line
730 READ(22,*) mmpliq, v_crit
731 WRITE(23,
'(2(2x,G13.6))') mmpliq, v_crit
735 READ(22,
'(A80)') info_line
736 WRITE(23,
'(A)') info_line
740 READ(22,
'(A80)') info_line
741 READ(22,*) (datatype_available(i),i=1,cont)
750 WRITE (*,*),
' DATA SELECTION' 752 WRITE (*,*),
' NUMBER OF DATA-SETS:' 753 WRITE (*,
'(T2,A40,I3)')
'PVT - data :', datatype_available(1)
754 WRITE (*,
'(T2,A40,I3)')
'vapor pressure data :', datatype_available(2)
755 WRITE (*,
'(T2,A40,I3)')
'2nd virial coefficients :', datatype_available(3)
756 WRITE (*,
'(T2,A40,I3)')
'internal res. energy data :', datatype_available(4)
760 WRITE (*,*),
' SELECT DATA-SET !' 761 WRITE (*,*),
' consider all available data: 1' 762 WRITE (*,*),
' select data-sets individually: 0' 765 IF ( alldata == 0 )
WRITE (*,*),
' SELECT DATA-TYPES !' 767 IF (datatype_available(1) /= 0)
THEN 769 IF (alldata == 0)
WRITE (*,*),
' PVT-data ? (0/1) ' 770 IF (alldata == 0)
READ (*,*) eqa(1)
772 IF (datatype_available(2) /= 0)
THEN 774 IF (alldata == 0)
WRITE (*,*),
' vapor pressure data ? (0/1)' 775 IF (alldata == 0)
READ (*,*) eqa(2)
777 IF (datatype_available(3) /= 0)
THEN 779 IF (alldata == 0)
WRITE (*,*),
' 2nd virial coefficients ? (0/1)' 780 IF (alldata == 0)
READ (*,*) eqa(3)
782 IF (datatype_available(4) /= 0)
THEN 784 IF (alldata == 0)
WRITE (*,*),
' internal res. energy data? (0/1)' 785 IF (alldata == 0)
READ (*,*) eqa(4)
797 IF (datatype_available(i) /= 0)
READ(22,
'(A80)') info_line
798 IF (eqa(i) == 1)
WRITE(23,
'(a)') info_line
799 IF (datatype_available(i) /= 0)
READ(22,
'(A80)') info_line
800 IF (eqa(i) == 1)
WRITE(23,
'(a)') info_line
804 IF (eqa(i) == 1)
THEN 805 IF (i == 1)
WRITE (*,*),
' CHOOSE FROM PVT-DATA:' 806 IF (i == 2)
WRITE (*,*),
' CHOOSE FROM VAPOR PRESSURE DATA:' 807 IF (i == 3)
WRITE (*,*),
' CHOOSE FROM 2nd VIRIAL COEFFICIENT DATA:' 808 IF (i == 4)
WRITE (*,*),
' CHOOSE FROM INTERNAL RESID. ENERGY DATA:' 811 data_up = datatype_available(i)
814 WRITE (*,
'(T2,A,I3)')
' Total number of data-sets: ',datatype_available(i)
815 WRITE (*,*),
' Specify the data-sets to be considered' 816 WRITE (*,*),
' Lower number of data-set (e.g. 1):' 817 IF (alldata == 0)
READ (*,*) data_low
818 WRITE (*,
'(a,I3,a)')
' Upper number of data-set (e.g.',datatype_available(i),
'):' 819 IF (alldata == 0)
READ (*,*) data_up
822 IF ((data_low > data_up) .OR. (data_up > datatype_available(i)))
THEN 823 WRITE (*,*)
' Erroneous input! The lower data-set number must be smaller' 824 WRITE (*,*)
' than the upper value.' 825 WRITE (*,*)
' The upper data-set number must not be greater than ',datatype_available(i)
826 WRITE (*,*)
' Lower number of data-set (e.g. 1):' 828 WRITE (*,
'(a,I3,a)')
' Upper number of data-set (e.g.',datatype_available(i),
'):' 840 DO k = data_low, data_up
842 READ (22,*) data_no, pliq(nliq), tliq(nliq), vliq(nliq)
843 WRITE (*,
'(i3,3(2x,G12.5))') data_no, pliq(nliq), tliq(nliq), vliq(nliq)
844 WRITE(23,
'(i3,3(2x,G12.5))') data_no, pliq(nliq), tliq(nliq), vliq(nliq)
846 ELSE IF (i == 2)
THEN 848 DO k = data_low, data_up
850 READ (22,*) data_no, plv(nlv), tlv(nlv)
851 WRITE (*,
'(i3,2(2x,G12.5))') data_no, plv(nlv), tlv(nlv)
852 WRITE(23,
'(i3,2(2x,G12.5))') data_no, plv(nlv), tlv(nlv)
854 ELSE IF (i == 3)
THEN 856 DO k = data_low, data_up
858 READ (22,*) data_no, b_vir(n_vir), t_vir(n_vir)
859 WRITE (*,
'(i3,2(2x,G12.5))') data_no, b_vir(n_vir), t_vir(n_vir)
860 WRITE(23,
'(i3,2(2x,G12.5))') data_no, b_vir(n_vir), t_vir(n_vir)
862 ELSE IF (i == 4)
THEN 864 DO k = data_low, data_up
866 READ (22,*) data_no, u_en(n_en), rho_en(n_en), t_en(n_en)
867 WRITE (*,
'(i3,3(2x,G12.5))') data_no, u_en(n_en), rho_en(n_en), t_en(n_en)
868 WRITE(23,
'(i3,3(2x,G12.5))') data_no, u_en(n_en), rho_en(n_en), t_en(n_en)
871 do k = data_up+1, datatype_available(i)
878 IF (datatype_available(i) /= 0)
THEN 879 DO k = 1, datatype_available(i)
892 lm_m_dat = nliq + nlv + n_vir + n_en
908 SUBROUTINE paini ( lm_n_par, para )
911 USE pure_fit_parameters
916 INTEGER,
INTENT(OUT) :: lm_n_par
917 REAL,
ALLOCATABLE,
INTENT(OUT) :: para(:)
920 INTEGER :: fitopt, position, i_fit
922 INTEGER :: i, j, assoc, quadrup, dipole
923 REAL :: dummy( npmax, 3 )
924 INTEGER :: k, no, nhb_typ(nc)
925 REAL :: nhb_no(nc,nsite)
926 REAL :: eps_hb(nc,nc,nsite,nsite)
943 WRITE (*,*),
'*********** PARAMETER SPECIFICATION ***********' 946 WRITE (*,*)
' You may choose from two default fitting options' 947 WRITE (*,*)
' or individually specify all parameters.' 948 WRITE (*,*)
' (Dipolar and quadrupolar moments are set to zero' 949 WRITE (*,*)
' for both default options; for dipolar or' 950 WRITE (*,*)
' quadrupolar compounds choose option 3)' 952 WRITE (*,*)
' Choose one the following options' 953 WRITE (*,*)
' Default 1: Fitting 3 parameters' 954 WRITE (*,*)
' * segment number m [ ]' 955 WRITE (*,*)
' * segment diameter sigma [A]' 956 WRITE (*,*)
' * segment energy parameter eps/k [K]' 957 WRITE (*,*)
' Default 2: Fitting 5 parameters for associating' 958 WRITE (*,*)
' compounds with 2 association sites' 959 WRITE (*,*)
' * segment number m [ ]' 960 WRITE (*,*)
' * segment diameter sigma [A]' 961 WRITE (*,*)
' * segment energy parameter eps/k [K]' 962 WRITE (*,*)
' * assoc.-energy parameter eps_AB/k [K]' 963 WRITE (*,*)
' * assoc.-volume parameter kappa_AB [ ]' 964 WRITE (*,*)
' Option 3: Individual specification of all' 965 WRITE (*,*)
' parameters to be fitted.' 966 WRITE (*,*)
' Choose 1, 2, or 3.' 970 IF (fitopt == 1)
THEN 975 aa_txt(1) =
' Segm.No.m / Molar Mass :' 976 aa_txt(2) =
' Segm.Diameter sigma :' 977 aa_txt(3) =
' Segm.Energy Param eps/k:' 984 ELSEIF (fitopt == 2)
THEN 987 aa_txt(1) =
' Segm.No.m / Molar Mass :' 988 aa_txt(2) =
' Segm.Diameter sigma :' 989 aa_txt(3) =
' Segm.Energy Param eps/k:' 990 aa_txt(4) =
' Assoc.-energy eps_AB/k :' 991 aa_txt(5) =
' Assoc.-volume kappa_AB :' 1004 WRITE (*,*)
' The following pure component parameters can' 1005 WRITE (*,*)
' be fitted' 1006 WRITE (*,*)
' (1) segment number m [ ]' 1007 WRITE (*,*)
' (2) segment diameter sigma [A]' 1008 WRITE (*,*)
' (3) segment energy parameter eps/k [K]' 1009 WRITE (*,*)
' (4) assoc.-energy parameter eps_AB/k [K]' 1010 WRITE (*,*)
' (5) assoc.-volume parameter kappa_AB [ ]' 1011 WRITE (*,*)
' (6) dipolar moment my [D]' 1012 WRITE (*,*)
' (7) fraction of segm.with dipolar moment xp [ ]' 1013 WRITE (*,*)
' (8) quadrupolar moment Q [D]' 1014 WRITE (*,*)
' (9) fraction of segm.with quadrup.moment xp [ ]' 1015 WRITE (*,*)
' (11)polarizability alpha [A^3]' 1017 WRITE (*,*)
' Note, that the number of association sites has' 1018 WRITE (*,*)
' to be user-specified' 1020 WRITE (*,*)
' Choose the total number of fitting-parameters' 1023 WRITE (*,*)
' Choose the position-number of fitting-param.' 1024 WRITE (*,*)
' (see above list of parameter 1 to 9)' 1026 WRITE (*,
'(a,i1,a,i2)')
' position-number for param. ',i,
' of ',lm_n_par
1028 IF (position == 1) aa_txt(i) =
' Segm.No.m / Molar Mass :' 1029 IF (position == 2) aa_txt(i) =
' Segm.Diameter sigma :' 1030 IF (position == 3) aa_txt(i) =
' Segm.Energy Param eps/k:' 1031 IF (position == 4 .OR. position == 5) assoc = 1
1032 IF (position == 4) aa_txt(i) =
' Assoc.-energy eps_AB/k :' 1033 IF (position == 5) aa_txt(i) =
' Assoc.-volume kappa_AB :' 1034 IF (position == 6 .OR. position == 7) dipole = 1
1035 IF (position == 6) aa_txt(i) =
' Dipolar moment :' 1036 IF (position == 7) aa_txt(i) =
' No. of segm.with dipole:' 1037 IF (position == 8 .OR. position == 9) quadrup = 1
1038 IF (position == 8) aa_txt(i) =
' Quadrupolar moment :' 1039 IF (position == 9) aa_txt(i) =
' No.of segm.with quadrup:' 1040 IF (position == 11)aa_txt(i) =
' polarizability alpha' 1041 fit_array(i) = position
1043 IF ( assoc == 1 )
THEN 1044 WRITE (*,*)
' Give number of association sites' 1046 IF (n_sites == 1) nhb_typ(1) = 1
1047 IF (n_sites == 1) nhb_no(1,1)= 1.0
1048 IF (n_sites == 2) nhb_typ(1) = 2
1049 IF (n_sites == 2) nhb_no(1,1)= 1.0
1050 IF (n_sites == 2) nhb_no(1,2)= 1.0
1051 IF (n_sites == 3) nhb_typ(1) = 2
1052 IF (n_sites == 3) nhb_no(1,1)= 1.0
1053 IF (n_sites == 3) nhb_no(1,2)= 2.0
1054 IF (n_sites == 4) nhb_typ(1) = 2
1055 IF (n_sites == 4) nhb_no(1,1)= 2.0
1056 IF (n_sites == 4) nhb_no(1,2)= 2.0
1062 ALLOCATE( para(lm_n_par) )
1070 WRITE (*,*),
' Input of starting values for fitting-parameters:' 1073 WRITE (*,*),
' GIVE STARTING VALUES FOR PARAMETERS ' 1077 WRITE (*,
'(2a,i2,a,i2,a)') aa_txt(i),
' (param.',i,
' of',lm_n_par,
')' 1078 READ (*,*) (dummy(i,j), j = 1,1)
1079 dummy(i,2) = dummy(i,1) / 10.0
1080 dummy(i,3) = dummy(i,1) / dummy(i,2)
1088 n_sites = nint( sum( nhb_no( 1, 1:nhb_typ(1) ) ) )
1089 IF ( fitopt >= 3 )
THEN 1091 WRITE (*,*)
' The remaining parameters (not-fitted) now' 1092 WRITE (*,*)
' have to be defined:' 1097 IF (fit_array(j) == i) i_fit = 1
1099 IF (i_fit == 0)
THEN 1101 write (*,*)
' Give segm.No.m / Molar Mass :' 1102 READ (*,*) parame(1,1)
1103 parame(1,1) = parame(1,1)*mm(1)
1104 ELSEIF (i == 2)
THEN 1105 write (*,*)
' Give segm.Diameter sigma :' 1106 READ (*,*) parame(1,2)
1107 ELSEIF (i == 3)
THEN 1108 write (*,*)
' Give segm.Energy Param eps/k:' 1109 READ (*,*) parame(1,3)
1110 ELSEIF (i == 4)
THEN 1111 IF ( n_sites == 0)
THEN 1112 write (*,*)
' Give number of association sites,' 1113 write (*,*)
' choose 0 for non-associating compounds' 1116 IF (n_sites /= 0)
THEN 1117 write (*,*)
' Give assoc.-energy eps_AB/k :' 1118 IF (n_sites == 1) nhb_typ(1) = 1
1119 IF (n_sites == 1) nhb_no(1,1)= 1.0
1120 IF (n_sites == 1)
READ (*,*) eps_hb(1,1,1,1)
1121 IF (n_sites == 2) nhb_typ(1) = 2
1122 IF (n_sites == 2) nhb_no(1,1)= 1.0
1123 IF (n_sites == 2) nhb_no(1,2)= 1.0
1124 IF (n_sites == 2)
READ (*,*) eps_hb(1,1,1,2)
1125 IF (n_sites == 2) eps_hb(1,1,2,1) = eps_hb(1,1,1,2)
1126 IF (n_sites == 3) nhb_typ(1) = 2
1127 IF (n_sites == 3) nhb_no(1,1)= 1.0
1128 IF (n_sites == 3) nhb_no(1,2)= 2.0
1129 IF (n_sites == 3)
READ (*,*) eps_hb(1,1,1,2)
1130 IF (n_sites == 3)
READ (*,*) eps_hb(1,1,2,1)
1131 IF (n_sites == 4) nhb_typ(1) = 2
1132 IF (n_sites == 4) nhb_no(1,1)= 2.0
1133 IF (n_sites == 4) nhb_no(1,2)= 2.0
1134 IF (n_sites == 4)
READ (*,*) eps_hb(1,1,1,2)
1135 IF (n_sites == 4)
READ (*,*) eps_hb(1,1,2,1)
1141 ELSEIF (i == 5 .AND. n_sites /= 0.0)
THEN 1142 write (*,*)
' Give assoc.-volume kappa_AB :' 1143 READ (*,*) parame(1,13)
1145 ELSEIF (i == 6)
THEN 1146 write (*,*)
' Give dipolar moment :' 1147 READ (*,*) parame(1,6)
1149 ELSEIF (i == 7 .AND. (parame(1,6) /= 0.0 .OR. dipole == 1))
THEN 1152 ELSEIF (i == 8)
THEN 1153 write (*,*)
' Give quadrupolar moment :' 1154 READ (*,*) parame(1,7)
1156 ELSEIF(i == 9 .AND. (parame(1,7) /= 0.0 .OR. quadrup == 1))
THEN 1159 ELSEIF (i == 11 .AND. (parame(1,6) /= 0.0 .OR. dipole == 1))
THEN 1160 write (*,*)
' Specify polarizability [A**3]' 1161 READ (*,*) parame(1,11)
1163 ELSEIF(i == 11 .AND. (parame(1,7) /= 0.0 .OR. quadrup == 1))
THEN 1164 write (*,*)
' Specify polarizability [A**3]' 1165 READ (*,*) parame(1,11)
1175 IF ( nhb_typ(1) /= 0 )
THEN 1176 parame(1,12) =
REAL(nhb_typ(1))
1181 parame(1,(14+no)) = eps_hb(1,1,j,k)
1186 parame(1,(14+no)) = nhb_no(1,j)
1198 para(i) = dummy(i,3)
1206 WRITE (*,*),
'Input of weighting factors for the different data-sets' 1209 IF ( eqa(1) /= 0 )
THEN 1210 WRITE (*,*),
'weights for density data ?' 1211 type_weight(1) = 1.0
1212 write (*,*) type_weight(1)
1215 IF (eqa(2) /= 0)
THEN 1216 WRITE (*,*),
'weights for vapor pressure data ?' 1217 type_weight(2) = 1.0
1218 write (*,*) type_weight(2)
1221 IF (eqa(3) /= 0)
THEN 1222 WRITE (*,*),
'weights for 2nd virial coefficients ?' 1223 READ (*,*) type_weight(3)
1225 IF (eqa(4) /= 0)
THEN 1226 WRITE (*,*),
'weights for energy data ?' 1227 READ (*,*) type_weight(4)
1231 WRITE (*,*),
'the following weights were specified:' 1233 IF (eqa(1) == 1)
WRITE (*,*),
' density data : ', type_weight(1)
1234 IF (eqa(2) == 1)
WRITE (*,*),
' vapor pressure data : ', type_weight(2)
1235 IF (eqa(3) == 1)
WRITE (*,*),
' 2nd virial coefficients : ', type_weight(3)
1236 IF (eqa(4) == 1)
WRITE (*,*),
' int. res. energy data : ', type_weight(4)
1245 WRITE(23,
'(a)')
' PARAMETER-TYPE PARAM.-START SCALING para' 1246 WRITE(23,
'(a)')
' --------------------------------------------------------------' 1248 WRITE(23,
'(a,t26,G13.6,t41,G13.6,t56,G13.6)') aa_txt(i),dummy(i,1),rel(i),para(i)
1251 WRITE(23,
'(a)')
' WEIGHTS' 1252 WRITE(23,
'(a)')
' -------' 1253 IF (eqa(1) == 1)
WRITE(23,
'(A,T26,F5.2)')
' density data :',type_weight(1)
1254 IF (eqa(2) == 1)
WRITE(23,
'(A,T26,F5.2)')
' vapor pressure data :',type_weight(2)
1255 IF (eqa(3) == 1)
WRITE(23,
'(A,T26,F5.2)')
' 2nd virial coeff. :',type_weight(3)
1256 IF (eqa(4) == 1)
WRITE(23,
'(A,T26,F5.2)')
' energy data :',type_weight(4)
1259 END SUBROUTINE paini
1266 SUBROUTINE pure_output ( lm_n_par, para )
1269 USE pure_fit_parameters
1273 INTEGER,
INTENT(IN) :: lm_n_par
1274 REAL,
INTENT(IN) :: para(:)
1278 REAL :: devi, devimax, devisum, deviav, rms
1279 REAL :: p_deviav,p_devimax,r_deviav,r_devimax
1280 CHARACTER (LEN=4) :: char_len
1289 WRITE (*,*)
'-----------------------------------------------' 1291 WRITE (*,
'(a,2x,f12.6)') aa_txt(i), para(i)*rel(i)
1294 WRITE (*,*)
'-----------------------------------------------' 1298 WRITE (23,
'(T2,A,I2,T26,G16.9)')
'PARAMETER ', i, para(i)*rel(i)
1307 WRITE(23, *)
'-----------------------------------------------' 1308 WRITE(23, *)
' mm(i) =',mm(1)
1312 IF (fit_array(j) == i) ps = j
1315 IF ( i == 1 .AND. ps >= 1 )
THEN 1316 WRITE(23,
'(a,G16.8)')
'! parame(i,1) = mm(i)*',para(ps)*rel(ps)
1317 WRITE(23, *)
' parame(i,1) =',mm(1)*para(ps)*rel(ps)
1318 ELSE IF ( i == 1 )
THEN 1319 WRITE(23,
'(a,G16.8)')
'! parame(i,1) = mm(i)*',parame(1,1)
1320 WRITE(23, *)
' parame(i,1) =',mm(1)*parame(1,1)
1323 IF (i == 2 .AND. ps >= 1)
THEN 1324 WRITE(23, *)
' parame(i,2) =',para(ps)*rel(ps)
1325 ELSE IF (i == 2)
THEN 1326 WRITE(23, *)
' parame(i,2) =',parame(1,2)
1329 IF (i == 3 .AND. ps >= 1)
THEN 1330 WRITE(23, *)
' parame(i,3) =',para(ps)*rel(ps)
1331 ELSE IF (i == 3)
THEN 1332 WRITE(23, *)
' parame(i,3) =',parame(1,3)
1335 IF (parame(1,12) == 2.0)
THEN 1336 IF (i == 4 .AND. ps >= 1)
THEN 1337 WRITE(23, *)
' nhb_typ(i) = ',nint(parame(1,12))
1338 WRITE(23, *)
' nhb_no(i,1) = ',nint(parame(1,18))
1339 WRITE(23, *)
' nhb_no(i,2) = ',nint(parame(1,19))
1340 WRITE(23, *)
' eps_hb(i,i,1,2)= ',para(ps)*rel(ps)
1341 WRITE(23, *)
' eps_hb(i,i,2,1)= ',para(ps)*rel(ps)
1342 WRITE(23, *)
' eps_hb(i,i,1,1)= 0.0' 1343 WRITE(23, *)
' eps_hb(i,i,2,2)= 0.0' 1344 ELSE IF (i == 4)
THEN 1345 WRITE(23, *)
' nhb_typ(i) = ',nint(parame(1,12))
1346 WRITE(23, *)
' nhb_no(i,1) = ',nint(parame(1,18))
1347 WRITE(23, *)
' nhb_no(i,2) = ',nint(parame(1,19))
1348 WRITE(23, *)
' eps_hb(i,i,1,2)= ',parame(1,15)
1349 WRITE(23, *)
' eps_hb(i,i,2,1)= ',parame(1,15)
1350 WRITE(23, *)
' eps_hb(i,i,1,1)= 0.0' 1351 WRITE(23, *)
' eps_hb(i,i,2,2)= 0.0' 1353 IF (i == 5 .AND. ps >= 1)
THEN 1354 WRITE(23, *)
' kap_hb(i,i) = ',para(ps)*rel(ps)
1355 ELSE IF (i == 5)
THEN 1356 WRITE(23, *)
' kap_hb(i,i) = ',parame(1,13)
1358 ELSE IF ( nint(parame(1,12)) == 1 )
THEN 1359 IF (i == 4 .AND. ps >= 1)
THEN 1360 WRITE(23, *)
' nhb_typ(i) = ',nint(parame(1,12))
1361 WRITE(23, *)
' eps_hb(i,i,1,1)= ',para(ps)*rel(ps)
1362 ELSE IF (i == 4)
THEN 1363 WRITE(23, *)
' nhb_typ(i) = ',nint(parame(1,12))
1364 WRITE(23, *)
' eps_hb(i,i,1,1)= ',parame(1,14)
1366 IF (i == 5 .AND. ps >= 1)
THEN 1367 WRITE(23, *)
' kap_hb(i,i) = ',para(ps)*rel(ps)
1368 ELSE IF (i == 5)
THEN 1369 WRITE(23, *)
' kap_hb(i,i) = ',parame(1,13)
1373 IF (i == 6 .AND. ps >= 1)
THEN 1374 WRITE(23, *)
' parame(i,6) = ',para(ps)*rel(ps)
1375 ELSE IF (i == 6 .AND. parame(1,6) /= 0.0)
THEN 1376 WRITE(23, *)
' parame(i,6) = ',parame(1,6)
1378 IF (i == 7 .AND. ps >= 1)
THEN 1379 WRITE(23, *)
' parame(i,8) = ',para(ps)*rel(ps)
1380 ELSE IF (i == 7 .AND. parame(1,8) /= 0.0)
THEN 1381 WRITE(23, *)
' parame(i,8) = ',parame(1,8)
1384 IF (i == 8 .AND. ps >= 1)
THEN 1385 WRITE(23, *)
' parame(i,7) = ',para(ps)*rel(ps)
1386 ELSE IF (i == 8 .AND. parame(1,7) /= 0.0)
THEN 1387 WRITE(23, *)
' parame(i,7) = ',parame(1,7)
1389 IF (i == 9 .AND. ps >= 1)
THEN 1390 WRITE(23, *)
' parame(i,9) = ',para(ps)*rel(ps)
1391 ELSE IF (i == 9 .AND. parame(1,9) /= 0.0)
THEN 1392 WRITE(23, *)
' parame(i,9) = ',parame(1,9)
1394 IF (i == 11 .AND. ps >= 1)
THEN 1395 WRITE(23, *)
' parame(i,11) = ',para(ps)*rel(ps)
1396 ELSE IF (i == 11 .AND. parame(1,11) /= 0.0)
THEN 1397 WRITE(23, *)
' parame(i,11) = ',parame(1,11)
1400 WRITE(23, *)
'-----------------------------------------------' 1435 IF ( eqa(1) == 1 )
THEN 1436 WRITE (23,*)
'------------- fluid density data --------------' 1437 WRITE(23,
'(/A)')
'DATNR AD (%) T/K v_exp/(m3/kg) v_calc/(m3/kg) ' 1444 devi = abs(v_cal(i)-vliq(i))/ (sqrt(abs(vliq(i)))*sqrt(abs(v_cal(i))))*100.0
1445 rms = rms + ((v_cal(i)-vliq(i))/vliq(i))**2
1446 IF (devi > devimax) devimax=devi
1447 devisum = devisum + devi
1448 WRITE(23,
'(i3,2x,G10.3,3(2x,G12.5))') i, devi, tliq(i), vliq(i), v_cal(i)
1450 deviav = devisum /
REAL(nliq)
1451 rms = sqrt( rms /
REAL(nliq) )*100.0
1453 WRITE(23,
'(A)')
'Deviation of calculated to exp. volume data' 1455 WRITE(23,
'(A, t35, F7.3, A)')
'Max. Deviation:',devimax,
' %' 1456 WRITE(23,
'(A, t35, F7.3, A)')
'Average Deviation: ',deviav,
' %' 1457 WRITE(23,
'(A, t35, F7.3, A)')
'RMS: ',rms,
' %' 1467 IF ( eqa(2) == 1 )
THEN 1468 WRITE (23,*)
'------------- vapor pressure data -------------' 1469 WRITE(23,
'(/A)')
'DATNR AD (%) T/K PEXP/PA PCAL/PA' 1476 devi = abs(plvcal(i)-plv(i))/ (sqrt(abs(plv(i)))*sqrt(abs(plvcal(i))))*100.0
1477 rms = rms + ((plvcal(i)-plv(i))/plv(i))**2
1478 IF (devi > devimax) devimax = devi
1479 devisum = devisum + devi
1480 WRITE (23,
'(i3,2x,G10.3,2x,G12.5,2(2x,G14.7))') i, devi, tlv(i), plv(i), plvcal(i)
1482 deviav = devisum /
REAL(nlv)
1483 rms = sqrt( rms /
REAL(nlv)) * 100.0
1485 WRITE(23,
'(A)')
'Deviation of calculated to exp. vapor pressure data' 1487 WRITE(23,
'(3(A, t35, F7.3, A/))')
'Max. Deviation:',devimax,
' %', &
1488 'Average Deviation: ',deviav,
' %',
'RMS: ',rms,
' %' 1498 IF ( eqa(3) == 1 )
THEN 1499 WRITE (23,*)
'---------------2nd virial coeff. --------------' 1500 WRITE (23,
'(/A,A)')
'DATNR AD (%) T/K B_exp B_cal' 1507 devi = abs(b_cal(i)-b_vir(i))/ (sqrt(abs(b_vir(i)))*sqrt(abs(b_cal(i))))*100.0
1508 rms = rms + ((b_cal(i)-b_vir(i))/b_vir(i))**2
1509 IF (devi > devimax) devimax = devi
1510 devisum = devisum + devi
1511 WRITE(23,
'(i3,2x,4(2x,G12.5))') i, devi, t_vir(i), b_vir(i), b_cal(i)
1513 deviav = devisum /
REAL(n_vir)
1514 rms = sqrt( rms /
REAL(n_vir) ) * 100.0
1516 WRITE(23,
'(A)')
'Deviation of calculated to exp. 2nd virial coeff. data' 1518 WRITE(23,
'(3(A, t35, F6.2, A/))')
'Max. Deviation:',devimax,
' %', &
1519 'Average Deviation: ',deviav,
' %',
'RMS: ',rms,
' %' 1528 IF ( eqa(4) == 1 )
THEN 1529 WRITE (23,*)
'---------------- energy data ------------------' 1530 WRITE (23,
'(/A,A)')
'DATNR AD (%) U_EXP U_CAL ' 1537 devi = abs(u_cal(i)-u_en(i))/(sqrt(abs(u_en(i)))*sqrt(abs(u_cal(i))))*100.0
1538 rms = rms + ((u_cal(i)-u_en(i))/u_en(i))**2
1539 IF (devi > devimax) devimax=devi
1540 devisum = devisum + devi
1541 WRITE(23,
'(i3,2x,4(2x,G12.5))') i, devi, t_en(i), u_en(i), u_cal(i)
1543 deviav = devisum /
REAL(n_en)
1544 rms = sqrt( rms /
REAL(n_en) ) * 100.0
1546 WRITE(23,
'(A)')
'Deviation of calculated to exp. internal energy data' 1548 WRITE(23,
'(3(A, t35, F6.2, A/))')
'Max. Deviation:',devimax,
' %', &
1549 'Average Deviation: ',deviav,
' %',
'RMS: ',rms,
' %' 1554 WRITE (char_len,
'(I3)') lm_n_par+5
1555 WRITE(23,
'(a,'//char_len//
'G15.8)') pure_fit_file, mm(1), &
1556 (para(i)*rel(i),i=1,lm_n_par),r_deviav,r_devimax,p_deviav,p_devimax
1560 END SUBROUTINE pure_output
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...