00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 module ice_lvl
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_lvl
00036
00037
00038
00039 contains
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 subroutine init_lvl
00055
00056
00057
00058 use ice_state, only: nt_alvl, nt_vlvl, trcrn, aicen, vicen
00059
00060
00061
00062 integer (kind=int_kind) ::
00063 i, j, n, iblk
00064
00065 if (trim(runtype) == 'continue') restart_lvl = .true.
00066
00067 if (restart_lvl) then
00068 call read_restart_lvl
00069 else
00070
00071 trcrn(:,:,nt_alvl,:,:) = c1
00072 trcrn(:,:,nt_vlvl,:,:) = c1
00073 endif
00074
00075 end subroutine init_lvl
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 subroutine write_restart_lvl(filename_spec)
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 use ice_domain_size
00100 use ice_calendar, only: sec, month, mday, nyr, istep1, &
00101 time, time_forc, idate, year_init
00102 use ice_state, only: nt_alvl, nt_vlvl, trcrn
00103
00104
00105
00106 character(len=char_len_long), intent(in), optional :: filename_spec
00107
00108
00109
00110 integer (kind=int_kind) ::
00111 i, j, k, n, it, iblk,
00112 iyear, imonth, iday
00113
00114 character(len=char_len_long) :: filename
00115
00116 logical (kind=log_kind) :: diag
00117
00118
00119 if (present(filename_spec)) then
00120 filename = trim(filename_spec)
00121 else
00122 iyear = nyr + year_init - 1
00123 imonth = month
00124 iday = mday
00125
00126 write(filename,'(a,a,a,i4.4,a,i2.2,a,i2.2,a,i5.5)') &
00127 restart_dir(1:lenstr(restart_dir)), &
00128 restart_file(1:lenstr(restart_file)),'.lvl.', &
00129 iyear,'-',month,'-',mday,'-',sec
00130 end if
00131
00132
00133 call ice_open(nu_dump_lvl,filename,0)
00134
00135 if (my_task == master_task) then
00136 write(nu_dump_lvl) istep1,time,time_forc
00137 write(nu_diag,*) 'Writing ',filename(1:lenstr(filename))
00138 endif
00139
00140 diag = .true.
00141
00142
00143
00144 do n = 1, ncat
00145 call ice_write(nu_dump_lvl,0,trcrn(:,:,nt_alvl,n,:),'ruf8',diag)
00146 call ice_write(nu_dump_lvl,0,trcrn(:,:,nt_vlvl,n,:),'ruf8',diag)
00147 enddo
00148
00149 if (my_task == master_task) close(nu_dump_lvl)
00150
00151 end subroutine write_restart_lvl
00152
00153
00154
00155
00156
00157
00158
00159
00160 subroutine read_restart_lvl(filename_spec)
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 use ice_domain_size
00173 use ice_calendar, only: sec, month, mday, nyr, istep1, &
00174 time, time_forc, idate, year_init
00175 use ice_state, only: nt_alvl, nt_vlvl, trcrn
00176
00177
00178
00179 character(len=char_len_long), intent(in), optional :: filename_spec
00180
00181
00182
00183 integer (kind=int_kind) ::
00184 i, j, k, n, it, iblk,
00185 iyear, imonth, iday
00186
00187 character(len=char_len_long) ::
00188 filename, filename0, string1, string2
00189
00190 logical (kind=log_kind) ::
00191 diag
00192
00193 if (my_task == master_task) then
00194 open(nu_rst_pointer,file=pointer_file)
00195 read(nu_rst_pointer,'(a)') filename0
00196 filename = trim(filename0)
00197 close(nu_rst_pointer)
00198
00199
00200 n = index(filename0,trim(restart_file))
00201 if (n == 0) call abort_ice('ilvl restart: filename discrepancy')
00202 string1 = trim(filename0(1:n-1))
00203 string2 = trim(filename0(n+lenstr(restart_file):lenstr(filename0)))
00204 write(filename,'(a,a,a,a)') &
00205 string1(1:lenstr(string1)), &
00206 restart_file(1:lenstr(restart_file)),'.lvl', &
00207 string2(1:lenstr(string2))
00208 endif
00209
00210 call ice_open(nu_restart_lvl,filename,0)
00211
00212 if (my_task == master_task) then
00213 read(nu_restart_lvl) istep1,time,time_forc
00214 write(nu_diag,*) 'Reading ',filename(1:lenstr(filename))
00215 endif
00216
00217 diag = .true.
00218
00219
00220
00221 do n = 1, ncat
00222 call ice_read(nu_restart_lvl,0,trcrn(:,:,nt_alvl,n,:),'ruf8',diag)
00223 call ice_read(nu_restart_lvl,0,trcrn(:,:,nt_vlvl,n,:),'ruf8',diag)
00224 enddo
00225
00226 if (my_task == master_task) close(nu_restart_lvl)
00227
00228 end subroutine read_restart_lvl
00229
00230
00231
00232 end module ice_lvl
00233
00234