Introduction
Source terms modelling condensation inside the fluid domain on internal metal structures and at the boundaries can be set respectively through the subroutines cs_user_metal_structures_source_terms and cs_user_boundary_mass_source_terms.
Source terms for condensation on internal metal structures
This model can be enabled in the subroutine usppmo in the file cs_user_parameters.f90 as follows:
if ( ippmod(igmix).ge.0 ) then
icondv = -1
endif
The setting of the condensation source terms is then done in the subroutine cs_user_metal_structures_source_terms as follows below.
The following variables need to be declared:
integer icmst
integer ifac, iel, iscal
integer ivarh
integer izone
integer f_id
double precision hvap, tk
type(gas_mix_species_prop) s_h2o_g
double precision, dimension(:), pointer :: cpro_cp
double precision, dimension(:), pointer :: cvar_h
Necessary species physical properties can be retrieved as follows:
call field_get_id_try("y_h2o_g", f_id)
if (f_id.ne.-1) &
call field_get_key_struct_gas_mix_species_prop(f_id, s_h2o_g)
The zones on which the condensation mass source term will be imposed can be defined as follows:
izone = 0
met_znb = 1
do izmet = 1 , met_znb
if (izmet.eq.1) then
call getcel(
'z > -7.0d0 and z < 53.d0', ncmast, ltmast)
izone = izone + 1
do icmst = 1, ncmast
iel = ltmast(icmst)
izmast(iel) = izone
enddo
endif
enddo
Modelling of the metal side (wall thermal model and metal properties can then be specified as follows:
if (icondv.eq.0) then
itagms = 1
if(itagms.eq.1) then
xem = 0.024d0
tmet0 = 92.d0
xro_m = 8000.d0
xcond_m = 12.8d0
xcp_m = 500.0d0
else
tmet = 92.d0
endif
endif
Finally the source term type and values have to be set as follows:
if (icp.ge.0) call field_get_val_s(icp, cpro_cp)
ivarh = isca(iscalt)
call field_get_val_s(ivarfl(ivarh), cvar_h)
do icmst = 1, ncmast
iel = ltmast(icmst)
if (ntcabs.le.1) then
tk = t0
else
tk = cvar_h(iel)/cpro_cp(iel)
endif
hvap = s_h2o_g%cp*tk
if (nscal.gt.0) then
do iscal = 1, nscal
if (iscal.eq.iscalt) then
itypst(iel,isca(iscalt)) = 1
svcond(iel,isca(iscalt)) = hvap
else
itypst(iel,isca(iscal)) = 1
svcond(iel,isca(iscal)) = 0.d0
endif
enddo
endif
enddo
Boundary source terms for condensation
The following variables need to be declared:
integer ieltcd, ii, iz
integer ifac, iel, iesp, iscal
integer ivarh
integer ilelt, nlelt
integer izone
integer f_id
double precision hvap, tk
type(gas_mix_species_prop) s_h2o_g
integer, allocatable, dimension(:) :: lstelt
double precision, dimension(:), pointer :: cpro_cp
double precision, dimension(:), pointer :: cvar_h
Necessary species physical properties can be retrieved as follows:
allocate(lstelt(nfabor))
call field_get_id_try("y_h2o_g", f_id)
if (f_id.ne.-1) &
call field_get_key_struct_gas_mix_species_prop(f_id, s_h2o_g)
The subroutine cs_user_boundary_mass_source_terms is called three times.
At the first call the number of boundary faces and number of zones on which a boundary mass source term is imposed is computed according to the selection criteria prescribed by the user.
if (iappel.eq.1.or.iappel.eq.2) then
izone = 0
ieltcd = 0
call getfbr(
'60 and box[-0.03,0.0,0.5,0.03,0.6,1.22]',nlelt,lstelt)
izone = izone + 1
do ilelt = 1, nlelt
ifac = lstelt(ilelt)
iel = ifabor(ifac)
ieltcd = ieltcd + 1
if (iappel.eq.2) then
ifbpcd(ieltcd) = ifac
izzftcd(ieltcd) = izone
endif
enddo
if (irangp.le.0.and.iappel.eq.2.and.ieltcd.gt.0) then
write(*,*) "izzftcd(",izone,")= ", izzftcd(ieltcd)
endif
call getfbr(
'60 and box[-0.03,0.0,1.22,0.03,0.6,2.55]', nlelt, lstelt)
izone = izone + 1
do ilelt = 1, nlelt
ifac = lstelt(ilelt)
iel = ifabor(ifac)
ieltcd = ieltcd + 1
if (iappel.eq.2) then
ifbpcd(ieltcd) = ifac
izzftcd(ieltcd) = izone
endif
enddo
if (irangp.le.0.and.iappel.eq.2.and.ieltcd.gt.0) then
write(*,*) "izzftcd(",izone,")= ", izzftcd(ieltcd)
endif
endif
if (iappel.eq.1) then
nfbpcd = ieltcd
nzones = izone
endif
The above part of the subroutine is also executed at the second call. In addition, at the second call, condensation models are chosen.
if (iappel.eq.2) then
do ii = 1, nfbpcd
iz = izzftcd(ii)
if (iz.eq.1.and.icondb.eq.0) then
izcophc(iz) = 3
izcophg(iz) = 3
iztag1d(iz) = 1
if (iztag1d(iz).eq.1) then
ztheta(iz) = 1.d0
zdxmin(iz) = 0.d0
znmur(iz) = 10
zepais(iz) = 0.024d0
ztpar0(iz) = 26.57d0
endif
endif
enddo
if (irangp.ge.0) then
call parimx(nzones, izcophc)
call parimx(nzones, izcophg)
call parimx(nzones, iztag1d)
call parrmx(nzones, ztheta)
call parrmx(nzones, zdxmin)
call parimx(nzones, znmur )
call parrmx(nzones, zepais)
call parrmx(nzones, ztpar0)
endif
Finally at the third call, the source term types and values have to be set.
elseif (iappel.eq.3) then
if (icp.ge.0) call field_get_val_s(icp, cpro_cp)
ivarh = isca(iscalt)
call field_get_val_s(ivarfl(ivarh), cvar_h)
do ii = 1, nfbpcd
ifac = ifbpcd(ii)
iel = ifabor(ifac)
iz = izzftcd(ii)
if (icondb.eq.0) then
if (iztag1d(iz).eq.1) then
zhext(iz) = 1.d+8 ; ztext(iz) = 26.57d0
zrob(iz) = 8000.d0
zcondb(iz) = 12.8d0
zcpb(iz) = 500.0d0
else
ztpar(iz) = 26.57d0
endif
elseif (iz.eq.2.and.icondb.eq.0) then
if (iztag1d(iz).eq.1) then
zhext(iz) = 1.d+8 ; ztext(iz) = 26.57d0
zrob(iz) = 8000.d0
zcondb(iz) = 12.8d0
zcpb(iz) = 500.0d0
else
ztpar(iz) = 26.57d0
endif
endif
if (ntcabs.le.1) then
tk = t0
else
tk = cvar_h(iel)/cpro_cp(iel)
endif
hvap = s_h2o_g%cp*tk
itypcd(ii,iu) = 0
spcond(ii,iu) = 0.d0
itypcd(ii,iv) = 0
spcond(ii,iv) = 0.d0
itypcd(ii,iw) = 0
spcond(ii,iw) = 0.d0
if (itytur.eq.2) then
itypcd(ii,ik ) = 0
spcond(ii,ik ) = 0.d0
itypcd(ii,iep) = 0
spcond(ii,iep) = 0.d0
endif
if (nscal.gt.0) then
do iscal = 1, nscal
if (iscal.eq.iscalt) then
itypcd(ii,isca(iscalt)) = 1
spcond(ii,isca(iscalt)) = hvap
else
itypcd(ii,isca(iscal)) = 1
spcond(ii,isca(iscal)) = 0.d0
endif
enddo
endif
enddo
if (irangp.ge.0) then
call parrmx(nzones, zhext)
call parrmx(nzones, ztext)
call parrmx(nzones, zrob )
call parrmx(nzones, zcondb)
call parrmx(nzones, zcpb )
call parrmx(nzones, ztpar)
endif
endif