source: issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/run_semic_transient.f90@ 27498

Last change on this file since 27498 was 27498, checked in by inwoo, 2 years ago

CHG: update SEMIC - enable transient mode.

File size: 8.0 KB
Line 
1subroutine run_semic_transient(sf_in, rf_in, swd_in, lwd_in, wind_in, &
2 sp_in, rhoa_in, qq_in, tt_in, tsurf_in, tstic, &
3 hcrit, rcrit, &
4 mask, hice, hsnow, &
5 albedo, albedo_snow, alb_scheme, alb_smax, alb_smin, albi, albl, &
6 Tamp, &
7 tsurf_out, smb_out, saccu_out, smelt_out, alb_out, alb_snow_out,hsnow_out,hice_out)
8
9 use utils
10 use surface_physics
11
12 implicit none
13
14 ! declare surface physics class
15 type(surface_physics_class) :: surface
16 ! declare forcing class
17 type(forc_class) :: forc
18 ! declare validation class
19 !type(vali_class) :: vali ! validation not needed here
20
21 integer, parameter:: dp=kind(0.d0) !< define precision (machine specific)
22 integer :: i, k, nx, nloop, ntime, year
23 integer :: day=1 !< not used value.
24
25 ! forcing data
26 double precision, intent(in) :: sf_in ! snow fall rate [m/s]
27 double precision, intent(in) :: rf_in ! rain fall rate [m/s]
28 double precision, intent(in) :: swd_in ! downwelling shortwave radiation [W/m2]
29 double precision, intent(in) :: lwd_in ! downwelling longwave radiation [W/m2]
30 double precision, intent(in) :: wind_in! surface wind speed [m/s]
31 double precision, intent(in) :: sp_in ! surface pressure [Pa]
32 double precision, intent(in) :: rhoa_in! air density [kg/m3]
33 double precision, intent(in) :: qq_in ! air specific humidity [kg/kg]
34 double precision, intent(in) :: tt_in ! air temperature [K]
35
36 ! input data
37 double precision, intent(in) :: tstic ! time step from ISSM [sec].
38 double precision, intent(in) :: tsurf_in ! input temperature [K]
39
40 ! output data
41 double precision :: tsurf_out ! Ice surface Temperature [K]
42 double precision :: smb_out ! surface mass balance=(Accu-Melt) [m/s]
43 double precision :: saccu_out ! accumulation [m/s]
44 double precision :: smelt_out ! ablation [m/s]
45 double precision :: alb_out ! grid-averaged albedo [no unit]
46 double precision :: alb_snow_out
47 double precision :: qmr_out
48 double precision :: hice_out
49 double precision :: hsnow_out
50
51 double precision :: total_time, start, finish
52
53 ! set parameters
54 character (len=256) :: name ! not used(?)
55 character (len=256) :: boundary(30) ! not used(?)
56 !character (len=256), intent(in) :: alb_scheme !< name of albedo scheme
57 integer, intent(in) :: alb_scheme
58 integer :: n_ksub
59 double precision :: ceff !< surface heat heat capacity of snow/ice [J/W m2]
60 double precision, intent(in) :: hsnow
61 double precision, intent(in) :: hice
62 double precision, intent(in) :: albi
63 double precision, intent(in) :: albl
64 double precision, intent(in) :: mask
65 double precision, intent(in) :: albedo
66 double precision, intent(in) :: albedo_snow
67 double precision, intent(in) :: alb_smax
68 double precision, intent(in) :: alb_smin
69 double precision, intent(in) :: hcrit !< critical snow height for which grid cell is 50% snow covered [m]
70 double precision, intent(in) :: rcrit !< critical snow height fro which refreezing fraction is 50% [m]
71 double precision, intent(in) :: Tamp
72 double precision :: csh
73 double precision :: clh
74 double precision :: tmin
75 double precision :: tmax
76 double precision :: tsticsub
77 ! parameters for isba albedo scheme.
78 double precision :: tau_a !< critical liquide water concent for "isba" albedo scheme [kg/m2]
79 double precision :: tau_f
80 double precision :: w_crit
81 double precision :: mcrit
82 double precision :: afac !< param
83 double precision :: tmid !< param for "alex" albedo parameterization [K]
84
85 nx = 1
86 ntime = 365
87 year = 0
88
89 ! set vector length
90 surface%par%nx = nx
91
92 ! set input (forcing data)
93 !forc%sf(:,:) = sf_in ! snowfall flux [m/sec]
94 !forc%rf(:,:) = rf_in ! rainfall flux [m/sec]
95 !forc%swd(:,:) = swd_in ! short radiation
96 !forc%lwd(:,:) = lwd_in ! long radiation downward
97 !forc%wind(:,:) = wind_ina ! wind speed.
98 !forc%sp(:,:) = sp_in ! surface pressure
99 !forc%rhoa(:,:) = rhoa_in ! air density [kg/m3]
100 !forc%qq(:,:) = qq_in ! air specific humidity [kg/kg]
101 !forc%tt(:,:) = tt_in ! 2m air temperature
102
103 ! FIXME should be user input
104 !boundary = "" "" ""
105 !surface%par%tstic = 86400.0_dp !< time step [s] in one day.
106 surface%par%tstic = tstic !< time step [s]
107 surface%par%ceff= 2.0e6_dp !< surface heat capacity of snow/ice [J/K/m2]
108 surface%par%csh = 2.0e-3_dp
109 surface%par%clh = 5.0e-4_dp !< latent heat exchange coefficient [no unit]
110 surface%par%alb_smax = alb_smax !0.79_dp !< max snow albedo
111 surface%par%alb_smin = alb_smin !0.6_dp !< min snow albedo
112 surface%par%albi = albi !0.41_dp !< albedo for ice
113 surface%par%albl = albl !0.07_dp !< albedo for land
114 surface%par%tmin = -999_dp
115 surface%par%tmax = 273.15_dp
116 surface%par%hcrit = hcrit !0.028_dp !< critical snow height for which grid cell is 50 % snow colvered [m]
117 surface%par%rcrit = rcrit !0.85_dp !< refreezing fraction is 50% [m]
118 surface%par%amp = Tamp !3.0_dp !< amplitude of diurnal cycle [K]
119 if (alb_scheme == 0) then
120 surface%par%alb_scheme="None"
121 else if (alb_scheme == 1) then
122 surface%par%alb_scheme = "slater"
123 else if (alb_scheme == 2) then
124 surface%par%alb_scheme = "denby"
125 else if (alb_scheme == 3) then
126 surface%par%alb_scheme = "isba"
127 end if
128 surface%par%tau_a = 0.008_dp
129 surface%par%tau_f = 0.24_dp
130 surface%par%w_crit = 15.0_dp
131 surface%par%mcrit = 6.0e-8_dp
132 surface%par%n_ksub = 3.0_dp
133
134 ! initialize sub-daily time step tsticsub
135 surface%par%tsticsub = surface%par%tstic / dble(surface%par%n_ksub)
136
137 ! allocate necessary arrays for surface_physics module
138 call surface_alloc(surface%now,surface%par%nx)
139
140 ! initialise prognostic variables
141 ! these values will be updated through "surface_energy_and_mass_balance" function.
142 surface%now%mask(:) = mask ! 2.0_dp !loi_mask(:nx)
143 surface%now%hsnow(:) = hsnow ! 1.0_dp !< snow height...
144 surface%now%hice(:) = hice ! 0.0_dp !< ice thickness...
145 surface%now%tsurf(:) = tsurf_in
146 surface%now%alb(:) = albedo ! 0.8_dp !< initial albedo
147 surface%now%alb_snow(:) = albedo_snow ! 0.8_dp
148 !surface%now%acc(:) = 0.0_dp
149 !surface%now%smb(:) = 0.0_dp
150 !surface%now%melt(:) = 0.0_dp
151 surface%now%qmr_res(:) = 0.0_dp
152
153 ! initialize with zeros
154 surface%now%qmr(:) = 0.0_dp
155
156 tsurf_out = 0.0_dp
157 smb_out = 0.0_dp
158 saccu_out = 0.0_dp
159 smelt_out = 0.0_dp
160 alb_out = 0.0_dp
161
162 ! define boundary conditions (not used, here!)
163 call surface_boundary_define(surface%bnd,surface%par%boundary)
164 !call print_boundary_opt(surface%bnd)
165
166
167 !surface%now%sf = forc%sf(1,day)
168 !surface%now%rf = forc%rf(1,day)
169 !surface%now%sp = forc%sp(1,day)
170 !surface%now%lwd = forc%lwd(1,day)
171 !surface%now%swd = forc%swd(1,day)
172 !surface%now%wind = forc%wind(1,day)
173 !surface%now%rhoa = forc%rhoa(1,day)
174 !surface%now%t2m = forc%tt(1,day)
175 !surface%now%qq = forc%qq(1,day)
176
177 ! input with single value
178 surface%now%sf = sf_in
179 surface%now%rf = rf_in
180 surface%now%sp = sp_in
181 surface%now%lwd = lwd_in
182 surface%now%swd = swd_in
183 surface%now%wind = wind_in
184 surface%now%rhoa = rhoa_in
185 surface%now%t2m = tt_in
186 surface%now%qq = qq_in
187
188 ! calculate prognostic and diagnsotic variables
189 call cpu_time(start)
190 call surface_energy_and_mass_balance(surface%now,surface%par,surface%bnd,day,-1)
191 call cpu_time(finish)
192 total_time = total_time + (finish - start)
193
194 tsurf_out=surface%now%tsurf(1)
195 ! melt - potential surface melt [m/s]
196 ! smb
197 smb_out =surface%now%smb(1) !*1.0_dp/365.0_dp
198 saccu_out =surface%now%acc(1) !*1.0_dp/365.0_dp
199 smelt_out =surface%now%melt(1)!*1.0_dp/365.0_dp
200 alb_out =surface%now%alb(1)
201 alb_snow_out =surface%now%alb_snow(1)
202 qmr_out =surface%now%qmr(1)
203 hsnow_out =surface%now%hsnow(1)
204 hice_out =surface%now%hice(1)
205
206 ! de-allocate surface_physics arrays
207 call surface_dealloc(surface%now)
208
209 !write(*,*) 'total time for surface_physics:', nloop, total_time
210
211end subroutine run_semic_transient
Note: See TracBrowser for help on using the repository browser.