00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 module ice_FY
00017
00018
00019
00020 use ice_kinds_mod
00021 use ice_domain_size
00022 use ice_constants
00023 use ice_fileunits
00024 use ice_read_write
00025 use ice_restart, only: lenstr, restart_dir, restart_file, &
00026 pointer_file, runtype
00027 use ice_communicate, only: my_task, master_task
00028 use ice_exit, only: abort_ice
00029
00030
00031
00032 implicit none
00033
00034 logical (kind=log_kind) ::
00035 restart_FY
00036
00037
00038
00039 contains
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 subroutine init_FY
00055
00056
00057
00058 use ice_state, only: nt_FY, trcrn, filename_FY
00059
00060 integer (kind = int_kind) :: n
00061
00062
00063
00064
00065
00066 if (trim(filename_FY) /= 'none') restart_FY = .true.
00067
00068 if (restart_FY) then
00069 if (trim(runtype) == 'continue') then
00070 call read_restart_FY
00071 else
00072 call read_restart_FY(filename_FY)
00073 endif
00074 endif
00075
00076 end subroutine init_FY
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 subroutine update_FYarea (nx_block, ny_block, &
00095 dt, icells, &
00096 indxi, indxj, &
00097 nhmask, shmask, &
00098 FYarea)
00099
00100
00101
00102 use ice_calendar, only: secday, yday
00103
00104
00105
00106 integer (kind=int_kind), intent(in) ::
00107 nx_block, ny_block,
00108 icells
00109
00110 integer (kind=int_kind), dimension (nx_block*ny_block),
00111 intent(in) ::
00112 indxi, indxj
00113
00114 real (kind=dbl_kind), intent(in) ::
00115 dt
00116
00117 logical (kind=log_kind), dimension(nx_block,ny_block),
00118 intent(in) ::
00119 nhmask, shmask
00120
00121 real (kind=dbl_kind), dimension(nx_block,ny_block),
00122 intent(inout) ::
00123 FYarea
00124
00125
00126
00127 integer (kind=int_kind) :: i, j, ij
00128
00129
00130
00131 if ((yday >= 259._dbl_kind) .and. &
00132 (yday < 259._dbl_kind+dt/secday)) then
00133 do ij = 1, icells
00134 i = indxi(ij)
00135 j = indxj(ij)
00136 if (nhmask(i,j)) FYarea(i,j) = c0;
00137 enddo
00138 endif
00139
00140 if ((yday >= 75._dbl_kind) .and. &
00141 (yday < 75._dbl_kind+dt/secday)) then
00142 do ij = 1, icells
00143 i = indxi(ij)
00144 j = indxj(ij)
00145 if (shmask(i,j)) FYarea(i,j) = c0;
00146 enddo
00147 endif
00148
00149 end subroutine update_FYarea
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 subroutine write_restart_FY(filename_spec)
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 use ice_domain_size
00174 use ice_calendar, only: sec, month, mday, nyr, istep1, &
00175 time, time_forc, idate, year_init
00176 use ice_state
00177 use ice_flux, only: frz_onset
00178
00179
00180
00181 character(len=char_len_long), intent(in), optional :: filename_spec
00182
00183
00184
00185 integer (kind=int_kind) ::
00186 i, j, k, n, it, iblk,
00187 iyear, imonth, iday
00188
00189 character(len=char_len_long) :: filename
00190
00191 logical (kind=log_kind) :: diag
00192
00193
00194 if (present(filename_spec)) then
00195 filename = trim(filename_spec)
00196 else
00197 iyear = nyr + year_init - 1
00198 imonth = month
00199 iday = mday
00200
00201 write(filename,'(a,a,a,i4.4,a,i2.2,a,i2.2,a,i5.5)') &
00202 restart_dir(1:lenstr(restart_dir)), &
00203 restart_file(1:lenstr(restart_file)),'.FY.', &
00204 iyear,'-',month,'-',mday,'-',sec
00205 end if
00206
00207
00208 call ice_open(nu_dump_FY,filename,0)
00209
00210 if (my_task == master_task) then
00211 write(nu_dump_FY) istep1,time,time_forc
00212 write(nu_diag,*) 'Writing ',filename(1:lenstr(filename))
00213 endif
00214
00215 diag = .true.
00216
00217
00218
00219 do n = 1, ncat
00220 call ice_write(nu_dump_FY,0,trcrn(:,:,nt_FY,n,:),'ruf8',diag)
00221 call ice_write(nu_dump_FY,0,frz_onset,'ruf8',diag)
00222 enddo
00223
00224 if (my_task == master_task) close(nu_dump_FY)
00225
00226 end subroutine write_restart_FY
00227
00228
00229
00230
00231
00232
00233
00234
00235 subroutine read_restart_FY(filename_spec)
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 use ice_domain_size
00248 use ice_calendar, only: sec, month, mday, nyr, istep1, &
00249 time, time_forc, idate, year_init
00250 use ice_state
00251 use ice_flux, only: frz_onset
00252
00253
00254
00255 character(len=char_len_long), intent(in), optional :: filename_spec
00256
00257
00258
00259 integer (kind=int_kind) ::
00260 i, j, k, n, it, iblk,
00261 iyear, imonth, iday
00262
00263 character(len=char_len_long) ::
00264 filename, filename0, string1, string2
00265
00266 logical (kind=log_kind) ::
00267 diag
00268
00269 if (my_task == master_task) then
00270
00271 if (present(filename_spec)) then
00272 filename = filename_spec
00273 else
00274 open(nu_rst_pointer,file=pointer_file)
00275 read(nu_rst_pointer,'(a)') filename0
00276 filename = trim(filename0)
00277 close(nu_rst_pointer)
00278
00279 n = index(filename0,trim(restart_file))
00280 if (n == 0) call abort_ice('FY restart: filename discrepancy')
00281 string1 = trim(filename0(1:n-1))
00282 string2 = trim(filename0(n+lenstr(restart_file):lenstr(filename0)))
00283 write(filename,'(a,a,a,a)') &
00284 string1(1:lenstr(string1)), &
00285 restart_file(1:lenstr(restart_file)),'.FY', &
00286 string2(1:lenstr(string2))
00287 endif
00288 endif
00289
00290 call ice_open(nu_restart_FY,filename,0)
00291
00292 if (my_task == master_task) then
00293 read(nu_restart_FY) istep1,time,time_forc
00294 write(nu_diag,*) 'Reading ',filename(1:lenstr(filename))
00295 endif
00296
00297 diag = .true.
00298
00299
00300
00301 do n = 1, ncat
00302 call ice_read(nu_restart_FY,0,trcrn(:,:,nt_FY,n,:),'ruf8',diag)
00303 call ice_read(nu_restart_FY,0,frz_onset,'ruf8',diag)
00304 enddo
00305
00306 if (my_task == master_task) close(nu_restart_FY)
00307
00308 end subroutine read_restart_FY
00309
00310
00311
00312 end module ice_FY
00313
00314