69 use mom_io, only : read_field, write_field, read_data, get_filename_appendix
70 use mom_io, only : get_file_info, get_file_atts, get_file_fields, get_file_times
72 use mom_io, only : multiple, netcdf_file, readonly_file, single_file
73 use mom_io, only : center, corner, north_face, east_face
74 use mom_time_manager, only : time_type, get_time, get_date, set_date, set_time
78 implicit none ;
private 84 real,
dimension(:,:,:,:),
pointer :: p => null()
88 real,
dimension(:,:,:),
pointer :: p => null()
92 real,
dimension(:,:),
pointer :: p => null()
96 real,
dimension(:),
pointer :: p => null()
100 real,
pointer :: p => null()
110 logical :: initialized
112 character(len=32) :: var_name
119 integer :: novars = 0
120 logical :: parallel_restartfiles
122 logical :: large_file_support
124 character(len=240) :: restartfile
127 type(
p0d),
pointer :: var_ptr0d(:) => null()
128 type(
p1d),
pointer :: var_ptr1d(:) => null()
129 type(
p2d),
pointer :: var_ptr2d(:) => null()
130 type(
p3d),
pointer :: var_ptr3d(:) => null()
131 type(
p4d),
pointer :: var_ptr4d(:) => null()
132 integer :: max_fields
155 real,
dimension(:,:,:),
target :: f_ptr
156 type(
vardesc),
intent(in) :: var_desc
157 logical,
intent(in) :: mandatory
170 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
171 "register_restart_field: Module must be initialized before it is used.")
173 cs%novars = cs%novars+1
174 if (cs%novars > cs%max_fields)
return 177 cs%restart_field(cs%novars)%vars = var_desc
178 cs%restart_field(cs%novars)%mand_var = mandatory
179 cs%restart_field(cs%novars)%initialized = .false.
180 call query_vardesc(cs%restart_field(cs%novars)%vars, &
181 name=cs%restart_field(cs%novars)%var_name, &
182 caller=
"register_restart_field_ptr3d")
184 cs%var_ptr3d(cs%novars)%p => f_ptr
185 cs%var_ptr4d(cs%novars)%p => null()
186 cs%var_ptr2d(cs%novars)%p => null()
187 cs%var_ptr1d(cs%novars)%p => null()
188 cs%var_ptr0d(cs%novars)%p => null()
193 real,
dimension(:,:,:,:),
target :: f_ptr
194 type(
vardesc),
intent(in) :: var_desc
195 logical,
intent(in) :: mandatory
208 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
209 "register_restart_field: Module must be initialized before it is used.")
211 cs%novars = cs%novars+1
212 if (cs%novars > cs%max_fields)
return 215 cs%restart_field(cs%novars)%vars = var_desc
216 cs%restart_field(cs%novars)%mand_var = mandatory
217 cs%restart_field(cs%novars)%initialized = .false.
218 call query_vardesc(cs%restart_field(cs%novars)%vars, &
219 name=cs%restart_field(cs%novars)%var_name, &
220 caller=
"register_restart_field_ptr4d")
222 cs%var_ptr4d(cs%novars)%p => f_ptr
223 cs%var_ptr3d(cs%novars)%p => null()
224 cs%var_ptr2d(cs%novars)%p => null()
225 cs%var_ptr1d(cs%novars)%p => null()
226 cs%var_ptr0d(cs%novars)%p => null()
231 real,
dimension(:,:),
target :: f_ptr
232 type(
vardesc),
intent(in) :: var_desc
233 logical,
intent(in) :: mandatory
246 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
247 "register_restart_field: Module must be initialized before it is used.")
249 cs%novars = cs%novars+1
250 if (cs%novars > cs%max_fields)
return 253 cs%restart_field(cs%novars)%vars = var_desc
254 cs%restart_field(cs%novars)%mand_var = mandatory
255 cs%restart_field(cs%novars)%initialized = .false.
256 call query_vardesc(cs%restart_field(cs%novars)%vars, &
257 name=cs%restart_field(cs%novars)%var_name, &
258 caller=
"register_restart_field_ptr2d")
260 cs%var_ptr2d(cs%novars)%p => f_ptr
261 cs%var_ptr4d(cs%novars)%p => null()
262 cs%var_ptr3d(cs%novars)%p => null()
263 cs%var_ptr1d(cs%novars)%p => null()
264 cs%var_ptr0d(cs%novars)%p => null()
269 real,
dimension(:),
target :: f_ptr
270 type(
vardesc),
intent(in) :: var_desc
271 logical,
intent(in) :: mandatory
284 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
285 "register_restart_field: Module must be initialized before it is used.")
287 cs%novars = cs%novars+1
288 if (cs%novars > cs%max_fields)
return 291 cs%restart_field(cs%novars)%vars = var_desc
292 cs%restart_field(cs%novars)%mand_var = mandatory
293 cs%restart_field(cs%novars)%initialized = .false.
294 call query_vardesc(cs%restart_field(cs%novars)%vars, &
295 name=cs%restart_field(cs%novars)%var_name, &
296 caller=
"register_restart_field_ptr1d")
298 cs%var_ptr1d(cs%novars)%p => f_ptr
299 cs%var_ptr4d(cs%novars)%p => null()
300 cs%var_ptr3d(cs%novars)%p => null()
301 cs%var_ptr2d(cs%novars)%p => null()
302 cs%var_ptr0d(cs%novars)%p => null()
307 real,
target :: f_ptr
308 type(
vardesc),
intent(in) :: var_desc
309 logical,
intent(in) :: mandatory
322 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
323 "register_restart_field: Module must be initialized before it is used.")
325 cs%novars = cs%novars+1
326 if (cs%novars > cs%max_fields)
return 329 cs%restart_field(cs%novars)%vars = var_desc
330 cs%restart_field(cs%novars)%mand_var = mandatory
331 cs%restart_field(cs%novars)%initialized = .false.
332 call query_vardesc(cs%restart_field(cs%novars)%vars, &
333 name=cs%restart_field(cs%novars)%var_name, &
334 caller=
"register_restart_field_ptr0d")
336 cs%var_ptr0d(cs%novars)%p => f_ptr
337 cs%var_ptr4d(cs%novars)%p => null()
338 cs%var_ptr3d(cs%novars)%p => null()
339 cs%var_ptr2d(cs%novars)%p => null()
340 cs%var_ptr1d(cs%novars)%p => null()
345 character(len=*) :: name
347 logical :: query_initialized
355 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
356 "query_initialized: Module must be initialized before it is used.")
362 if (trim(name) == cs%restart_field(m)%var_name)
then 369 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
371 call mom_error(note,
"MOM_restart: Unknown restart variable "//name// &
372 " queried for initialization.")
375 call mom_error(note,
"MOM_restart: "//name// &
376 " initialization confirmed by name.")
381 real,
target :: f_ptr
383 logical :: query_initialized
391 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
392 "query_initialized: Module must be initialized before it is used.")
398 if (
ASSOCIATED(cs%var_ptr0d(m)%p,f_ptr))
then 405 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
410 real,
dimension(:),
target :: f_ptr
412 logical :: query_initialized
420 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
421 "query_initialized: Module must be initialized before it is used.")
427 if (
ASSOCIATED(cs%var_ptr1d(m)%p,f_ptr))
then 434 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
439 real,
dimension(:,:),
target :: f_ptr
441 logical :: query_initialized
449 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
450 "query_initialized: Module must be initialized before it is used.")
456 if (
ASSOCIATED(cs%var_ptr2d(m)%p,f_ptr))
then 463 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
468 real,
dimension(:,:,:),
target :: f_ptr
470 logical :: query_initialized
478 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
479 "query_initialized: Module must be initialized before it is used.")
485 if (
ASSOCIATED(cs%var_ptr3d(m)%p,f_ptr))
then 492 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
497 real,
dimension(:,:,:,:),
target :: f_ptr
499 logical :: query_initialized
507 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
508 "query_initialized: Module must be initialized before it is used.")
514 if (
ASSOCIATED(cs%var_ptr4d(m)%p,f_ptr))
then 521 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
526 real,
target :: f_ptr
527 character(len=*) :: name
529 logical :: query_initialized
538 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
539 "query_initialized: Module must be initialized before it is used.")
545 if (
ASSOCIATED(cs%var_ptr0d(m)%p,f_ptr))
then 552 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
553 if (n==cs%novars+1)
then 555 call mom_error(note,
"MOM_restart: Unable to find "//name//
" queried by pointer, "//&
556 "probably because of the suspect comparison of pointers by ASSOCIATED.")
563 real,
dimension(:),
target :: f_ptr
564 character(len=*) :: name
566 logical :: query_initialized
575 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
576 "query_initialized: Module must be initialized before it is used.")
582 if (
ASSOCIATED(cs%var_ptr1d(m)%p,f_ptr))
then 589 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
590 if (n==cs%novars+1)
then 592 call mom_error(note,
"MOM_restart: Unable to find "//name//
" queried by pointer, "//&
593 "probably because of the suspect comparison of pointers by ASSOCIATED.")
600 real,
dimension(:,:),
target :: f_ptr
601 character(len=*) :: name
603 logical :: query_initialized
612 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
613 "query_initialized: Module must be initialized before it is used.")
619 if (
ASSOCIATED(cs%var_ptr2d(m)%p,f_ptr))
then 626 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
627 if (n==cs%novars+1)
then 629 call mom_error(note,
"MOM_restart: Unable to find "//name//
" queried by pointer, "//&
630 "probably because of the suspect comparison of pointers by ASSOCIATED.")
637 real,
dimension(:,:,:),
target :: f_ptr
638 character(len=*) :: name
640 logical :: query_initialized
649 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
650 "query_initialized: Module must be initialized before it is used.")
656 if (
ASSOCIATED(cs%var_ptr3d(m)%p,f_ptr))
then 663 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
664 if (n==cs%novars+1)
then 666 call mom_error(note,
"MOM_restart: Unable to find "//name//
" queried by pointer, "//&
667 "possibly because of the suspect comparison of pointers by ASSOCIATED.")
674 real,
dimension(:,:,:,:),
target :: f_ptr
675 character(len=*) :: name
677 logical :: query_initialized
686 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
687 "query_initialized: Module must be initialized before it is used.")
693 if (
ASSOCIATED(cs%var_ptr4d(m)%p,f_ptr))
then 700 if (n<=cs%novars) cs%restart_field(n)%initialized = .true.
701 if (n==cs%novars+1)
then 703 call mom_error(note,
"MOM_restart: Unable to find "//name//
" queried by pointer, "//&
704 "possibly because of the suspect comparison of pointers by ASSOCIATED.")
710 subroutine save_restart(directory, time, G, CS, time_stamped, filename, GV)
712 character(len=*),
intent(in) :: directory
713 type(time_type),
intent(in) :: time
716 logical,
optional,
intent(in) :: time_stamped
717 character(len=*),
optional,
intent(in) :: filename
729 type(
vardesc) :: vars(cs%max_fields)
731 type(fieldtype) :: fields(cs%max_fields)
732 character(len=200) :: restartpath
733 character(len=80) :: restartname
734 character(len=8) :: suffix
736 integer(kind=8) :: var_sz, size_in_file
738 integer(kind=8) :: max_file_size = 2147483647_8
741 integer :: start_var, next_var
744 integer :: m, nz, num_files, var_periods
745 integer :: seconds, days, year, month, hour, minute
746 character(len=8) :: hor_grid, z_grid, t_grid
747 character(len=8) :: t_grid_read
748 character(len=64) :: var_name
750 character(len=32) :: filename_appendix =
'' 753 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
754 "save_restart: Module must be initialized before it is used.")
760 if (cs%large_file_support) max_file_size = 4294967295_8
764 nz = 1 ;
if (
present(gv)) nz = gv%ke
766 call get_time(time,seconds,days)
767 restart_time =
real(days) +
real(seconds)/86400.0
769 restartname = trim(cs%restartfile)
770 if (
present(filename)) restartname = trim(filename)
771 if (
PRESENT(time_stamped))
then ;
if (time_stamped)
then 772 call get_date(time,year,month,days,hour,minute,seconds)
775 days = days + days_in_month(set_date(year,m,2,0,0,0))
777 seconds = seconds + 60*minute + 3600*hour
778 if (year <= 9999)
then 779 write(restartname,
'("_Y",I4.4,"_D",I3.3,"_S",I5.5)') year, days, seconds
780 else if (year <= 99999)
then 781 write(restartname,
'("_Y",I5.5,"_D",I3.3,"_S",I5.5)') year, days, seconds
783 write(restartname,
'("_Y",I10.10,"_D",I3.3,"_S",I5.5)') year, days, seconds
785 restartname = trim(cs%restartfile)//trim(restartname)
789 do while (next_var <= cs%novars )
791 size_in_file = 8*(2*g%Domain%niglobal+2*g%Domain%njglobal+2*nz+1000)
793 do m=start_var,cs%novars
794 call query_vardesc(cs%restart_field(m)%vars, hor_grid=hor_grid, &
795 z_grid=z_grid, t_grid=t_grid, caller=
"save_restart")
796 if (hor_grid ==
'1')
then 799 var_sz = 8*(g%Domain%niglobal+1)*(g%Domain%njglobal+1)
802 case (
'L') ; var_sz = var_sz * nz
803 case (
'i') ; var_sz = var_sz * (nz+1)
805 t_grid = adjustl(t_grid)
806 if (t_grid(1:1) ==
'p')
then 807 if (len_trim(t_grid(2:8)) > 0)
then 809 t_grid_read = adjustl(t_grid(2:8))
810 read(t_grid_read,*) var_periods
811 if (var_periods > 1) var_sz = var_sz * var_periods
815 if ((m==start_var) .OR. (size_in_file < max_file_size-var_sz))
then 816 size_in_file = size_in_file + var_sz
824 call get_filename_appendix(filename_appendix)
825 if(len_trim(filename_appendix) > 0)
then 826 length = len_trim(restartname)
827 if(restartname(length-2:length) ==
'.nc')
then 828 restartname = restartname(1:length-3)//
'.'//trim(filename_appendix)//
'.nc' 830 restartname = restartname(1:length) //
'.'//trim(filename_appendix)
834 restartpath = trim(directory)// trim(restartname)
836 if (num_files < 10)
then 837 write(suffix,
'("_",I1)') num_files
839 write(suffix,
'("_",I2)') num_files
842 if (num_files > 0) restartpath = trim(restartpath) // trim(suffix)
844 do m=start_var,next_var-1
845 vars(m-start_var+1) = cs%restart_field(m)%vars
847 call query_vardesc(vars(1), t_grid=t_grid, caller=
"save_restart")
848 t_grid = adjustl(t_grid)
849 if (t_grid(1:1) /=
'p') &
850 call modify_vardesc(vars(1), t_grid=
's', caller=
"save_restart")
852 if (cs%parallel_restartfiles)
then 853 call create_file(unit, trim(restartpath), vars, (next_var-start_var), &
854 fields, multiple, g=g, gv=gv)
856 call create_file(unit, trim(restartpath), vars, (next_var-start_var), &
857 fields, single_file, g=g, gv=gv)
860 do m=start_var,next_var-1
862 if (
ASSOCIATED(cs%var_ptr3d(m)%p))
then 863 call write_field(unit,fields(m-start_var+1), g%Domain%mpp_domain, &
864 cs%var_ptr3d(m)%p, restart_time)
865 elseif (
ASSOCIATED(cs%var_ptr2d(m)%p))
then 866 call write_field(unit,fields(m-start_var+1), g%Domain%mpp_domain, &
867 cs%var_ptr2d(m)%p, restart_time)
868 elseif (
ASSOCIATED(cs%var_ptr4d(m)%p))
then 869 call write_field(unit,fields(m-start_var+1), g%Domain%mpp_domain, &
870 cs%var_ptr4d(m)%p, restart_time)
871 elseif (
ASSOCIATED(cs%var_ptr1d(m)%p))
then 872 call write_field(unit, fields(m-start_var+1), cs%var_ptr1d(m)%p, &
874 elseif (
ASSOCIATED(cs%var_ptr0d(m)%p))
then 875 call write_field(unit, fields(m-start_var+1), cs%var_ptr0d(m)%p, &
880 call close_file(unit)
882 num_files = num_files+1
889 character(len=*),
intent(in) :: filename
890 character(len=*),
intent(in) :: directory
891 type(time_type),
intent(out) :: day
908 character(len=200) :: filepath
909 character(len=80) :: fname
910 character(len=8) :: suffix
912 character(len=256) :: mesg
913 character(len=80) :: varname
914 integer :: num_restart
918 integer :: start_char
920 integer :: n, m, start_of_day, num_days
921 integer :: isL, ieL, jsL, jeL, is0, js0
923 integer :: ndim, nvar, natt, ntime, pos
924 integer :: unit(cs%max_fields)
925 logical :: unit_is_global(cs%max_fields)
926 character(len=8) :: hor_grid
927 character(len=200) :: unit_path(cs%max_fields)
929 real,
allocatable :: time_vals(:)
930 type(fieldtype),
allocatable :: fields(:)
931 integer :: i, missing_fields
934 character(len=32) :: filename_appendix =
'' 935 character(len=80) :: restartname
938 num_restart = 0 ; n = 1 ; start_char = 1
939 if (.not.
associated(cs))
call mom_error(fatal,
"MOM_restart " // &
940 "restore_state: Module must be initialized before it is used.")
944 do while (start_char <= len_trim(filename) )
945 do m=start_char,len_trim(filename)
946 if (filename(m:m) ==
' ')
exit 948 fname = filename(start_char:m-1)
950 do while ((start_char <= len_trim(filename)) .and. (filename(start_char:start_char) ==
' '))
951 start_char = start_char + 1
954 if ((fname(1:1)==
'r') .and. ( len_trim(fname) == 1))
then 956 if (num_restart > 0) err = 1
958 restartname = trim(cs%restartfile)
961 call get_filename_appendix(filename_appendix)
962 if(len_trim(filename_appendix) > 0)
then 963 length = len_trim(restartname)
964 if(restartname(length-2:length) ==
'.nc')
then 965 restartname = restartname(1:length-3)//
'.'//trim(filename_appendix)//
'.nc' 967 restartname = restartname(1:length) //
'.'//trim(filename_appendix)
970 filepath = trim(directory) // trim(restartname)
972 if (num_restart < 10)
then 973 write(suffix,
'("_",I1)') num_restart
975 write(suffix,
'("_",I2)') num_restart
977 if (num_restart > 0) filepath = trim(filepath) // suffix
980 filepath = trim(filepath)//
".nc" 982 num_restart = num_restart + 1
983 inquire(file=filepath, exist=fexists)
985 call open_file(unit(n), trim(filepath), readonly_file, netcdf_file, &
986 threading = multiple, fileset = single_file)
987 unit_is_global(n) = .true.
988 elseif (cs%parallel_restartfiles)
then 989 if (g%Domain%use_io_layout)
then 993 call open_file(unit(n), trim(filepath), readonly_file, netcdf_file, &
994 domain=g%Domain%mpp_domain)
997 if (num_pes()>10000)
then 998 write(filepath,
'(a,i6.6)' ) trim(filepath)//
'.', pe_here()
1000 write(filepath,
'(a,i4.4)' ) trim(filepath)//
'.', pe_here()
1002 inquire(file=filepath, exist=fexists)
1004 call open_file(unit(n), trim(filepath), readonly_file, netcdf_file, &
1005 threading = multiple, fileset = single_file)
1007 if (fexists) unit_is_global(n) = .false.
1011 unit_path(n) = filepath
1014 call mom_error(note,
"MOM_restart: MOM run restarted using : "//trim(filepath))
1020 filepath = trim(directory)//trim(fname)
1021 inquire(file=filepath, exist=fexists)
1022 if (.not. fexists) filepath = trim(filepath)//
".nc" 1024 inquire(file=filepath, exist=fexists)
1026 call open_file(unit(n), trim(filepath), readonly_file, netcdf_file, &
1027 threading = multiple, fileset = single_file)
1028 unit_is_global(n) = .true.
1029 unit_path(n) = filepath
1032 call mom_error(note,
"MOM_restart: MOM run restarted using : "//trim(filepath))
1034 call mom_error(warning,
"MOM_restart: Unable to find restart file : "//trim(filepath))
1041 if (num_file == 0)
then 1042 write(mesg,
'("Unable to find any restart files specified by ",A," in directory ",A,".")') &
1043 trim(filename), trim(directory)
1044 call mom_error(fatal,
"MOM_restart: "//mesg)
1049 call get_file_info(unit(n), ndim, nvar, natt, ntime)
1050 if (ntime < 1) cycle
1052 allocate(time_vals(ntime))
1053 call get_file_times(unit(n), time_vals)
1055 deallocate(time_vals)
1057 start_of_day = int((t1 - int(t1)) *86400)
1059 day = set_time(start_of_day, num_days)
1063 if (n>num_file)
call mom_error(warning,
"MOM_restart: " // &
1064 "No times found in restart files.")
1070 call get_file_info(unit(n), ndim, nvar, natt, ntime)
1071 if (ntime < 1) cycle
1073 allocate(time_vals(ntime))
1074 call get_file_times(unit(n), time_vals)
1076 deallocate(time_vals)
1079 write(mesg,
'("WARNING: Restart file ",I2," has time ",F10.4,"whereas & 1080 &simulation is restarted at ",F10.4," (differing by ",F10.4,").")')&
1082 call mom_error(warning,
"MOM_restart: "//mesg)
1089 call get_file_info(unit(n), ndim, nvar, natt, ntime)
1091 allocate(fields(nvar))
1092 call get_file_fields(unit(n),fields(1:nvar))
1097 if (cs%restart_field(m)%initialized) cycle
1098 call query_vardesc(cs%restart_field(m)%vars, hor_grid=hor_grid, &
1099 caller=
"restore_state")
1100 select case (hor_grid)
1101 case (
'q') ; pos = corner
1102 case (
'h') ; pos = center
1103 case (
'u') ; pos = east_face
1104 case (
'v') ; pos = north_face
1105 case (
'Bu') ; pos = corner
1106 case (
'T') ; pos = center
1107 case (
'Cu') ; pos = east_face
1108 case (
'Cv') ; pos = north_face
1109 case (
'1') ; pos = 0
1110 case default ; pos = 0
1114 call get_file_atts(fields(i),name=varname)
1116 if (
ASSOCIATED(cs%var_ptr1d(m)%p))
then 1118 call read_data(unit_path(n), varname, cs%var_ptr1d(m)%p, &
1119 no_domain=.true., timelevel=1)
1120 elseif (
ASSOCIATED(cs%var_ptr0d(m)%p))
then 1121 call read_data(unit_path(n), varname, cs%var_ptr0d(m)%p, &
1122 no_domain=.true., timelevel=1)
1123 elseif ((pos == 0) .and.
ASSOCIATED(cs%var_ptr2d(m)%p))
then 1125 call read_data(unit_path(n), varname, cs%var_ptr2d(m)%p, &
1126 no_domain=.true., timelevel=1)
1127 elseif ((pos == 0) .and.
ASSOCIATED(cs%var_ptr3d(m)%p))
then 1129 call read_data(unit_path(n), varname, cs%var_ptr3d(m)%p, &
1130 no_domain=.true., timelevel=1)
1131 elseif ((pos == 0) .and.
ASSOCIATED(cs%var_ptr4d(m)%p))
then 1133 call read_data(unit_path(n), varname, cs%var_ptr4d(m)%p, &
1134 no_domain=.true., timelevel=1)
1135 elseif (unit_is_global(n) .or. g%Domain%use_io_layout)
then 1136 if (
ASSOCIATED(cs%var_ptr3d(m)%p))
then 1138 call read_data(unit_path(n), varname, cs%var_ptr3d(m)%p, &
1139 g%Domain%mpp_domain, 1, position=pos)
1140 elseif (
ASSOCIATED(cs%var_ptr2d(m)%p))
then 1141 call read_data(unit_path(n), varname, cs%var_ptr2d(m)%p, &
1142 g%Domain%mpp_domain, 1, position=pos)
1143 elseif (
ASSOCIATED(cs%var_ptr4d(m)%p))
then 1144 call read_data(unit_path(n), varname, cs%var_ptr4d(m)%p, &
1145 g%Domain%mpp_domain, 1, position=pos)
1147 call mom_error(fatal,
"MOM_restart restore_state: "//&
1148 "No pointers set for "//trim(varname))
1153 call get_file_atts(fields(i),ndim=ndim,siz=sizes)
1158 if ((pos == east_face) .or. (pos == corner)) is0 = 1-g%IsdB
1159 if (sizes(1) == g%iec-g%isc+1)
then 1160 isl = g%isc+is0 ; iel = g%iec+is0
1161 elseif (sizes(1) == g%IecB-g%IscB+1)
then 1162 isl = g%IscB+is0 ; iel = g%IecB+is0
1163 elseif (((pos == east_face) .or. (pos == corner)) .and. &
1164 (g%IscB == g%isc) .and. (sizes(1) == g%iec-g%isc+2))
then 1166 isl = g%isc-1+is0 ; iel = g%iec+is0
1168 call mom_error(warning,
"MOM_restart restore_state, "//trim(varname)//&
1169 " has the wrong i-size in "//trim(filepath))
1174 if ((pos == north_face) .or. (pos == corner)) js0 = 1-g%JsdB
1175 if (sizes(2) == g%jec-g%jsc+1)
then 1176 jsl = g%jsc+js0 ; jel = g%jec+js0
1177 elseif (sizes(2) == g%jecB-g%jscB+1)
then 1178 jsl = g%jscB+js0 ; jel = g%jecB+js0
1179 elseif (((pos == north_face) .or. (pos == corner)) .and. &
1180 (g%JscB == g%jsc) .and. (sizes(2) == g%jec-g%jsc+2))
then 1182 jsl = g%jsc-1+js0 ; jel = g%jec+js0
1184 call mom_error(warning,
"MOM_restart restore_state, "//trim(varname)//&
1185 " has the wrong j-size in "//trim(filepath))
1189 if (
ASSOCIATED(cs%var_ptr3d(m)%p))
then 1190 if (ntime == 0)
then 1191 call read_field(unit(n), fields(i), &
1192 cs%var_ptr3d(m)%p(isl:iel,jsl:jel,:))
1194 call read_field(unit(n), fields(i), &
1195 cs%var_ptr3d(m)%p(isl:iel,jsl:jel,:), 1)
1197 elseif (
ASSOCIATED(cs%var_ptr2d(m)%p))
then 1198 if (ntime == 0)
then 1199 call read_field(unit(n), fields(i), &
1200 cs%var_ptr2d(m)%p(isl:iel,jsl:jel))
1202 call read_field(unit(n), fields(i), &
1203 cs%var_ptr2d(m)%p(isl:iel,jsl:jel), 1)
1205 elseif (
ASSOCIATED(cs%var_ptr4d(m)%p))
then 1206 if (ntime == 0)
then 1207 call read_field(unit(n), fields(i), &
1208 cs%var_ptr4d(m)%p(isl:iel,jsl:jel,:,:))
1210 call read_field(unit(n), fields(i), &
1211 cs%var_ptr4d(m)%p(isl:iel,jsl:jel,:,:), 1)
1214 call mom_error(fatal,
"MOM_restart restore_state: "//&
1215 "No pointers set for "//trim(varname))
1218 cs%restart_field(m)%initialized = .true.
1222 if (i>nvar) missing_fields = missing_fields+1
1226 if (missing_fields == 0)
exit 1230 call close_file(unit(n))
1236 if (.not.(cs%restart_field(m)%initialized))
then 1237 cs%restart = .false.
1238 if (cs%restart_field(m)%mand_var)
then 1239 call mom_error(fatal,
"MOM_restart: Unable to find mandatory variable " &
1240 //trim(cs%restart_field(m)%var_name)//
" in restart files.")
1250 character(len=*),
optional,
intent(in) :: restart_root
1259 #include "version_variable.h" 1260 character(len=40) :: mdl =
"MOM_restart" 1262 if (
associated(cs))
then 1263 call mom_error(warning,
"restart_init called with an associated control structure.")
1270 call get_param(param_file, mdl,
"PARALLEL_RESTARTFILES", &
1271 cs%parallel_restartfiles, &
1272 "If true, each processor writes its own restart file, \n"//&
1273 "otherwise a single restart file is generated", &
1276 if (
present(restart_root))
then 1277 cs%restartfile = restart_root
1278 call log_param(param_file, mdl,
"RESTARTFILE from argument", cs%restartfile)
1280 call get_param(param_file, mdl,
"RESTARTFILE", cs%restartfile, &
1281 "The name-root of the restart file.", default=
"MOM.res")
1283 call get_param(param_file, mdl,
"LARGE_FILE_SUPPORT", cs%large_file_support, &
1284 "If true, use the file-size limits with NetCDF large \n"//&
1285 "file support (4Gb), otherwise the limit is 2Gb.", &
1287 call get_param(param_file, mdl,
"MAX_FIELDS", cs%max_fields, &
1288 "The maximum number of restart fields that can be used.", &
1291 allocate(cs%restart_field(cs%max_fields))
1292 allocate(cs%var_ptr0d(cs%max_fields))
1293 allocate(cs%var_ptr1d(cs%max_fields))
1294 allocate(cs%var_ptr2d(cs%max_fields))
1295 allocate(cs%var_ptr3d(cs%max_fields))
1296 allocate(cs%var_ptr4d(cs%max_fields))
1303 if (
associated(cs))
then 1312 if (
associated(cs%restart_field))
deallocate(cs%restart_field)
1313 if (
associated(cs%var_ptr0d))
deallocate(cs%var_ptr0d)
1314 if (
associated(cs%var_ptr1d))
deallocate(cs%var_ptr1d)
1315 if (
associated(cs%var_ptr2d))
deallocate(cs%var_ptr2d)
1316 if (
associated(cs%var_ptr3d))
deallocate(cs%var_ptr3d)
1317 if (
associated(cs%var_ptr4d))
deallocate(cs%var_ptr4d)
1326 character(len=16) :: num
1328 if (cs%novars > cs%max_fields)
then 1329 write(num,
'(I0)') cs%novars
1330 call mom_error(fatal,
"MOM_restart: Too many fields registered for " // &
1331 "restart. Set MAX_FIELDS to be at least " // &
1332 trim(adjustl(num)) //
" in the MOM input file.")
1334 call mom_error(fatal,
"MOM_restart: Unspecified fatal error.")
logical function query_initialized_3d_name(f_ptr, name, CS)
Ocean grid type. See mom_grid for details.
subroutine restart_error(CS)
Provides the ocean grid type.
logical function query_initialized_name(name, CS)
This module contains I/O framework code.
logical function query_initialized_1d(f_ptr, CS)
subroutine register_restart_field_ptr3d(f_ptr, var_desc, mandatory, CS)
subroutine, public restart_end(CS)
character(len=len(input_string)) function, public lowercase(input_string)
logical function, public is_root_pe()
logical function query_initialized_0d_name(f_ptr, name, CS)
logical function query_initialized_1d_name(f_ptr, name, CS)
logical function query_initialized_4d(f_ptr, CS)
logical function query_initialized_2d_name(f_ptr, name, CS)
logical function query_initialized_2d(f_ptr, CS)
logical function query_initialized_4d_name(f_ptr, name, CS)
Type for describing a variable, typically a tracer.
subroutine register_restart_field_ptr2d(f_ptr, var_desc, mandatory, CS)
subroutine register_restart_field_ptr1d(f_ptr, var_desc, mandatory, CS)
subroutine, public save_restart(directory, time, G, CS, time_stamped, filename, GV)
subroutine, public restart_init_end(CS)
logical function query_initialized_3d(f_ptr, CS)
subroutine, public query_vardesc(vd, name, units, longname, hor_grid, z_grid, t_grid, cmor_field_name, cmor_units, conversion, caller)
This routine queries vardesc.
subroutine register_restart_field_ptr4d(f_ptr, var_desc, mandatory, CS)
subroutine, public create_file(unit, filename, vars, novars, fields, threading, timeunit, G, dG, GV)
Routine creates a new NetCDF file. It also sets up structures that describe this file and variables t...
subroutine, public restart_init(param_file, CS, restart_root)
subroutine, public mom_error(level, message, all_print)
subroutine register_restart_field_ptr0d(f_ptr, var_desc, mandatory, CS)
subroutine, public modify_vardesc(vd, name, units, longname, hor_grid, z_grid, t_grid, cmor_field_name, cmor_units, conversion, caller)
This routine modifies the named elements of a vardesc type. All arguments are optional, except the vardesc type to be modified.
subroutine, public restore_state(filename, directory, day, G, CS)
logical function query_initialized_0d(f_ptr, CS)