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