UFO
ufo_coolskin_sim_mod.F90
Go to the documentation of this file.
2  use kinds
4  implicit none
6  private
7 
8 contains
9  subroutine ufo_coolskin_sim(Ts,dTc,S_ns,H_I,H_s,R_nl,Tdc,u0)
10  use kinds
11  implicit none
12 
13  real(kind=kind_real), intent(inout) :: ts,dtc !dTc to return
14  real(kind=kind_real), intent(in) :: s_ns,h_i,h_s,r_nl,u0,tdc
15 
16  ! local variables
17  integer:: n_i,i
18  real(kind=kind_real) :: delta,fc, u, lamda,q0,qb,td
19 
20 
21  u = max(0.0002, u0) !friction velocity over water
22  dtc = 0.0
23  n_i = 3
24  td = tdc + 273.15 ! convert from C to K
25 
26  do i = 1,n_i
27  q0 = h_i + h_s + (eps * sig * (td - dtc)**4 - r_nl)
28  qb = q0 + (s_b*cw/(alpha*l_e))*h_i
29  lamda = 6.0*(1.0+((alpha*gr*qb/(rou*cw))*(16.0*rou**2.0 * cw**2.0 * v_w**3.0 / &
30  k_t**2.0)* (1/u**4.0))**(3.0/4.0))**(-1.0/3.0)
31  delta =lamda * v_w / u
32  fc = 0.0685 + 11.0 * delta - 3.3e-5 /delta * (1.0-exp(-delta/(8.0e-4)))
33  dtc = (h_i + h_s + (eps * sig * (td - dtc)**4 - r_nl) - s_ns * fc) * delta/k_t
34  dtc = max(dtc,0.0)
35  enddo
36 
37  ts = td - dtc
38  ts = ts - 273.15 ! convert from K to C
39 
40  end subroutine ufo_coolskin_sim
41 
42  !-----------------------------------------------------------------------
43 
44  subroutine ufo_coolskin_jac(jac,S_ns,H_I,H_s,R_nl,Tdc,u0)
45  use kinds
46  implicit none
47 
48  real(kind=kind_real), intent(in) :: s_ns,h_i,h_s,r_nl,u0,tdc
49  real(kind=kind_real), intent(out) :: jac(6) ! jac calculated for all inputs
50 
51  real(kind=kind_real) :: delta ,fc ,u, td
52  real(kind=kind_real) :: lamda ,q0 ,qb ,ts ,dtc ,c0 ,y ,q
53  real(kind=kind_real) :: const ,d_lamda_dqb, dfc_d_delta
54 
55  u = max(0.0002, u0) !friction velocity over water
56 
57  call ufo_coolskin_sim(ts,dtc,s_ns,h_i,h_s,r_nl,tdc,u)
58 
59  td = tdc + 273.15 ! convert from C to K
60  ts = ts + 273.15
61  q0 = h_i + h_s + (eps * sig * ts**4 - r_nl)
62 
63  !constant apears in net heat equation
64  c0 = s_b*cw/(alpha*l_e)
65  qb = q0 + c0*h_i
66 
67  !Saunder’s constant
68  lamda = 6.0*(1.0+((alpha*gr*qb/(rou*cw))*(16.0*rou**2.0 * cw**2.0 * v_w**3.0 &
69  / k_t**2.0)* (1/u**4.0))**(0.75))**(-1.0/3.0)
70 
71  ! cool layer thickness
72  delta = lamda * v_w / u
73 
74  !solar absorbption profile in cool layer
75  fc = 0.0685 + 11.0 * delta - 3.3e-5 /delta * (1.0-exp(-delta/(8.0e-4)))
76 
77  ! net heat in cool layer
78  q = h_i + h_s + (eps * sig * (td - dtc)**4 - r_nl) - s_ns * fc
79  const = ((alpha*gr/(rou*cw))*(16.0*rou**2.0 * cw**2.0 * v_w**3.0 / k_t**2.0))**(0.75)
80 
81  ! calculate d(fc)/d(delta)
82  dfc_d_delta = 11 + 3.3e-5 / delta**2 *(1.0-exp(-delta/(8.0e-4))) - 3.3e-5 &
83  / delta * (1.0/(8.0e-4) * exp(-delta/(8.0e-4)))
84 
85  ! calculate d(lamda)/d(Qb)
86  d_lamda_dqb = -2.0 *(1.0+const *(qb/u**4) **(0.75))**(-4.0/3.0) * &
87  (0.75) * const * (qb/u**4) ** (-0.25)
88 
89  ! this apears in several of jacobians, I decided to calculate it once (4 eps * sig * Ts**3)
90  y = 4 * eps * sig * ts**3
91 
92  ! d(Ts)/d(S_ns)
93  jac(1) = fc * delta /(k_t+y*(delta+(q - s_ns*delta *dfc_d_delta)*v_w/u*d_lamda_dqb))
94 
95  ! d(Ts)/d(H_I)
96  jac(2) = -((1+c0)*(delta+q*v_w/u*d_lamda_dqb-s_ns*dfc_d_delta*v_w/u*d_lamda_dqb))/ &
97  (y*(delta+q*v_w/u*d_lamda_dqb-s_ns*dfc_d_delta*v_w/u*d_lamda_dqb)+k_t)
98 
99  ! d(Ts)/d(H_s)
100  jac(3) = -((delta+q*v_w/u*d_lamda_dqb-s_ns*dfc_d_delta*v_w/u*d_lamda_dqb))/ &
101  (y*(delta+q*v_w/u*d_lamda_dqb -s_ns*dfc_d_delta*v_w/u*d_lamda_dqb)+k_t)
102 
103  ! d(Ts)/d(R_nl)
104  jac(4) = (delta +(q-s_ns*dfc_d_delta*delta)*(v_w/u*d_lamda_dqb))/ &
105  (k_t+(q-s_ns*dfc_d_delta*delta)*(y*v_w/u*d_lamda_dqb))
106 
107  ! d(Ts)/d(Td)
108  jac(5) = k_t/(k_t + y *(delta - delta*s_ns*dfc_d_delta +q) * v_w/u * d_lamda_dqb)
109 
110  ! d(Ts)/d(u)
111  jac(6) = - (q-s_ns* delta*dfc_d_delta)*(v_w/u**2.0 *lamda + (4.0*u**(-6.0))*d_lamda_dqb*qb)/ &
112  (k_t+y *(delta +(q-delta*s_ns*dfc_d_delta)*(v_w*d_lamda_dqb*u**(-5.0))))
113 
114  end subroutine ufo_coolskin_jac
115 
116 
117 end module ufo_coolskin_sim_mod
real(kind_real), parameter, public v_w
real(kind_real), parameter, public sig
real(kind_real), parameter, public s_b
real(kind_real), parameter, public k_t
real(kind_real), parameter, public alpha
real(kind_real), parameter, public rou
real(kind_real), parameter, public eps
real(kind_real), parameter, public l_e
real(kind_real), parameter, public cw
real(kind_real), parameter, public gr
subroutine, public ufo_coolskin_sim(Ts, dTc, S_ns, H_I, H_s, R_nl, Tdc, u0)
subroutine, public ufo_coolskin_jac(jac, S_ns, H_I, H_s, R_nl, Tdc, u0)