61 TYPE(ncfile),
POINTER :: NCF
62 TYPE(ncvar),
POINTER :: VAR
65 TYPE(
time) :: INTERVAL_TIME, NEXT_TIME,PREV_TIME
66 INTEGER :: STKLEN, STKMAX,PREVSTK,NEXTSTK
68 INTEGER(itime) :: Dummy
70 CHARACTER(LEN=4) :: BFLAG,EFLAG,FLAG
82 if(dbg_set(dbg_log))
then 83 WRITE(
ipt,*)
'! SET TIME FOR HOTSTART !' 86 IF(.NOT.
ASSOCIATED(
nc_start))
CALL fatal_error&
87 & (
'STARUP FILE IS NOT ASSOCIATED IN SETUP_TIME!')
96 &
Call fatal_error(
"Could not read the date string START_DATE: "//trim(
start_date))
100 EndTime = READ_DATETIME(END_DATE,DATE_FORMAT,TIMEZONE,status)
102 &
Call fatal_error(
"Could not read the date string END_DATE: "&
106 &
Call fatal_error(
"Runfile Start_Date exceeds or equal to End_Date")
123 &
Call fatal_error(
"Could not read the date string DATE_REFERENCE: "//trim(
date_reference))
136 IF (bflag /= eflag)
CALL fatal_error&
137 (
'IDEALIZED MODEL TIME SPECIFICATION IS INCORRENT',&
138 &
'BEGIN AND END CAN BE IN EITHER CYCLES OR TIME BUT NOT MIXED',&
141 IF (bflag ==
'time')
THEN 157 ELSE IF(bflag ==
'step')
THEN 163 IF(
nsteps .LT. 0)
CALL fatal_error&
164 &(
'Number of steps can not be less than zero')
172 EndTime = StartTime + IMDTI * nsteps
180 CALL fatal_error(
'IDEAL_TIME_STRING2TIME returned invalid flag')
189 runfile_starttime = starttime
209 stkmax = ncav_output_stack
212 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! TIME AVERAGE OUTPUT:" 214 &,nextstk,prev_time,prevstk,stklen,stkmax)
217 if (starttime > next_time)&
218 &
Call fatal_error(
"The time of the first averaged output & 219 &must be greater than or equal to the start time")
221 if (endtime < next_time)&
222 &
Call fatal_error(
"The time of the first averaged output & 223 &must be less than or equal to the end time")
237 stkmax = nc_output_stack
240 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! NETCDF OUTPUT:" 242 &,nextstk,prev_time,prevstk,stklen,stkmax)
246 if (starttime > next_time)&
247 &
Call fatal_error(
"The time of the first file output & 248 &must be greater than or equal to the start time")
250 if (endtime < next_time)&
251 &
Call fatal_error(
"The time of the first file output & 252 &must be less than or equal to the end time")
268 stkmax = rst_output_stack
271 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! RESTART OUTPUT:" 273 &,nextstk,prev_time,prevstk,stklen,stkmax)
277 if (starttime > next_time)&
278 &
Call fatal_error(
"The time of the first restart output & 279 &must be greater than or equal to the start time")
281 if (endtime < next_time)&
282 &
Call fatal_error(
"The time of the first restart output & 283 &must be less than or equal to the end time")
292 if(dbg_set(dbg_log))
then 293 WRITE(ipt,*)
'! SET TIME FOR CRASHRESTART !' 297 IF(.NOT.
ASSOCIATED(nc_start))
CALL fatal_error&
298 & (
'STARUP FILE IS NOT ASSOCIATED IN SETUP_TIME!')
300 IF(forecast_mode)
THEN 302 starttime = read_datetime(start_date,date_format,timezone,status)
304 &
Call fatal_error(
"Could not read the date string START_DATE: "//trim(start_date))
313 SELECT CASE(use_real_world_time)
316 runfile_starttime = read_datetime(start_date,date_format,timezone,status)
318 &
Call fatal_error(
"Could not read the date string START_DATE: "//trim(start_date))
322 EndTime = READ_DATETIME(END_DATE,DATE_FORMAT,TIMEZONE,status)
324 &
Call fatal_error(
"Could not read the date string END_DATE: "&
328 if(starttime .GT. endtime) &
329 &
Call fatal_error(
"Runfile Start_Date exceeds or equal to End_Date")
337 iend = istart + nsteps
340 IF(date_reference /=
'default')
THEN 341 referencedate = read_datetime(date_reference,date_format,timezone,status)
343 &
Call fatal_error(
"Could not read the date string DATE_REFERENCE: "//trim(date_reference))
345 referencedate%MJD = 0
346 referencedate%MuSOD = 0
358 IF (bflag /= eflag)
CALL fatal_error&
359 (
'IDEALIZED MODEL TIME SPECIFICATION IS INCORRENT',&
360 &
'BEGIN AND END CAN BE IN EITHER CYCLES OR TIME BUT NOT MIXED',&
361 & trim(start_date),trim(end_date) )
363 IF (eflag ==
'time')
THEN 373 iend = istart + nsteps
376 ELSE IF(eflag ==
'step')
THEN 379 runfile_starttime = imdti * istart
385 IF(nsteps .LT. 0)
CALL fatal_error&
386 &(
'Number of steps can not be less than zero')
388 IF(istart .LT. 0)
CALL fatal_error&
389 &(
'Starting time step can not be less than zero')
392 EndTime = StartTime + IMDTI * nsteps
399 CALL fatal_error(
'IDEAL_TIME_STRING2TIME returned invalid flag')
423 ncf%FNAME=nc_avg%FNAME
429 stklen = ncf%FTIME%stk_len
434 IF (stklen .GT. 1)
THEN 436 CALL update_file_bracket(ncf,starttime,status)
454 IF(ncf%FTIME%NEXT_IO == starttime)
then 455 next_time = starttime
456 nextstk = ncf%FTIME%NEXT_STKCNT + 1
458 prev_time = ncf%FTIME%PREV_IO
459 prevstk = ncf%FTIME%PREV_STKCNT + 1
461 else if (ncf%FTIME%PREV_IO == starttime)
then 462 next_time = starttime
463 nextstk = ncf%FTIME%NEXT_STKCNT
465 prev_time = starttime - interval_time
466 prevstk = ncf%FTIME%PREV_STKCNT
469 call fatal_error(
'Something is very wrong with update_file_bracket!')
475 call fatal_error(
'Start time is before or after average output ???')
490 ELSE IF(stklen .eq. 1)
THEN 506 next_time = get_file_time_ncf(ncf,stklen)
507 if (next_time == starttime)
then 516 call fatal_error(
'Cant crash restart when the restart time is not an average output time!')
533 IF(next_time < starttime)
THEN 534 CALL print_time(starttime,ipt,
"Start Time")
535 CALL print_time(next_time,ipt,
"First AVG OUTPUT")
538 & (
"CAN NOT CONNECT TO EXISTING FILE - THERE IS A TIME GAP",&
539 "BETWEEN THE EXISTING OUTPUT AND THE START TIME?")
544 if (endtime < next_time)&
545 &
Call fatal_error(
"The time of the first averaged output & 546 &must be less than or equal to the end time")
554 stkmax = ncav_output_stack
557 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! TIME AVERAGE OUTPUT:" 559 &,nextstk,prev_time,prevstk,stklen,stkmax)
562 Call print_file(nc_avg)
572 ncf%FNAME=nc_dat%FNAME
578 stklen = ncf%FTIME%stk_len
581 IF (stklen .GT. 1)
THEN 583 CALL update_file_bracket(ncf,starttime,status)
585 prev_time = ncf%FTIME%PREV_IO
586 prevstk= ncf%FTIME%PREV_STKCNT
589 nextstk = ncf%FTIME%NEXT_STKCNT
590 next_time = ncf%FTIME%NEXT_IO
595 prev_time = get_file_time_ncf(ncf,stklen)
599 next_time = prev_time + interval_time
601 IF(starttime > next_time)
call fatal_error&
602 &(
"COULD NOT FIND VALID BRACKET FOR START TIME IN THE DATA FILE",&
603 &
"Try comparing the time in the restart and the data file?")
607 ELSE IF(stklen .eq. 1)
THEN 609 prev_time = get_file_time_ncf(ncf,stklen)
610 IF (prev_time <= starttime)
THEN 615 next_time = prev_time + interval_time
630 IF(next_time < starttime)
THEN 631 CALL print_time(starttime,ipt,
"Start Time")
632 CALL print_time(next_time,ipt,
"First DATA OUTPUT")
635 & (
"CAN NOT CONNECT TO EXISTING FILE - THERE IS A TIME GAP",&
636 "BETWEEN THE EXISTING OUTPUT AND THE START TIME?")
640 if (endtime < next_time)&
641 &
Call fatal_error(
"The time of the first file output & 642 &must be less than or equal to the end time")
646 stkmax = nc_output_stack
648 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! NETCDF OUTPUT:" 650 &,nextstk,prev_time,prevstk,stklen,stkmax)
662 stklen = nc_start%FTIME%stk_len
667 IF (stklen .GT. 1)
THEN 670 ncf%FTIME%PREV_IO = zerotime
671 ncf%FTIME%prev_stkcnt = 0
672 CALL update_file_bracket(ncf,starttime,status)
673 IF(status /= 0)
call fatal_error&
674 &(
" COULD NOT FIND VALID BRACKET FOR START TIME IN THE DATA FILE")
679 IF (ncf%FTIME%PREV_IO == starttime)
THEN 681 prev_time = ncf%FTIME%PREV_IO
682 prevstk= ncf%FTIME%PREV_STKCNT
685 nextstk = ncf%FTIME%NEXT_STKCNT
686 next_time = ncf%FTIME%NEXT_IO
687 ELSE IF (ncf%FTIME%NEXT_IO == starttime)
THEN 689 prev_time= ncf%FTIME%NEXT_IO
690 prevstk= ncf%FTIME%NEXT_STKCNT
692 next_time= prev_time + interval_time
693 nextstk = prevstk + 1
696 CALL fatal_error(
"DID NOT MATCH START TIME TO RESTART FILE")
700 ELSE IF(stklen .eq. 1)
THEN 702 prev_time = get_file_time_ncf(ncf,stklen)
707 next_time = prev_time + interval_time
712 CALL fatal_error(
"What a mess this is... ",&
713 &
"I suggest a strong cocktail before you try and figure this one out!")
719 ncf%FTIME%PREV_IO= prev_time
720 ncf%FTIME%PREV_STKCNT=prevstk
722 ncf%FTIME%NEXT_IO = next_time
723 ncf%FTIME%NEXT_STKCNT = nextstk
725 if (endtime < next_time)&
726 &
Call fatal_error(
"The time of the first file output & 727 &must be less than or equal to the end time")
730 stkmax = rst_output_stack
732 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! RESTART OUTPUT:" 734 &,nextstk,prev_time,prevstk,stklen,stkmax)
743 if(dbg_set(dbg_log))
then 744 WRITE(ipt,*)
'! SET TIME FOR COLDSTART !' 749 SELECT CASE(use_real_world_time)
753 starttime = read_datetime(start_date,date_format,timezone,status)
755 &
Call fatal_error(
"Could not read the date string START_DATE: "//trim(start_date))
758 EndTime = READ_DATETIME(END_DATE,DATE_FORMAT,TIMEZONE,status)
760 &
Call fatal_error(
"Could not read the date string END_DATE: "&
764 if(starttime .GT. endtime) &
765 &
Call fatal_error(
"Runfile Start_Date exceeds or equal to End_Date")
768 IF(date_reference /=
'default')
THEN 769 referencedate = read_datetime(date_reference,date_format,timezone,status)
771 &
Call fatal_error(
"Could not read the date string DATE_REFERENCE: "//trim(date_reference))
773 referencedate%MJD = 0
774 referencedate%MuSOD = 0
781 iend = istart + nsteps
783 IF(
ASSOCIATED(nc_start))
THEN 784 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
785 &
"! SETTING PREV_STCKNT FOR NETCDF COLD START FILE 1" 790 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
791 &
"! NO NETCDF COLD START FILE" 804 IF (bflag /= eflag)
CALL fatal_error&
805 (
'IDEALIZED MODEL TIME SPECIFICATION IS INCORRENT',&
806 &
'BEGIN AND END CAN BE IN EITHER CYCLES OR TIME BUT NOT MIXED',&
807 & trim(start_date),trim(end_date) )
809 IF (bflag ==
'time')
THEN 815 iend = istart + nsteps
817 IF(
ASSOCIATED(nc_start))
THEN 818 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
819 &
"! SETTING PREV_STCKNT FOR NETCDF COLD START FI& 825 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
826 &
"! NO NETCDF COLD START FILE" 831 ELSE IF(bflag ==
'step')
THEN 837 IF(nsteps .LT. 0)
CALL fatal_error&
838 &(
'Number of steps can not be less than zero')
841 starttime = imdti * iint
844 EndTime = IMDTI * iend
851 IF(
ASSOCIATED(nc_start))
THEN 852 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
853 &
"! SETTING PREV_STCKNT FOR NETCDF COLD START FI& 859 IF(dbg_set(dbg_log))
WRITE(ipt,*) &
860 &
"! NO NETCDF COLD START FILE" 865 CALL fatal_error(
'IDEAL_TIME_STRING2TIME returned invalid flag')
873 runfile_starttime = starttime
880 IF(
ASSOCIATED(nc_start))
THEN 897 stkmax = ncav_output_stack
900 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! TIME AVERAGE OUTPUT:" 902 &,nextstk,prev_time,prevstk,stklen,stkmax)
905 if (starttime > next_time)&
906 &
Call fatal_error(
"The time of the first averaged output & 907 &must be greater than or equal to the start time")
909 if (endtime < next_time)&
910 &
Call fatal_error(
"The time of the first averaged output & 911 &must be less than or equal to the end time")
925 stkmax = nc_output_stack
928 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! NETCDF OUTPUT:" 930 &,nextstk,prev_time,prevstk,stklen,stkmax)
934 if (starttime > next_time)&
935 &
Call fatal_error(
"The time of the first file output & 936 &must be greater than or equal to the start time")
938 if (endtime < next_time)&
939 &
Call fatal_error(
"The time of the first file output & 940 &must be less than or equal to the end time")
956 stkmax = rst_output_stack
959 IF(dbg_set(dbg_log))
WRITE(ipt,*)
"! RESTART OUTPUT:" 961 &,nextstk,prev_time,prevstk,stklen,stkmax)
965 if (starttime > next_time)&
966 &
Call fatal_error(
"The time of the first restart output & 967 &must be greater than or equal to the start time")
969 if (endtime < next_time)&
970 &
Call fatal_error(
"The time of the first restart output & 971 &must be less than or equal to the end time")
979 CALL fatal_error(
"UNKNOWN STARUP TYPE IN RUNFILE")
994 interval_time = nc_rst%FTIME%INTERVAL
995 next_time = nc_rst%FTIME%NEXT_IO
997 IF(mod(interval_time,imdti) /= zerotime)
THEN 998 CALL fatal_error(
"RST_OUT_INTERVAL must be an integer number of int& 1001 IF(mod((next_time - starttime),imdti) /= zerotime)
THEN 1002 CALL fatal_error(
"RST_FIRST_OUT must be an integer number of int& 1003 &ernal time steps from the StartTime!")
1009 interval_time = nc_dat%FTIME%INTERVAL
1010 next_time = nc_dat%FTIME%NEXT_IO
1011 IF(mod(interval_time,imdti) /= zerotime)
THEN 1012 CALL fatal_error(
"NC_OUT_INTERVAL must be an integer number of int& 1013 &ernal time steps!")
1015 IF(mod((next_time - starttime),imdti) /= zerotime)
THEN 1016 CALL fatal_error(
"NC_FIRST_OUT must be an integer number of int& 1017 &ernal time steps from the StartTime!")
1024 interval_time = nc_avg%FTIME%INTERVAL
1025 next_time = nc_avg%FTIME%NEXT_IO
1027 IF(mod(interval_time,imdti) /= zerotime)
THEN 1028 CALL fatal_error(
"NCAV_OUT_INTERVAL must be an integer number of int& 1029 &ernal time steps!")
1031 IF(mod((next_time - starttime),imdti) /= zerotime)
THEN 1032 CALL fatal_error(
"NCAV_FIRST_OUT must be an integer number of int& 1033 &ernal time steps from the StartTime!")
1040 IF(mod(nc_rst%FTIME%INTERVAL,interval_time) /= zerotime)
THEN 1041 CALL fatal_error(
"NCAV_OUT_INTERVAL: The restart file int& 1042 &erval must be an integer number of Average intervals!")
1046 IF(mod(nc_rst%FTIME%NEXT_IO-next_time,interval_time) /= zerotime)
THEN 1048 &(
"NCAV_FIRST_OUT: Any Restart dump time must also be a average output time!",&
1049 &
"MOD(RST_FIRST_OUT - NCAV_FIRST_OUT,NCAV_OUT_INTERVAL)/=0 IS AN ERROR")
1065 IF(recalculate_rho_mean)
THEN 1066 recalc_rho_mean = starttime
1070 IF(flag ==
'step')
THEN 1073 IF(nsteps .LE. 0)
CALL fatal_error&
1074 &(
'Number of steps for INTERVAL_RHO_MEAN can not be less than zero')
1077 delt_rho_mean = imdti * nsteps
1079 ELSE IF(flag ==
'time')
THEN 1082 IF(delt_rho_mean .LE. zerotime)
CALL fatal_error&
1083 &(
'INTERVAL_RHO_MEAN can not be LE zero seconds!')
1089 interval_time = nc_rst%FTIME%INTERVAL
1090 next_time = nc_rst%FTIME%NEXT_IO
1092 IF(mod(interval_time,delt_rho_mean) /= zerotime)
THEN 1093 CALL warning(
"MODEL RESTART IS NOT PERFECT WHEN USING RHO MEAN RECALCULATION,",&
1094 "TO FIX: SET MOD(RST_OUT_INTERVAL,INTERVAL_RHO_MEAN)==0!")
1098 IF(mod((next_time - starttime),delt_rho_mean) /= zerotime)
THEN 1099 CALL warning(
"MODEL RESTART IS NOT PERFECT WHEN USING RHO MEAN RECALCULATION,",&
1100 "TO FIX: SET MOD(RST_FIRST_OUT-StartTime,INTERVAL_RHO_MEAN)==0!")
1114 SELECT CASE(use_real_world_time)
1117 if(dbg_set(dbg_log))
then 1119 write(ipt,*)
"! This case uses real world with specified start and end dates" 1122 call print_real_time(starttime,ipt,
"Start Time",timezone)
1125 call print_real_time(endtime,ipt,
"End Time",timezone)
1127 call print_time(imdte,ipt,
"External Time STEP")
1128 write(ipt,*)
"! DTE(seconds) = ",dte
1129 call print_time(imdti,ipt,
"Internal Time STEP")
1130 write(ipt,*)
"! DTI(seconds) = ",dti
1132 write(ipt,*)
"!=============================" 1133 write(ipt,*)
"! ISTART = ",istart
1134 write(ipt,*)
"! IEND = ",iend
1135 write(ipt,*)
"!=============================" 1136 write(ipt,*)
"!+++++++++++ FINISED MODEL TIME SETUP ++++++++++++++" 1137 write(ipt,*)
"!===================================================" 1141 if(dbg_set(dbg_log))
then 1143 write(ipt,*)
"!This is an idealized case with a specified runtime" 1146 call print_time(starttime,ipt,
"Start Time")
1149 call print_time(endtime,ipt,
"End Time")
1151 call print_time(imdte,ipt,
"External Time STEP")
1152 write(ipt,*)
"! DTE(seconds) = ",dte
1153 call print_time(imdti,ipt,
"Internal Time STEP")
1154 write(ipt,*)
"! DTI(seconds) = ",dti
1157 write(ipt,*)
"! =============================" 1158 write(ipt,*)
"! ISTART = ",istart
1159 write(ipt,*)
"! IEND = ",iend
1160 write(ipt,*)
"! =============================" 1161 write(ipt,*)
"! +++++++++++ FINISED MODEL TIME SETUP ++++++++++++++" 1162 write(ipt,*)
"! ===================================================" 1172 if(dbg_set(dbg_log)) &
1173 &
write(ipt,*)
"!========= Setting up model time parameters ===========" 1177 imdte = seconds2time(extstep_seconds)
1180 dte = seconds(imdte)
1182 if(dbg_set(dbg_io))
write(ipt,*)
"! IMDTE (microseconds)= ",imdte
1183 if(dbg_set(dbg_io))
write(ipt,*)
"! DTE (seconds) = ",dte
1185 if (imdte .LE. zerotime) &
1186 &
Call fatal_error(
"EXTSTEP_SECONDS must be greater than 10**-6 seconds!")
1188 if (isplit .LE. 0) &
1189 &
Call fatal_error(
"ISPLIT must be greater than zero!")
1192 imdti = isplit * imdte
1193 dti = seconds(imdti)
1201 CHARACTER(LEN=*),
INTENT(IN) :: STRING
1202 TYPE(time),
INTENT(OUT) :: NTIME
1203 INTEGER(ITIME),
INTENT(OUT) :: tstep
1204 CHARACTER(LEN=4),
INTENT(OUT) :: FLAG
1208 INTEGER :: NLINE, NCHAR, INTVAL(150), NVAL
1209 REAL(DP) :: REALVAL(150)
1210 CHARACTER(LEN=40) :: VARNAME
1211 CHARACTER(LEN=80) :: STRINGVAL(150)
1212 CHARACTER(LEN=7) :: VARTYPE
1217 nchar = len_trim(string)
1219 CALL get_value(nline,nchar,string,varname,vartype,logval&
1220 &,stringval,realval,intval,nval)
1223 SELECT CASE(varname)
1225 IF(vartype ==
'float')
THEN 1226 ntime= days2time(realval(1))
1229 CALL fatal_error(
"IDEAL_TIME_STRING2TIME: Unknown Time or Length of Time:",&
1230 & trim(string),
"Bad type (check for missing '.')")
1234 IF(vartype ==
'float')
THEN 1235 ntime = seconds2time(realval(1))
1239 CALL fatal_error(
"IDEAL_TIME_STRING2TIME: Unknown Time or Length of Time:",&
1240 & trim(string),
"Bad type (check for missing '.')")
1246 IF(vartype ==
'integer')
THEN 1252 CALL fatal_error(
"IDEAL_TIME_STRING2TIME: Unknown Time or Length of Time::",&
1253 & trim(string),
"Bad type (remove '.' ?)")
1258 CALL fatal_error(
"IDEAL_TIME_STRING2TIME: Unknown Time or Length of Time::",&
1259 & trim(string),
"Bad units, can be 'seconds' 'days' or 'cycle'")
1269 INTEGER(itime) :: tstep
1270 TYPE(time),
INTENT(IN) :: stime, etime
1275 temp = seconds(etime-stime) / seconds(imdti)
1276 tstep = ceiling(temp)-1
1282 TYPE(ncfile),
POINTER :: NCF
1283 TYPE(time),
INTENT(OUT) :: Stime
1284 INTEGER(ITIME),
INTENT(OUT) :: STEP
1286 INTEGER,
TARGET :: FSTEP
1288 integer :: status, I
1290 TYPE(ncvar),
POINTER :: VAR
1293 IF(.NOT.
ASSOCIATED(ncf))
CALL fatal_error &
1294 & (
"SET_LAST_FILE_TIME: The file object is not assocaited!")
1297 status = set_file_time_type(ncf)
1298 IF(status /= 0)
CALL fatal_error &
1299 & (
"COULD NOT FIND A VALID TIME VARIABLE IN THE RESTART FILE: ",&
1303 i = ncf%FTIME%STK_LEN
1305 IF (i .LE. 0)
CALL fatal_error(
"FILE LENGTH IS LESS THAN ONE - NO VALID RESTART TIMES!")
1307 stime =get_file_time_ncf(ncf,i)
1309 ncf%FTIME%PREV_STKCNT = i
1310 ncf%FTIME%PREV_IO = stime
1312 var => find_var(ncf,
'iint',found)
1313 IF(.not. found)
CALL fatal_error(
"COULD NOT FIND VARIABLE 'iint'& 1314 & IN THE CRASH RESTART FILE OBJECT")
1315 var%scl_int => fstep
1316 CALL nc_read_var(var,i)
1324 TYPE(time),
INTENT(IN) :: Stime
1325 INTEGER(ITIME),
INTENT(OUT),
OPTIONAL :: STEP
1327 INTEGER,
TARGET :: FSTEP
1329 integer :: status, I
1331 TYPE(ncfile),
POINTER :: NCF
1332 TYPE(ncvar),
POINTER :: VAR
1336 IF(.NOT.
ASSOCIATED(nc_start))
CALL fatal_error &
1337 & (
"The file object NC_START is not assocaited!")
1340 status = set_file_time_type(nc_start)
1341 IF(status /= 0)
CALL fatal_error &
1342 & (
"COULD NOT FIND A VALID TIME VARIABLE IN THE RESTART FILE: ",&
1343 & trim(nc_start%FNAME))
1348 IF (i .GT. nc_start%FTIME%STK_LEN)
THEN 1350 IF(dbg_set(dbg_log))&
1351 &
CALL print_real_time(stime,ipt,
"Asked for Start Time")
1354 IF(dbg_set(dbg_log))&
1355 &
CALL print_real_time(get_file_time_ncf(nc_start,1),ipt,
"The Only Restart Time Is")
1359 & (
"Restart file has time dimension equal zero!:",&
1360 & trim(nc_start%FNAME))
1362 atime =get_file_time_ncf(nc_start,1)
1363 IF(dbg_set(dbg_log))&
1364 &
CALL print_real_time(atime,ipt,
"First Restart Time")
1366 atime =get_file_time_ncf(nc_start,i-1)
1367 IF(dbg_set(dbg_log))&
1368 &
CALL print_real_time(atime,ipt,
"Last Restart Time")
1372 & (
"COULD NOT FIND A MATCHING START TIME IN THE RESTART FILE!:",&
1373 &
"(See time options printed above?)",&
1374 & trim(nc_start%FNAME))
1377 atime = get_file_time_ncf(nc_start,i)
1381 IF(abs(atime -stime)<0.1_sp*imdti)
THEN 1383 nc_start%FTIME%PREV_STKCNT = i
1386 nc_start%FTIME%PREV_IO = stime
1388 IF (
PRESENT(step))
THEN 1389 var => find_var(nc_start,
'iint',found)
1390 IF(.not. found)
CALL fatal_error(
"COULD NOT FIND VARIABLE 'iint'& 1391 & IN THE HOTSTART FILE OBJECT")
1392 var%scl_int => fstep
1393 CALL nc_read_var(var,i)
1408 INTEGER(ITIME),
INTENT(IN) :: STEP
1409 TYPE(time),
OPTIONAL,
INTENT(OUT) :: Atime
1410 integer :: status, I
1412 TYPE(ncfile),
POINTER :: NCF
1413 TYPE(ncvar),
POINTER :: VAR
1414 INTEGER,
TARGET :: FSTEP
1417 IF(.NOT.
ASSOCIATED(nc_start))
CALL fatal_error &
1418 & (
"The file object NC_START is not assocaited!")
1421 status = set_file_time_type(nc_start)
1422 IF(status /= 0)
CALL fatal_error &
1423 & (
"COULD NOT FIND A VALID TIME VARIABLE IN THE RESTART FILE: ",&
1424 & trim(nc_start%FNAME))
1429 IF (i .GT. nc_start%FTIME%STK_LEN)
THEN 1432 & (
"COULD NOT FIND A MATCHING IINT CYCLE NUMBER IN THE RESTART FILE!:",&
1433 & trim(nc_start%FNAME))
1436 var => find_var(nc_start,
'iint',found)
1437 IF(.not. found)
CALL fatal_error(
"COULD NOT FIND VARIABLE 'iint'& 1438 & IN THE HOTSTART FILE OBJECT")
1439 var%scl_int => fstep
1440 CALL nc_read_var(var,i)
1442 IF (fstep == step)
THEN 1444 if (
PRESENT(atime))
THEN 1445 atime = get_file_time_ncf(nc_start,i)
1447 nc_start%FTIME%PREV_STKCNT = i
1448 nc_start%FTIME%PREV_IO = atime
1461 integer :: status, I
1464 TYPE(ncfile),
POINTER :: NCF
1465 TYPE(ncdim),
POINTER :: DIM
1474 IF(.NOT.
ASSOCIATED(nc_start))
CALL fatal_error &
1475 & (
"The file object NC_START is not assocaited!")
1479 IF (startup_type .EQ. startup_type_crashrestart .OR. &
1480 & startup_type .EQ. startup_type_hotstart)
THEN 1482 dim => find_dim(nc_start,
"nele",found)
1483 IF(.not. found)
CALL fatal_error&
1484 & (
"START FILE IS MISSING A CRITICAL DIMENSION:",&
1485 & trim(nc_start%FNAME))
1487 IF (dim%DIM /= ngl)
CALL fatal_error&
1488 & (
"START FILE DIMENSION 'nele' DOES NOT MATCH:",&
1489 & trim(nc_start%FNAME))
1491 dim => find_dim(nc_start,
"node",found)
1492 IF(.not. found)
CALL fatal_error&
1493 & (
"START FILE IS MISSING A CRITICAL DIMENSION:",&
1494 & trim(nc_start%FNAME))
1496 IF (dim%DIM /= mgl)
CALL fatal_error&
1497 & (
"START FILE DIMENSION 'node' DOES NOT MATCH THE RUN FILE:",&
1498 & trim(nc_start%FNAME))
1501 IF(startup_uv_type .eq. startup_type_setvalues .OR. &
1502 & startup_turb_type .eq. startup_type_setvalues .OR.&
1503 & startup_ts_type .eq. startup_type_setvalues)
THEN 1505 dim => find_dim(nc_start,
"siglay",found)
1506 IF(.not. found)
CALL fatal_error&
1507 & (
"RESTART FILE IS MISSING A CRITICAL DIMENSION:",&
1508 & trim(nc_start%FNAME))
1510 IF (dim%DIM /= kbm1)
CALL fatal_error&
1511 & (
"RESTART FILE DIMENSION 'siglay' DOES NOT MATCH THE RUN FILE:",&
1512 & trim(nc_start%FNAME))
1514 dim => find_dim(nc_start,
"siglev",found)
1515 IF(.not. found)
CALL fatal_error&
1516 & (
"RESTART FILE IS MISSING A CRITICAL DIMENSION:",&
1517 & trim(nc_start%FNAME))
1519 IF (dim%DIM /= kbm1)
CALL fatal_error&
1520 & (
"RESTART FILE DIMENSION 'siglay' DOES NOT MATCH THE RUN FILE:",&
1521 & trim(nc_start%FNAME))
1528 CHARACTER(LEN=*),
INTENT(IN) :: STRING
1529 TYPE(time),
INTENT(OUT) :: FIRST_TIME
1532 if (use_real_world_time)
then 1533 first_time = read_datetime(string,date_format,timezone,status)
1534 if (status == 0 )
Call fatal_error &
1535 (
"GET_FIRST_OUTPUT_TIME: Could not read the date string: "//trim(string))
1548 CHARACTER(LEN=*),
INTENT(IN) :: STRING
1549 TYPE(time),
INTENT(OUT) :: INTERVAL
1551 CHARACTER(LEN=4) :: FLAG
1553 INTEGER(ITIME) :: tstep
1558 IF (flag ==
'time')
THEN 1562 ELSE IF(flag ==
'step')
THEN 1564 interval= tstep * imdti
1567 CALL fatal_error(
'GET_OUTPUT_FILE_INTERVAL: bad flag value?')
1574 SUBROUTINE set_output_file_time(NCF,OUT_INTERVAL,NEXT_TIME,NEXT_STK,PREV_TIME,PREV_STK,STKLEN,STACK_MAX)
1576 TYPE(ncfile),
POINTER :: NCF
1577 TYPE(time),
INTENT(IN) :: NEXT_TIME, PREV_TIME
1578 TYPE(time),
INTENT(IN) :: OUT_INTERVAL
1579 INTEGER,
INTENT(IN) :: STACK_MAX,STKLEN,NEXT_STK, PREV_STK
1581 TYPE(time) :: ZEROTIME
1582 TYPE(ncftime),
POINTER :: FTM
1585 IF(dbg_set(dbg_sbr))
WRITE(ipt,*)
"SET_OUTPUT_FILE_TIME: START" 1587 IF(dbg_set(dbg_io))
THEN 1588 WRITE(ipt,*)
"=== PRINTING IO INFO FOR: SET_OUTPUT_FILE_TIME ===" 1589 CALL print_time(out_interval,ipt,
"OUT_INTERVAL")
1590 CALL print_time(next_time,ipt,
"NEXT_TIME")
1591 WRITE(ipt,*)
"NEXT_STK=",next_stk
1592 CALL print_time(prev_time,ipt,
"PREV_TIME")
1593 WRITE(ipt,*)
"PREV_STK=",prev_stk
1594 WRITE(ipt,*)
"STKLEN=",stklen
1595 WRITE(ipt,*)
"STACK_MAX=",stack_max
1596 WRITE(ipt,*)
"=== END IO INFO FOR: SET_OUTPUT_FILE_TIME ===" 1599 IF (.NOT.
ASSOCIATED(ncf))
CALL fatal_error &
1600 & (
'SET_OUTPUT_FILE_TIME: FILE OBJECT HANDLE IS NOT ASSOCIATED')
1602 IF (.NOT.
ASSOCIATED(ncf%FTIME)) ncf%FTIME=>new_ftime()
1605 if (out_interval < zerotime)
Call fatal_error &
1606 & (
"The output interval must be greater than or equal to zero",&
1607 &
"Check the run file INTERVAL")
1613 ftm%MAX_STKCNT = stack_max
1616 ftm%INTERVAL = out_interval
1619 ftm%NEXT_IO = next_time
1622 ftm%NEXT_STKCNT = next_stk
1625 ftm%PREV_IO = prev_time
1628 ftm%PREV_STKCNT = prev_stk
1631 IF(dbg_set(dbg_io))
THEN 1632 WRITE(ipt,*)
"! === DUMPING OUTPUT FILE TIMING INFO: ===" 1633 CALL print_ftime(ftm)
1634 WRITE(ipt,*)
"! ========================================" 1636 ELSE IF (dbg_set(dbg_log))
THEN 1638 IF (use_real_world_time)
then 1639 CALL print_real_time(next_time,ipt,
'First Output Time')
1641 CALL print_time(next_time,ipt,
'First Output Time')
1644 CALL print_time(out_interval,ipt,
"Output Interval")
1650 IF(dbg_set(dbg_sbr))
WRITE(ipt,*)
"SET_OUTPUT_FILE_TIME: END"
character(len=80) date_format
subroutine get_output_file_interval(STRING, INTERVAL)
character(len=80) startup_type
subroutine check_startup_file_dimensions
subroutine set_startup_file_stack_by_cycle(step, ATIME)
character(len=80) date_reference
subroutine set_last_file_time(NCF, STIME, STEP)
type(time) function read_datetime(timestr, frmt, TZONE, status)
character(len=80) timezone
type(time) runfile_starttime
logical use_real_world_time
character(len=80) end_date
subroutine set_model_timestep
subroutine get_first_output_time(STRING, FIRST_TIME)
subroutine ideal_time_string2time(string, flag, ntime, tstep)
integer(itime) function calculate_number_of_timesteps(STIME, ETIME)
character(len=80) start_date
subroutine set_output_file_time(NCF, OUT_INTERVAL, NEXT_TIME, NEXT_STK, PREV_TIME, PREV_STK, STKLEN, STACK_MAX)
subroutine report_time_setup
subroutine set_startup_file_stack_by_time(STIME, STEP)