Line data Source code
1 : !=======================================================================
2 : !
3 : ! This module contains the Icepack initialization routine that sets model
4 : ! parameters and initializes the grid and state variables.
5 : !
6 : ! authors Elizabeth C. Hunke, LANL
7 :
8 : module icedrv_InitMod
9 :
10 : use icedrv_kinds
11 : use icedrv_constants, only: nu_diag
12 : use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
13 : use icepack_intfc, only: icepack_query_parameters, icepack_query_tracer_flags
14 : use icepack_intfc, only: icepack_write_tracer_flags, icepack_write_tracer_indices
15 : use icepack_intfc, only: icepack_write_tracer_sizes
16 : use icedrv_system, only: icedrv_system_abort
17 :
18 : implicit none
19 : private
20 : public :: icedrv_initialize
21 :
22 : !=======================================================================
23 :
24 : contains
25 :
26 : !=======================================================================
27 :
28 :
29 : ! Initialize Icepack
30 :
31 45 : subroutine icedrv_initialize
32 :
33 : use icedrv_arrays_column, only: hin_max, c_hi_range
34 : use icedrv_arrays_column, only: floe_rad_l, floe_rad_c, &
35 : floe_binwidth, c_fsd_range
36 : use icedrv_calendar, only: dt, time, istep, istep1, &
37 : init_calendar, calendar
38 : use icepack_intfc, only: icepack_init_itd, icepack_init_itd_hist
39 : use icepack_intfc, only: icepack_init_fsd_bounds
40 : use icepack_intfc, only: icepack_warnings_flush
41 : use icedrv_domain_size, only: ncat, nfsd
42 : ! use icedrv_diagnostics, only: icedrv_diagnostics_debug
43 : use icedrv_flux, only: init_coupler_flux, init_history_therm, &
44 : init_flux_atm_ocn
45 : use icedrv_forcing, only: init_forcing, get_forcing, get_wave_spec
46 : use icedrv_forcing_bgc, only: get_forcing_bgc, faero_default, fiso_default, init_forcing_bgc
47 : use icedrv_restart_shared, only: restart
48 : use icedrv_init, only: input_data, init_state, init_grid2, init_fsd
49 : use icedrv_init_column, only: init_thermo_vertical, init_shortwave, init_zbgc
50 : use icepack_intfc, only: icepack_configure
51 :
52 : logical (kind=log_kind) :: &
53 : skl_bgc, & ! from icepack
54 : z_tracers, & ! from icepack
55 : tr_aero, & ! from icepack
56 : tr_iso, & ! from icepack
57 : tr_zaero, & ! from icepack
58 : tr_fsd, wave_spec
59 :
60 : character(len=*), parameter :: subname='(icedrv_initialize)'
61 :
62 45 : call icepack_configure() ! initialize icepack
63 45 : call icepack_warnings_flush(nu_diag)
64 45 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
65 0 : file=__FILE__,line= __LINE__)
66 :
67 45 : call input_data ! namelist variables
68 45 : call init_zbgc ! vertical biogeochemistry namelist
69 :
70 : ! generate some output
71 45 : call icepack_write_tracer_flags(nu_diag)
72 45 : call icepack_write_tracer_sizes(nu_diag)
73 45 : call icepack_write_tracer_indices(nu_diag)
74 45 : call icepack_warnings_flush(nu_diag)
75 45 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
76 0 : file=__FILE__,line= __LINE__)
77 :
78 45 : call init_grid2 ! grid variables
79 45 : call init_calendar ! initialize some calendar stuff
80 45 : call init_coupler_flux ! initialize fluxes exchanged with coupler
81 45 : call init_thermo_vertical ! initialize vertical thermodynamics
82 45 : call icepack_init_itd(ncat=ncat, hin_max=hin_max)
83 :
84 45 : call icepack_warnings_flush(nu_diag)
85 45 : if (icepack_warnings_aborted(subname)) then
86 0 : call icedrv_system_abort(file=__FILE__,line=__LINE__)
87 : endif
88 :
89 45 : call icepack_init_itd_hist(ncat=ncat, c_hi_range=c_hi_range, hin_max=hin_max) ! output
90 :
91 45 : call icepack_query_tracer_flags(tr_fsd_out=tr_fsd)
92 45 : call icepack_warnings_flush(nu_diag)
93 45 : if (icepack_warnings_aborted(subname)) then
94 0 : call icedrv_system_abort(file=__FILE__,line=__LINE__)
95 : endif
96 :
97 45 : if (tr_fsd) then
98 : call icepack_init_fsd_bounds( &
99 : nfsd=nfsd, & ! floe size distribution
100 : floe_rad_l=floe_rad_l, & ! fsd size lower bound in m (radius)
101 : floe_rad_c=floe_rad_c, & ! fsd size bin centre in m (radius)
102 : floe_binwidth=floe_binwidth, & ! fsd size bin width in m (radius)
103 4 : c_fsd_range=c_fsd_range) ! string for history output
104 4 : call icepack_warnings_flush(nu_diag)
105 4 : if (icepack_warnings_aborted(subname)) then
106 0 : call icedrv_system_abort(file=__FILE__,line=__LINE__)
107 : endif
108 : endif
109 45 : call init_fsd
110 :
111 45 : call calendar(time) ! determine the initial date
112 :
113 45 : call init_state ! initialize the ice state
114 45 : call init_restart ! initialize restart variables
115 45 : call init_history_therm ! initialize thermo history variables
116 :
117 45 : if (restart) &
118 15 : call init_shortwave ! initialize radiative transfer
119 :
120 45 : istep = istep + 1 ! update time step counters
121 45 : istep1 = istep1 + 1
122 45 : time = time + dt ! determine the time and date
123 45 : call calendar(time) ! at the end of the first timestep
124 :
125 : !--------------------------------------------------------------------
126 : ! coupler communication or forcing data initialization
127 : !--------------------------------------------------------------------
128 45 : call icepack_query_parameters(skl_bgc_out=skl_bgc)
129 45 : call icepack_query_parameters(z_tracers_out=z_tracers)
130 45 : call icepack_query_parameters(wave_spec_out=wave_spec)
131 45 : call icepack_query_tracer_flags(tr_aero_out=tr_aero)
132 45 : call icepack_query_tracer_flags(tr_iso_out=tr_iso)
133 45 : call icepack_query_tracer_flags(tr_zaero_out=tr_zaero)
134 45 : call icepack_warnings_flush(nu_diag)
135 45 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
136 0 : file=__FILE__,line= __LINE__)
137 :
138 45 : call init_forcing ! initialize forcing (standalone)
139 45 : if (skl_bgc .or. z_tracers) call init_forcing_bgc !cn
140 45 : if (tr_fsd .and. wave_spec) call get_wave_spec ! wave spectrum in ice
141 45 : call get_forcing(istep1) ! get forcing from data arrays
142 :
143 45 : if (tr_iso) call fiso_default ! default values
144 : ! aerosols
145 : ! if (tr_aero) call faero_data ! data file
146 : ! if (tr_zaero) call fzaero_data ! data file (gx1)
147 45 : if (tr_aero .or. tr_zaero) call faero_default ! default values
148 45 : if (skl_bgc .or. z_tracers) call get_forcing_bgc ! biogeochemistry
149 :
150 45 : if (.not. restart) &
151 30 : call init_shortwave ! initialize radiative transfer using current swdn
152 :
153 45 : call init_flux_atm_ocn ! initialize atmosphere, ocean fluxes
154 :
155 45 : end subroutine icedrv_initialize
156 :
157 : !=======================================================================
158 :
159 45 : subroutine init_restart
160 :
161 : use icedrv_calendar, only: time, calendar
162 : use icepack_intfc, only: icepack_aggregate
163 : use icedrv_domain_size, only: ncat, max_ntrcr, nx
164 : use icedrv_init, only: ice_ic
165 : use icedrv_init, only: tmask
166 : use icedrv_init_column, only: init_hbrine, init_bgc
167 : use icedrv_restart, only: restartfile
168 : use icedrv_restart_shared, only: restart
169 : use icedrv_restart_bgc, only: read_restart_bgc
170 : use icedrv_state ! almost everything
171 :
172 : integer(kind=int_kind) :: &
173 : i ! horizontal indices
174 :
175 : logical (kind=log_kind) :: &
176 : skl_bgc, & ! from icepack
177 : z_tracers, & ! from icepack
178 : solve_zsal, & ! from icepack
179 : tr_brine, & ! from icepack
180 : tr_fsd ! from icepack
181 :
182 : character(len=*), parameter :: subname='(init_restart)'
183 :
184 : !-----------------------------------------------------------------
185 : ! query Icepack values
186 : !-----------------------------------------------------------------
187 :
188 45 : call icepack_query_parameters(skl_bgc_out=skl_bgc)
189 45 : call icepack_query_parameters(z_tracers_out=z_tracers)
190 45 : call icepack_query_parameters(solve_zsal_out=solve_zsal)
191 45 : call icepack_query_tracer_flags(tr_brine_out=tr_brine, tr_fsd_out=tr_fsd)
192 45 : call icepack_warnings_flush(nu_diag)
193 45 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
194 0 : file=__FILE__,line= __LINE__)
195 :
196 : !-----------------------------------------------------------------
197 :
198 45 : if (tr_brine .or. skl_bgc) then ! brine height tracer
199 5 : call init_hbrine
200 : endif
201 :
202 45 : if (restart) then
203 15 : call restartfile (ice_ic)
204 15 : call calendar (time)
205 : endif
206 :
207 45 : if (solve_zsal .or. skl_bgc .or. z_tracers) then
208 5 : if (tr_fsd) then
209 0 : write (nu_diag,*) 'FSD implementation incomplete for use with BGC'
210 0 : call icedrv_system_abort(string=subname,file=__FILE__,line=__LINE__)
211 : endif
212 5 : call init_bgc
213 5 : if (restart) call read_restart_bgc ! complete BGC initialization
214 : endif
215 :
216 : !-----------------------------------------------------------------
217 : ! aggregate tracers
218 : !-----------------------------------------------------------------
219 225 : do i = 1, nx
220 180 : if (tmask(i)) &
221 : call icepack_aggregate(ncat=ncat, &
222 : aicen=aicen(i,:), &
223 : vicen=vicen(i,:), &
224 : vsnon=vsnon(i,:), &
225 : trcrn=trcrn(i,:,:), &
226 48 : aice=aice (i), &
227 48 : vice=vice (i), &
228 48 : vsno=vsno (i), &
229 : trcr=trcr (i,:), &
230 48 : aice0=aice0(i), &
231 : ntrcr=max_ntrcr, &
232 : trcr_depend=trcr_depend, &
233 : trcr_base=trcr_base, &
234 : n_trcr_strata=n_trcr_strata, &
235 276 : nt_strata=nt_strata)
236 : enddo
237 45 : call icepack_warnings_flush(nu_diag)
238 45 : if (icepack_warnings_aborted()) call icedrv_system_abort(string=subname, &
239 0 : file=__FILE__, line=__LINE__)
240 :
241 45 : end subroutine init_restart
242 :
243 : !=======================================================================
244 :
245 : end module icedrv_InitMod
246 :
247 : !=======================================================================
|