35 & ( i,tn,tfrz,dt,srcgm_exp,srcgm_imp,sum_srcgm,sum_frzl,
36 & eps,alpha,nut,constss,limflag)
62 & rho_ice,lh_ice,tc_wt,rk_frzl,ek_frzl,vk_frzl,
63 & nusst,nussi,nuss,itgm,minnk,iseed
68 TYPE(bief_obj),
INTENT(IN) :: TN
69 INTEGER,
INTENT(IN) :: I
70 LOGICAL,
INTENT(INOUT) :: LIMFLAG
71 DOUBLE PRECISION,
INTENT(IN) :: DT,TFRZ,CONSTSS
72 DOUBLE PRECISION,
INTENT(IN) :: EPS,ALPHA,NUT
73 DOUBLE PRECISION,
INTENT(INOUT) :: SUM_SRCGM,SUM_FRZL
74 DOUBLE PRECISION,
INTENT(INOUT) :: SRCGM_EXP(
nc_fra)
75 DOUBLE PRECISION,
INTENT(INOUT) :: SRCGM_IMP(
nc_fra)
76 DOUBLE PRECISION,
PARAMETER :: EPS0 = 1.d-8
81 DOUBLE PRECISION :: TW,QK
82 DOUBLE PRECISION :: CF(
nc_fra)
83 DOUBLE PRECISION :: SRCGM(
nc_fra)
84 DOUBLE PRECISION :: RM1,RP1,FACT
85 DOUBLE PRECISION :: MAXDT0,SRGMSTB
90 tw = tn%ADR(
ind_t)%P%R(i)
93 cf(k) = tn%ADR(j)%P%R(i)
107 ELSE IF (nussi.EQ.2)
THEN 108 nusst(k) =
nusselt(rk_frzl(k), eps, alpha, nut)
113 qk = nusst(k)*tc_wt/rk_frzl(k)
114 srcgm(k) = 2.d0*qk/(rk_frzl(k)*rho_ice*lh_ice)
116 ELSE IF(tw.GT.tfrz)
THEN 117 qk = nusst(k)*tc_wt/rk_frzl(k)
118 fact = (1.d0/ek_frzl(k)) + (1.d0/rk_frzl(k))
119 srcgm(k) = 2.d0*qk*fact/(rho_ice*lh_ice)
120 IF ((iseed.EQ.1).AND.
121 & (tn%ADR(j)%P%R(i).LE.minnk*vk_frzl(k)/
nc_fra))
THEN 130 srcgm(k) = srcgm(k)*(tfrz-tw)*cf(k)
156 srcgm_exp(k) = max(-tn%ADR(j)%P%R(i)/dt, srcgm(k))
160 rm1 = (rk_frzl(max(k-1, 1))/rk_frzl(k))**3
161 rp1 = (rk_frzl(min(k+1,
nc_fra))/rk_frzl(k))**3
166 srcgm_exp(k) =-srcgm(k)/(rp1-1.d0)
168 srcgm_exp(k) = srcgm(k-1)/(1.d0-rm1)
170 srcgm_exp(k) = srcgm(k-1)/(1.d0-rm1)-srcgm(k)/(rp1-1.d0)
174 ELSEIF(tw.GT.tfrz)
THEN 176 srcgm_exp(k) = srcgm(k)-srcgm(k+1)/(rp1-1.d0)
178 srcgm_exp(k) = srcgm(k)/(1.d0-rm1)
180 srcgm_exp(k) = srcgm(k)/(1.d0-rm1)-srcgm(k+1)/(rp1-1.d0)
189 IF (srcgm_exp(k).LE.-tn%ADR(j)%P%R(i)/dt)
THEN 191 srcgm_exp(k) = -tn%ADR(j)%P%R(i)/dt
196 sum_srcgm = sum_srcgm + srcgm_exp(k)
201 ELSEIF(itgm.EQ.2)
THEN 206 srcgm_imp(k) = srcgm(k)*(tfrz-tw)
207 srcgm(k) = srcgm(k)*cf(k)
211 rm1 = (rk_frzl(max(k-1, 1))/rk_frzl(k))**3
212 rp1 = (rk_frzl(min(k+1,
nc_fra))/rk_frzl(k))**3
218 srcgm_imp(k) =-srcgm(k)*(tfrz-tw)/(rp1-1.d0)
220 srcgm_exp(k) = srcgm(k-1)*(tfrz-tw)*cf(k-1)/(1.d0-rm1)
223 srcgm_exp(k) = srcgm(k-1)*(tfrz-tw)*cf(k-1)/(1.d0-rm1)
224 srcgm_imp(k) =-srcgm(k)*(tfrz-tw)/(rp1-1.d0)
228 ELSEIF(tw.GT.tfrz)
THEN 230 srcgm_exp(k) =-srcgm(k+1)*(tfrz-tw)*cf(k+1)/(rp1-1.d0)
231 srcgm_imp(k) = srcgm(k)*(tfrz-tw)
234 srcgm_imp(k) = srcgm(k)*(tfrz-tw)/(1.d0-rm1)
236 srcgm_exp(k) =-srcgm(k+1)*(tfrz-tw)*cf(k+1)/(rp1-1.d0)
237 srcgm_imp(k) = srcgm(k)*(tfrz-tw)/(1.d0-rm1)
247 IF (srcgm_exp(k).LE.-tn%ADR(j)%P%R(i)/dt)
THEN 249 srcgm_exp(k) = -tn%ADR(j)%P%R(i)/dt
255 sum_srcgm = sum_srcgm + srcgm_exp(k)/(tfrz-tw)
256 & + srcgm_imp(k)*cf(k)/(tfrz-tw)
262 sum_frzl = sum_frzl + cf(k)
269 IF(sum_srcgm.GT.eps0)
THEN 271 maxdt0 = min(2.d0/(rho_ice*lh_ice*constss*srgmstb
272 & *max(eps0, sum_frzl)),
273 & 1.d0/(srgmstb*max(eps0, abs(tw))))
274 ELSEIF(itgm.EQ.2)
THEN 275 maxdt0 = 1.d0/(srgmstb*max(eps0, abs(tw)))
278 IF( dt.GT.maxdt0)
THEN 280 WRITE(
lu,*)
'STABILITY OF THERMAL GROWTH ' 281 WRITE(
lu,*)
'OR POSITIVITY OF FRAZIL CONC. ' 282 WRITE(
lu,*)
'MAY BE COMPROMISED ' 284 WRITE(
lu,*)
'MAKE SURE TIME STEP ' 285 WRITE(
lu,*)
'IS LOWER THAN ', maxdt0
286 WRITE(
lu,*)
'OR CHECK MODEL PARAMETERS ' 303 & ( i, tn, tfrz, srcse, minflag )
326 TYPE(bief_obj),
INTENT(INOUT) :: TN
327 LOGICAL,
INTENT(INOUT) :: MINFLAG
328 DOUBLE PRECISION,
INTENT(INOUT) :: SRCSE(
nc_fra)
329 DOUBLE PRECISION,
INTENT(IN) :: TFRZ
330 INTEGER,
INTENT(IN) :: I
334 INTEGER :: K,J,FROZNB
349 ELSE IF((iseed.EQ.1).OR.(iseed.EQ.3))
THEN 363 IF ((tn%ADR(
ind_t)%P%R(i).GT.tfrz).AND.
368 IF (froznb.EQ.
nc_fra)
THEN 377 ELSE IF((iseed.EQ.2).OR.(iseed.EQ.3))
THEN 404 & ( i, tn, dt, srcsn, eps, limflag, minflag )
424 & rk_frzl, vk_frzl, vbk, snnmax
429 TYPE(bief_obj),
INTENT(IN) :: TN
430 INTEGER,
INTENT(IN) :: I
431 LOGICAL,
INTENT(IN) :: LIMFLAG, MINFLAG
432 DOUBLE PRECISION,
INTENT(INOUT) :: SRCSN(
nc_fra)
433 DOUBLE PRECISION,
INTENT(IN) :: DT,EPS
438 DOUBLE PRECISION :: SUMSN,WTSQ,CF,WRK,NTILDE
439 DOUBLE PRECISION,
PARAMETER :: PI = 4.d0*atan(1.d0)
446 IF((
isnuc.EQ.0).OR.(
nc_fra.EQ.1).OR.limflag.OR.minflag)
THEN 454 ELSE IF(
isnuc.EQ.1)
THEN 460 cf = tn%ADR(j)%P%R(i)
461 ntilde = ntilde + cf/vk_frzl(k)
463 ntilde = min(snnmax, ntilde)
465 IF(ntilde.GT.1.d0)
THEN 470 cf = tn%ADR(j)%P%R(i)
472 wtsq = (4.d0/15.d0)*(eps/
xnu)*rk_frzl(k)**2
474 wrk = sqrt(wtsq + vbk(k)**2)
476 srcsn(k) = -pi*ntilde*wrk*cf*rk_frzl(k)**2
478 srcsn(k) = max(-cf/dt, srcsn(k))
480 sumsn = sumsn + srcsn(k)
494 ELSE IF(
isnuc.EQ.2)
THEN 500 cf = tn%ADR(j)%P%R(i)
501 ntilde = ntilde + cf/vk_frzl(k)
503 ntilde = min(snnmax, ntilde)
505 IF(ntilde.GT.1.d0)
THEN 510 cf = tn%ADR(j)%P%R(i)
512 wtsq = (4.d0/15.d0)*(eps/
xnu)*rk_frzl(k)**2
514 wrk = sqrt(wtsq + vbk(k)**2)
516 srcsn(k) = -pi*ntilde*wrk*cf*rk_frzl(k)**2
518 srcsn(k) = max(-cf/dt, srcsn(k))
520 sumsn = sumsn + srcsn(k)
521 srcsn(k) = srcsn(k)*(rk_frzl(1)/rk_frzl(k))**3
547 & ( i, tn, dt, srcfb, limflag, minflag )
571 TYPE(bief_obj),
INTENT(IN) :: TN
572 LOGICAL,
INTENT(IN) :: LIMFLAG, MINFLAG
573 INTEGER,
INTENT(IN) :: I
574 DOUBLE PRECISION,
INTENT(IN) :: DT
575 DOUBLE PRECISION,
INTENT(INOUT) :: SRCFB(
nc_fra)
580 DOUBLE PRECISION :: CF, CF0
581 DOUBLE PRECISION :: BETA, BETA0
588 IF((ifloc.EQ.0).OR.(
nc_fra.EQ.1).OR.limflag.OR.minflag)
THEN 596 ELSE IF(ifloc.EQ.1)
THEN 601 cf = tn%ADR(j)%P%R(i)
603 beta = min(1.d0/dt, beta)
608 cf0 = tn%ADR(j-1)%P%R(i)
612 cf = tn%ADR(j)%P%R(i)
613 cf0 = tn%ADR(j-1)%P%R(i)
616 beta = min(1.d0/dt, beta)
617 srcfb(k) = -beta*cf + beta0*cf0
637 & ( i, vmag, h, kt, eps, alpha, nut, cf, ak, ep, iturb_tel)
664 TYPE(bief_obj),
INTENT(IN) :: AK,EP
665 INTEGER,
INTENT(IN) :: I,ITURB_TEL
666 DOUBLE PRECISION,
INTENT(IN) :: VMAG,H,CF
667 DOUBLE PRECISION,
INTENT(INOUT) :: KT,EPS,ALPHA,NUT
671 DOUBLE PRECISION,
PARAMETER :: KARMAN_CONST = 0.4d0
672 DOUBLE PRECISION,
PARAMETER :: HEPS = 1.d-3
673 DOUBLE PRECISION,
PARAMETER :: UEPS = 1.d-6
674 DOUBLE PRECISION :: USTAR,FACT0,FACT1,HTEMP
689 ELSE IF(
iturb.EQ.1)
THEN 690 ustar = 0.5d0 * cf * vmag * vmag
693 fact0 = (htemp/2.d0 -
xnu/ustar +
xnu**2/(2.d0*htemp*ustar**2))
694 fact1 = (log(htemp*ustar/
xnu) - 1.d0 +
xnu/(htemp*ustar))
695 kt = (ustar**2)*fact0/0.3d0
696 eps = (ustar**3)*fact1/karman_const
702 ELSE IF(
iturb.EQ.2)
THEN 703 IF(iturb_tel.NE.3)
THEN 705 WRITE(
lu,*)
'TURBULENCE ESTIMATION MODEL',
iturb 706 WRITE(
lu,*)
'MUST BE USED WITH K-EPS MODEL' 708 WRITE(
lu,*)
'PLEASE SET TURBULENCE MODEL = 3' 709 WRITE(
lu,*)
'IN T2D STEERING FILE' 720 WRITE(
lu,*)
'TURBULENCE ESTIMATION MODEL',
iturb 721 WRITE(
lu,*)
'NOT IMPLEMENTED' 727 nut = 0.09d0*kt**2/eps
728 alpha = sqrt(2.d0*kt)/max(ueps, vmag)
741 DOUBLE PRECISION FUNCTION nusselt 744 & ( radius, eps, alpha, nut )
764 DOUBLE PRECISION,
INTENT(IN) :: RADIUS, ALPHA, EPS, NUT
765 DOUBLE PRECISION :: MSTAR, KOLML, PR, PR12, PR13
769 kolml = (
xnu**3/eps)**(0.25d0)
773 pr13 = pr**(1.d0/3.d0)
775 IF (mstar .LE. 1.d0/pr12)
THEN 776 nusselt = 1.d0 + 0.17d0*mstar*pr12
777 ELSE IF ((1.d0/pr12 .LT. mstar) .AND. (mstar .LE. 1.d0))
THEN 778 nusselt = 1.d0 + 0.55d0*(mstar**(2.d0/3.d0))*pr13
779 ELSE IF (mstar .GT. 1.d0)
THEN 780 IF (alpha*mstar**(4.d0/3.d0) .LE. 1.d3)
THEN 781 nusselt = 1.1d0 + 0.77d0*(alpha**0.035d0)
782 & *(mstar**(2.d0/3.d0))*pr13
784 nusselt = 1.1d0 + 0.77d0*(alpha**0.25d0)*mstar*pr13
802 & ( radius, thickness )
821 DOUBLE PRECISION,
INTENT(IN) :: RADIUS, THICKNESS
822 DOUBLE PRECISION,
PARAMETER :: CKD = 2.d0
823 DOUBLE PRECISION,
PARAMETER :: GRAV = 9.81d0
824 DOUBLE PRECISION :: KV,GP,PI
832 gp = 2.d0*kv*grav*(ro0-rho_ice)/(pi*ro0)
833 IF (radius .LE. 3.e-4)
THEN 835 ELSEIF ((3.e-4 .LT. radius).AND.(radius .LE. 1.4e-3))
THEN 837 & *(
xnu**(-0.428d0))*(radius**1.14d0)
838 ELSEIF (1.4e-3 .LT. radius)
THEN 842 ELSEIF(
ibuoy.EQ.2)
THEN 847 ELSEIF(
ibuoy.EQ.3)
THEN 850 & *(thickness**0.61d0)/
xnu 852 ELSEIF(
ibuoy.EQ.4)
THEN 857 & *grav*radius/(
de*ro0*ckd))
894 DOUBLE PRECISION,
INTENT(IN) :: SAL
900 & -0.0575d0*sal + 0.001710523d0*( sal**1.5d0 )
901 & -0.0002154996d0*( sal**2 )
916 & ( frzl,srcgm,theta0,theta1,beta1,vbb,thifemf,hun,
917 & anfem,vmag,depth,isbar )
946 DOUBLE PRECISION,
INTENT(IN) :: FRZL,ANFEM
947 DOUBLE PRECISION,
INTENT(INOUT) :: SRCGM
948 DOUBLE PRECISION,
INTENT(IN) :: THETA0,THETA1,BETA1
949 DOUBLE PRECISION,
INTENT(IN) :: VMAG,DEPTH,VBB,THIFEMF,HUN
950 LOGICAL,
INTENT(IN) :: ISBAR
954 DOUBLE PRECISION HE,PV
960 pv = (
af*vmag )/depth * frzl
963 pv = ( (theta0*vbb*(1.d0-anfem) ) +
964 & ( theta1*vbb*anfem) )/depth * frzl
968 he = ( 1.d0-
surf_ef ) * ( thifemf + hun )
969 srcgm = (beta1*he*anfem)/depth - pv
983 & (vbb, frzl, srcp, vmag, g, rk, it)
1006 LOGICAL,
INTENT(IN) :: IT
1007 DOUBLE PRECISION,
INTENT(IN) :: FRZL,G,RK
1008 DOUBLE PRECISION,
INTENT(INOUT) :: SRCP
1009 DOUBLE PRECISION,
INTENT(IN) :: VMAG,VBB
1013 DOUBLE PRECISION UC2,TC,M
1022 m = max(0.d0,1.d0-(vmag*vmag/uc2))
1040 & ( rfr0,rfr1,db,bar,nbar,ang1,fm1,fmt )
1065 DOUBLE PRECISION,
INTENT(IN) :: NBAR
1066 DOUBLE PRECISION,
INTENT(IN) :: RFR0,RFR1,BAR,ANG1,DB
1067 DOUBLE PRECISION,
INTENT(INOUT) :: FM1,FMT
1071 DOUBLE PRECISION :: RB,DR,AMNU,ASH,RATIO,ADONT,AICE
1079 amnu = rfr0**2*cos(ang1)*sin(ang1) + 2.d0*ang1*rb**2 -
1080 & rb**2*cos(2.d0*ang1)*sin(2.d0*ang1)
1081 ash = 2.d0*ang1*rb**2 - (ang1*rfr0**2 - rb*rfr0*sin(ang1))
1083 IF (rfr1.GT.2.d0*rb)
THEN 1084 aice = ang1*rfr1**2 - amnu
1086 adont = ( rfr1**2 - rfr0**2 )*ang1
1087 ratio = ( rfr1 - rfr0 ) / dr
1088 aice = adont - ratio*ash
subroutine, public secondary_nucleation(I, TN, DT, SRCSN, EPS, LIMFLAG, MINFLAG)
subroutine, public erosion_deposition(FRZL, SRCGM, THETA0, THETA1, BETA1, VBB, THIFEMF, HUN, ANFEM, VMAG, DEPTH, ISBAR)
double precision function, public buoyancy_velocity(RADIUS, THICKNESS)
double precision function, public melting_point(SAL)
subroutine, public clogged_on_bar(RFR0, RFR1, DB, BAR, NBAR, ANG1, FM1, FMT)
double precision, dimension(:), allocatable vk_frzl
double precision, dimension(:), allocatable rk_frzl
subroutine, public seeding(I, TN, TFRZ, SRCSE, MINFLAG)
subroutine, public flocculation_breakup(I, TN, DT, SRCFB, LIMFLAG, MINFLAG)
subroutine, public precipitation(VBB, FRZL, SRCP, VMAG, G, RK, IT)
subroutine, public turbulent_parameters(I, VMAG, H, KT, EPS, ALPHA, NUT, CF, AK, EP, ITURB_TEL)
subroutine, public thermal_growth(I, TN, TFRZ, DT, SRCGM_EXP, SRCGM_IMP, SUM_SRCGM, SUM_FRZL, EPS, ALPHA, NUT, CONSTSS, LIMFLAG)
double precision function, public nusselt(RADIUS, EPS, ALPHA, NUT)