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

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

CHG: run_semic_transient.f90 - add more output.

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