17 INTEGER,
PARAMETER :: mmx = 3500
20 REAL,
DIMENSION(MMX) :: plv, tlv, pliq, tliq, vliq, v_crit1, v_crit2
21 CHARACTER (LEN=30),
DIMENSION(MMX) :: gc_comp1, gc_comp2
27 INTEGER :: n_liq(20), n_lv(20), k_nr
28 REAL,
DIMENSION(MMX) :: plvcal, v_cal
29 CHARACTER (LEN=30) :: subst(20)
55 INTEGER,
PARAMETER :: n_comp = nc
56 INTEGER,
PARAMETER :: n_grs = 20
58 REAL,
DIMENSION(N_comp,N_grs) :: m_gc, msig3, meps, mu_gc, mm_gc
60 INTEGER,
DIMENSION(N_grs) :: n_groups
61 INTEGER,
DIMENSION(N_comp,N_grs) :: gc_groups
62 INTEGER,
DIMENSION(N_comp) :: gc_tot_nr_groups
63 CHARACTER (LEN=20),
DIMENSION(N_comp,N_grs) :: gc_grouptype
76 MODULE mod_para_transfer
80 REAL,
ALLOCATABLE :: para_transfer(:)
82 END MODULE mod_para_transfer
97 SUBROUTINE gc_parameter ( n_species, comp_name )
101 USE mod_para_transfer
105 INTEGER,
INTENT(IN) :: n_species
106 CHARACTER (LEN=30),
INTENT(IN) :: comp_name(n_comp)
108 INTEGER :: i, j, k, jj, no
109 INTEGER,
DIMENSION(nc) :: nhb_typ
110 INTEGER,
DIMENSION(nc,nsite) :: nhb_no
111 REAL,
DIMENSION(nc,nc,nsite,nsite) :: eps_hb
112 REAL,
DIMENSION(nc,nc) :: kap_hb
113 REAL,
DIMENSION(N_comp,N_grs) :: epsilon_hb, kappa_hb
132 CALL get_gc_groups ( n_species, comp_name )
140 DO j = 1, gc_tot_nr_groups(i)
141 IF (gc_grouptype(i,j) ==
'-CH3')
THEN 146 ELSE IF (gc_grouptype(i,j) ==
'-CH2-')
THEN 150 mm_gc(i,j) = 14.02675
151 ELSE IF (gc_grouptype(i,j) ==
'-CH<(branch)')
THEN 156 ELSE IF (gc_grouptype(i,j) ==
'>CH<(2branch)')
THEN 161 ELSE IF (gc_grouptype(i,j) ==
'CH4')
THEN 163 msig3(i,j)= 3.70388767**3
164 meps(i,j) = 150.033987
166 ELSE IF (gc_grouptype(i,j) ==
'-Cl')
THEN 167 m_gc(i,j) = 1.5514 / 2.0
168 msig3(i,j)= 1.5514 / 2.0 * 3.3672**3
169 meps(i,j) = 265.67 * 1.5514 / 2.0
171 ELSE IF (gc_grouptype(i,j) ==
'N(N2)')
THEN 172 m_gc(i,j) = 1.205275098 / 2.0
173 msig3(i,j)= 1.205275098 / 2.0 * 3.3129702**3
174 meps(i,j) = 90.9606924 * 1.205275098 / 2.0
176 ELSE IF (gc_grouptype(i,j) ==
'-CH2-(cyclic6)')
THEN 178 msig3(i,j)= m_gc(i,j) * 3.84990887**3
179 meps(i,j) = m_gc(i,j) * 278.108786
180 mm_gc(i,j) = 14.02675
181 ELSE IF (gc_grouptype(i,j) ==
'-CH2-(cyclic5)')
THEN 183 msig3(i,j)= m_gc(i,j) * 3.71139254**3
184 meps(i,j) = m_gc(i,j) * 265.828755
185 mm_gc(i,j) = 14.02675
186 ELSE IF (gc_grouptype(i,j) ==
'-CH-(aromatic)')
THEN 191 ELSE IF (gc_grouptype(i,j) ==
'-C-R(aromatic)')
THEN 196 ELSE IF (gc_grouptype(i,j) ==
'-O-ether')
THEN 202 ELSE IF (gc_grouptype(i,j) ==
'-OH')
THEN 204 msig3(i,j)= m_gc(i,j) * ( 2.7707 )**3
205 meps(i,j) = m_gc(i,j) * 376.99
208 epsilon_hb(i,j) = 2374.0
209 kappa_hb(i,j) = 0.00698
211 msig3(i,j)= m_gc(i,j) * ( 2.5320 )**3
212 meps(i,j) = m_gc(i,j) * 198.58
215 epsilon_hb(i,j) = para_transfer(1)
216 kappa_hb(i,j) = 0.03256
217 ELSE IF (gc_grouptype(i,j) ==
'CO_Acetone')
THEN 223 ELSE IF (gc_grouptype(i,j) ==
'-CH2-COO-CH2-')
THEN 234 ELSE IF (gc_grouptype(i,j) ==
'-CH2-COO-CH3')
THEN 243 WRITE (*,*)
'GC_PARAMETER: GC-parameter not found !', gc_grouptype(i,j)
259 DO j = 1, gc_tot_nr_groups(i)
260 parame(i,1) = parame(i,1) + m_gc(i,j) *
REAL(gc_groups(i,j))
261 parame(i,2) = parame(i,2) + msig3(i,j) *
REAL(gc_groups(i,j))
262 parame(i,3) = parame(i,3) + meps(i,j) *
REAL(gc_groups(i,j))
263 parame(i,6) = parame(i,6) + mu_gc(i,j) *
REAL(gc_groups(i,j))
264 mm(i) = mm(i) + mm_gc(i,j) *
REAL(gc_groups(i,j))
265 if ( epsilon_hb(i,j) /= 0.0 )
then 266 if ( n_species > 1 )
write (*,*)
'extend GC method' 267 if ( n_species > 1 ) stop
269 eps_hb(1,1,1,2) = epsilon_hb(i,j)
270 eps_hb(1,1,2,1) = eps_hb(1,1,1,2)
271 kap_hb(i,i)= kappa_hb(i,j)
275 IF (nhb_typ(i) /= 0)
THEN 276 parame(i,12) =
REAL(nhb_typ(i))
277 parame(i,13) = kap_hb(i,i)
281 parame(i,(14+no))=eps_hb(i,i,jj,k)
286 parame(i,(14+no))=
REAL(nhb_no(i,jj))
296 parame(i,2) = ( parame(i,2)/parame(i,1) )**(1.0/3.0)
297 parame(i,3) = parame(i,3)/parame(i,1)
301 IF (parame(i,1) == 0.0)
THEN 302 WRITE (*,*)
'error in GC_PARAMETER ',comp_name(i)
310 END SUBROUTINE gc_parameter
325 SUBROUTINE get_gc_groups ( n_species, comp_name )
329 use utilities
, only: file_open
333 INTEGER,
INTENT(IN) :: n_species
334 CHARACTER (LEN=30),
INTENT(IN) :: comp_name(n_comp)
338 INTEGER :: n_comps, tot_n_groups
339 CHARACTER (LEN=30) :: c_name
340 CHARACTER (LEN=50) :: gc_file
341 CHARACTER (LEN=20) :: dum, grouptype(n_grs)
347 gc_file =
'./input_file/gc_method/gc_groups.inp' 348 CALL file_open(gc_file,85)
349 READ(85,*) dum, n_comps
353 READ(85,*) c_name, tot_n_groups, n_groups(1), dum, grouptype(1)
354 DO j = 2, tot_n_groups
355 READ(85,*) n_groups(j), dum, grouptype(j)
358 IF (c_name == comp_name(i) )
THEN 359 gc_tot_nr_groups(i) = tot_n_groups
360 DO j = 1, gc_tot_nr_groups(i)
361 gc_groups(i,j) = n_groups(j)
362 gc_grouptype(i,j) = grouptype(j)
369 END SUBROUTINE get_gc_groups
384 SUBROUTINE gc_residual (lm_m_dat, lm_n_par, para, fvec, iflag)
389 USE gc_group
, ONLY: n_comp
390 USE mod_para_transfer
391 use utilities
, only: dens_calc, si_dens
396 INTEGER,
INTENT(IN) :: lm_m_dat
397 INTEGER,
INTENT(IN) :: lm_n_par
398 REAL,
INTENT(IN) :: para(:)
399 REAL,
INTENT(IN OUT) :: fvec(:)
400 INTEGER,
INTENT(IN OUT) :: iflag
404 INTEGER :: converg, crit_dat
406 REAL :: toterr, plv_dum, v_dum
407 REAL :: density(np), w(np,nc)
409 LOGICAL :: scan, vapor, nocon = .false.
410 CHARACTER (LEN=30) :: comp_name(n_comp)
411 CHARACTER (LEN=4) :: char_len
414 ALLOCATE( para_transfer(lm_n_par) )
421 WRITE (char_len,
'(I3)') lm_n_par
422 IF (iflag == 1)
WRITE (*,
'(a,'//char_len//
'(1x,G21.14))')
' parameter ', (para(i),i=1,lm_n_par)
429 comp_name(1) = gc_comp1(i)
433 CALL gc_parameter ( 1, comp_name )
435 IF (gc_comp1(i) /= gc_comp1(i-1))
THEN 438 CALL gc_parameter ( 1, comp_name )
443 IF ( pliq(i) > 0.0 )
THEN 457 IF (vliq(i) <= v_crit1(i))
THEN 468 IF (scan) densta(1) = densta(1) + 0.002
470 CALL dens_calc ( rho_phas )
471 CALL si_dens ( density, w )
472 v_cal(i) = 1.0 / density(1)
474 IF ((v_cal(i)-vliq(i))*1.d2/vliq(i) < 5.0 .AND. .NOT. scan)
THEN 475 d_kond(1,i) = dense(1)
481 IF ( vapor .AND. (1.0/density(1)) <= (v_crit1(i)/1.1) )
THEN 482 IF ( densta(1) <= 0.228 )
THEN 489 IF ( dense(1) > 0.55 )
WRITE (*,*)
'density ',i,dense(1)
492 IF (nocon) weigh = weigh / 4.0
494 fvec(j_dat) = weigh * (v_cal(i)-vliq(i))/ &
495 ( sqrt(abs(vliq(i))) * sqrt(abs(v_cal(i))) )
511 val_init(3) = tliq(i)
513 IF (d_kond(1,j_dat) /= 0.0) val_init(1)=d_kond(1,j_dat)
514 IF (d_kond(2,j_dat) /= 0.0) val_init(2)=d_kond(2,j_dat)
515 IF (d_kond(1,j_dat) /= 0.0 .AND. d_kond(2,j_dat) /= 0.0) val_init(4) = plv_kon(j_dat)
519 CALL pure_equilibrium_fit ( crit_dat, tc, tliq(i), pliq(i), converg, v_cal(i), plv_dum )
521 IF (converg == 1)
THEN 522 d_kond(1,j_dat) = dense(1)
523 d_kond(2,j_dat) = dense(2)
524 plv_kon(j_dat) = val_conv(4)
526 d_kond(1,j_dat) = 0.0
527 d_kond(2,j_dat) = 0.0
528 plv_kon(j_dat) = 10.0
530 v_cal(i) = vliq(i) * 0.75
531 IF (crit_dat == 1 .AND. tliq(i) > tc ) v_cal(i) = vliq(i)*1.1
535 IF ( nocon ) weigh = weigh / 4.0
537 fvec(j_dat) = weigh * (v_cal(i)-vliq(i))/ &
538 (sqrt(abs(vliq(i)))*sqrt(abs(v_cal(i))))
554 comp_name(1) = gc_comp2(i)
558 CALL gc_parameter ( 1, comp_name )
560 IF(gc_comp2(i) /= gc_comp2(i-1))
THEN 563 CALL gc_parameter ( 1, comp_name )
575 IF (d_kond(1,j_dat) /= 0.0) val_init(1) = d_kond(1,j_dat)
576 IF (d_kond(2,j_dat) /= 0.0) val_init(2) = d_kond(2,j_dat)
577 IF (d_kond(1,j_dat) /= 0.0 .AND. d_kond(2,j_dat) /= 0.0) val_init(4) = plv_kon(j_dat)
581 CALL pure_equilibrium_fit ( crit_dat, tc, tlv(i), plv(i), converg, v_dum, plvcal(i) )
583 IF (converg == 1)
THEN 584 d_kond(1,j_dat) = dense(1)
585 d_kond(2,j_dat) = dense(2)
586 plv_kon(j_dat) = val_conv(4)
588 d_kond(1,j_dat) = 0.0
589 d_kond(2,j_dat) = 0.0
590 plv_kon(j_dat) = plv(i)
591 IF ( crit_dat == 1 .AND. tc > tlv(i) )
THEN 592 plvcal(i) = plv(i) * 0.75
595 WRITE (*,
'(a,i4,4G15.5)')
' loose ! ', i, tlv(i), t, tc, plv(i)
599 IF (plvcal(i-2) > 0.0 .AND. plvcal(i-1) > 0.0 .AND. &
600 tlv(i-1) /= tlv(i-2))
THEN 601 plvcal(i) = exp( log(plvcal(i-1)) + (log(plvcal(i-1))-log(plvcal(i-2))) &
602 /(1.0/tlv(i-1)-1.0/tlv(i-2)) *(1.0/tlv(i)-1.0/tlv(i-1)) )
609 fvec(j_dat) = 0.2 * abs( plvcal(i)-plv(i) )/ &
610 ((sqrt(abs(plv(i)))*sqrt(abs(plvcal(i)))))**0.85
612 IF (tc < tlv(i).AND.crit_dat == 1)
THEN 613 fvec(j_dat) = fvec(j_dat) + 5.0 * abs(tlv(i)-tc) + 2.0
614 WRITE(*,
'(a,i3,1x,a22,2(f15.5))')
' skipped ! ',i,gc_comp2(i), tlv(i),tc
625 toterr = toterr + fvec(i)**2
627 WRITE (*,*)
'--- error ---',toterr
629 IF ( j_dat /= lm_m_dat )
WRITE (*,*)
'ERROR in GC_RESIDUAL', j_dat, lm_m_dat
631 DEALLOCATE( para_transfer )
633 END SUBROUTINE gc_residual
652 SUBROUTINE gc_fitting
655 USE levenberg_marquardt
661 SUBROUTINE gc_residual(lm_m_dat, lm_n_par, para, fvec, iflag)
663 INTEGER,
INTENT(IN) :: lm_m_dat, lm_n_par
664 REAL,
INTENT(IN) :: para(:)
665 REAL,
INTENT(IN OUT) :: fvec(:)
666 INTEGER,
INTENT(IN OUT) :: iflag
667 END SUBROUTINE gc_residual
674 INTEGER,
ALLOCATABLE :: ipvt(:)
675 REAL,
ALLOCATABLE :: para(:)
676 REAL,
ALLOCATABLE :: fvec(:)
683 REAL :: av_dev, max_dev, rms
692 IF ( num == 0 ) epsfcn = 1.0e-6**2
693 IF ( num == 1 ) epsfcn = 1.0e-5**2
703 ALLOCATE( fvec(lm_m_dat) )
704 ALLOCATE( para(lm_n_par) )
705 ALLOCATE( ipvt(lm_n_par) )
715 CALL gc_datin ( lm_m_dat )
721 CALL lmdif1(gc_residual,lm_m_dat,lm_n_par,para,fvec,tol,epsfcn,lm_factor,info,ipvt)
731 OPEN (23,file=
'./output_file/gc_method/'//trim( adjustl( subst(k) ))//
'.dat')
733 WRITE(23,*)
'----------------------------------------------------' 737 WRITE(23,*)
' liquid density data' 738 WRITE(23,*)
' no T/K p/bar rho/(kg/m**3) rho_cal/(kg/m**3) err%' 742 n0 = sum( n_liq(1:k-1) )
743 DO i = n0+1 , n0+n_liq(k)
744 WRITE(23,
'( I3, 2X, 5(2x,G14.6) )') i-n0, tliq(i), &
745 pliq(i)/1.d5,1.0/vliq(i),1.0/v_cal(i), (vliq(i)/v_cal(i)-1.0)*100.0
746 max_dev = max( max_dev, abs(vliq(i)/v_cal(i)-1.0)*100.0 )
747 rms = rms + (vliq(i)/v_cal(i)-1.0)**2
748 av_dev = av_dev + abs(vliq(i)/v_cal(i)-1.0)*100.0
750 av_dev = av_dev /
REAL(n_liq(k))
751 rms = sqrt( rms /
REAL(n_liq(k)) )*100.0
753 WRITE(23,*)
'Deviation of calculated to exp. density data' 755 WRITE(23,
'(3(A, t35, F7.3, A/))')
'Max. Deviation:',max_dev,
' %', &
756 'Average Deviation: ',av_dev,
' %',
'RMS: ',rms,
' %' 762 WRITE(23,*)
' vapor pressure data' 763 WRITE(23,*)
' no T/K psat_exp/bar psat_cal/bar err%' 767 n0 = sum( n_lv(1:k-1) )
768 DO i = n0+1, n0+n_lv(k)
769 WRITE(23,
'( I3, 2X, 4(2x,G14.6) )') i-n0, tlv(i), plv(i)/1.e5, &
770 plvcal(i)/1.e5,(plvcal(i)-plv(i))/plv(i)*100.0
771 max_dev = max( max_dev, abs(plvcal(i)-plv(i))/plv(i)*100.0 )
772 rms = rms + ( (plvcal(i)-plv(i))/plv(i) )**2
773 av_dev = av_dev + abs(plvcal(i)-plv(i))/plv(i) * 100.0
775 av_dev = av_dev /
REAL(n_lv(k))
776 rms = sqrt( rms /
REAL(n_lv(k)) )*100.0
778 WRITE(23,*)
'Deviation of calculated to exp. vapor pressure data' 780 WRITE(23,
'(3(A, t35, F7.3, A/))')
'Max. Deviation:',max_dev,
' %', &
781 'Average Deviation: ',av_dev,
' %',
'RMS: ',rms,
' %' 788 DEALLOCATE( fvec, para, ipvt )
790 END SUBROUTINE gc_fitting
801 SUBROUTINE gc_datin ( lm_m_dat )
808 INTEGER,
INTENT(OUT) :: lm_m_dat
810 INTEGER :: datnr, i, k, n0
811 REAL :: v_crit, tlv_tmp, plv_tmp
812 CHARACTER (LEN=1) :: info*80
844 subst(1) =
'dimethyl-ether' 852 OPEN (22,file=
'./input_file/gc_method/pure_comp/' &
853 //trim( adjustl( subst(k) ))//
'.dat')
859 READ(22,
'(A80)') info
861 READ(22,*) mm(1), v_crit
864 READ(22,
'(A80)') info
866 READ(22,*) n_liq(k) ,n_lv(k)
867 READ(22,
'(A80)') info
868 READ(22,
'(A80)') info
875 DO i = n0+1 , n0+n_liq(k)
876 READ(22,*) datnr,pliq(i),tliq(i),vliq(i)
878 gc_comp1(i) = subst(k)
881 READ(22,
'(A80)') info
882 READ(22,
'(A80)') info
888 DO i = n0+1, n0+n_lv(k)
889 READ(22,*) datnr,plv_tmp,tlv_tmp
890 IF (plv_tmp > 20.0)
THEN 894 gc_comp2(nlv) = subst(k)
895 v_crit2(nlv) = v_crit
904 lm_m_dat = nliq + nlv
906 END SUBROUTINE gc_datin
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains constant...
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW This module contains paramete...