subroutine file_names !======================================================================= ! edit this routine to change file names or add directories to file ! names. names may also be modified by editing a filenames file. ! the filenames file will only be written to, if it already exists. ! if you want an example of the format required, touch the file and ! change one file below (with put names) to write the change. ! changes from file filenames take precedence over changes below. ! an old file name (first argument to put_names) will be replaced by ! a new file name (second argument to put_names) when the iomngr or ! mpp_io routines try to open a file which starts with the old file ! name. if the start of the file matches more than one old name, the ! first match (in the order of calls to put_names) will be used. if ! the file name is longer than the old file name (but matches at the ! beginning), only the matched section is replaced by the new file ! name. if the new or old name is blank, the change is ignored. ! caution: if an old file name is found at the start of more than ! one file name, more than the intended file name may be changed. ! for example the single call to put_names: ! call put_names ('particles', 'x') ! would change all files starting with "particles..." to "x..." ! including changing "particles_initial..." to "x_initial..." ! if you do not want to change "particles_initial...", you can do ! the following (the order is important): ! call put_names ('particles_initial', 'particles_initial') ! call put_names ('particles', 'x') ! you may want to use this feature to redirect many files at once. ! for example: ! call put_names ('t', 't_files/t') ! would cause all files beginning with t to be read or written from ! the directory t_files (unless a particular 't...' file was ! renamed with put_names before this call). !======================================================================= implicit none integer max_num_files parameter (max_num_files=200) character(120) :: old_file_names, new_file_names common /files_c/ old_file_names(max_num_files) common /files_c/ new_file_names(max_num_files) integer num_files common /files_i/ num_files integer iou, ios, n character(len=120) old_file_name, new_file_name, text logical exists num_files = 0 text = 'old file name followed by new (see file_names.F)' inquire (file='filenames', exist=exists) if (exists) then ! read file name changes from filenames call getunit (iou, 'filenames','formatted sequential rewind') do n=1,max_num_files read (iou, '(a)', IOSTAT=ios) old_file_name if (old_file_name /= text .and. ios == 0) then write(*,'(a)') '==> Warning: error reading file names' exit endif read (iou, '(a/a)', IOSTAT=ios) old_file_name, new_file_name if (ios > 0) exit call put_names (old_file_name, new_file_name) enddo call relunit (iou) endif print*, 'The following files will be renamed:' call put_names ('A_agg', 'data/A_agg') call put_names ('A_calb', 'data/A_calb') call put_names ('A_cfc', 'data/A_cfc') call put_names ('A_co2', 'data/A_co2') call put_names ('A_dc14', 'data/A_dc14') call put_names ('A_diff', 'data/A_diff') call put_names ('A_sat', 'data/A_sat') call put_names ('A_slat', 'data/A_slat') call put_names ('A_wind', 'data/A_wind') call put_names ('A_solar', 'data/A_solar') call put_names ('A_sulph', 'data/A_sulph') call put_names ('A_volc', 'data/A_volc') call put_names ('F_co2', 'data/F_co2') call put_names ('F_heat', 'data/F_heat') call put_names ('F_salt', 'data/F_salt') call put_names ('G_grid', 'data/G_grid') call put_names ('G_kmt', 'data/G_kmt') call put_names ('G_mskt', 'data/G_mskt') call put_names ('G_mskhreg', 'data/G_mskhreg') call put_names ('L_cropfra', 'data/L_cropfra') call put_names ('L_diurtemp', 'data/L_diurtemp') call put_names ('L_elev', 'data/L_elev') call put_names ('L_ice', 'data/L_ice') call put_names ('L_potveg', 'data/L_potveg') call put_names ('L_rivers', 'data/L_rivers') call put_names ('O_alk', 'data/O_alk') call put_names ('O_dc14', 'data/O_dc14') call put_names ('O_diffac', 'data/O_diffac') call put_names ('O_no3', 'data/O_no3') call put_names ('O_o2', 'data/O_o2') call put_names ('O_po4', 'data/O_po4') call put_names ('O_sal', 'data/O_sal') call put_names ('O_sealev', 'data/O_sealev') call put_names ('O_slhref', 'data/O_slhref') call put_names ('O_tau', 'data/O_tau') call put_names ('O_temp', 'data/O_temp') call put_names ('O_tidenrg', 'data/O_tidener') call put_names ('O_totcarb', 'data/O_totcarb') call put_names ('rest_embm', 'rest') call put_names ('restart_embm', 'data/restart') call put_names ('restart_2_embm', 'restart_2') call put_names ('tsi_embm', 'tsi') call put_names ('tavg_embm', 'tavg') call put_names ('rest_ism', 'rest') call put_names ('restart_ism', 'data/restart') call put_names ('restart_2_ism', 'restart_2') call put_names ('tsi_ism', 'tsi') call put_names ('tavg_ism', 'tavg') call put_names ('rest_mtlm', 'rest') call put_names ('restart_mtlm', 'data/restart') call put_names ('restart_2_mtlm', 'restart_2') call put_names ('tsi_mtlm', 'tsi') call put_names ('tavg_mtlm', 'tavg') call put_names ('rest_mom', 'rest') call put_names ('restart_mom', 'data/restart') call put_names ('restart_2_mom', 'restart_2') call put_names ('tsi_mom', 'tsi') call put_names ('tavg_mom', 'tavg') call put_names ('rest_sed', 'rest') call put_names ('restart_sed', 'data/restart') call put_names ('restart_2_sed', 'restart_2') call put_names ('tsi_sed', 'tsi') call put_names ('tavg_sed', 'tavg') ! write file name changes to filenames if (exists) then call getunit (iou, 'filenames','formatted sequential rewind') do n=1,num_files write (iou, '(a)') text write (iou, '(a/a)') old_file_names(n), new_file_names(n) enddo call relunit (iou) endif print*, ' ' end subroutine file_names subroutine put_names (old_file_name, new_file_name) !======================================================================= ! put file names in the appropriate array location ! input: ! old_file_name = old file name ! new_file_name = new file name ! output: ! old_file_names = updated array of old file names ! new_file_names = updated array of new file names ! num_files = number of renamed files !======================================================================= implicit none integer max_num_files parameter (max_num_files=200) character(120) :: old_file_names, new_file_names common /files_c/ old_file_names(max_num_files) common /files_c/ new_file_names(max_num_files) integer num_files common /files_i/ num_files integer n character (len=*) old_file_name, new_file_name do n=1,num_files if (trim(old_file_name) == trim(old_file_names(n))) then new_file_name = '' endif enddo if (trim(old_file_name) == '') new_file_name = '' if (new_file_name /= '') then num_files = num_files + 1 old_file_names(num_files) = trim(old_file_name) new_file_names(num_files) = trim(new_file_name) print*, ' ',trim(old_file_name),' renamed ',trim(new_file_name) endif end subroutine put_names function new_file_name (old_file_name) !======================================================================= ! provides a new file name if the beginning of the old file name is ! matched with a name from the old_file_names array. old and new ! file names are set in the set_file_names routine. if a match is ! not found, then the old file name is used. ! input: ! old_file_name = old file name ! output: ! new_file_name = new file name !======================================================================= implicit none integer max_num_files parameter (max_num_files=200) character(120) :: old_file_names, new_file_names, new_file_name common /files_c/ old_file_names(max_num_files) common /files_c/ new_file_names(max_num_files) integer num_files common /files_i/ num_files integer i, j, k, m, n character (len=*) old_file_name i = 0 new_file_name = trim(old_file_name) do n=1,num_files i = index(old_file_name, trim(old_file_names(n))) if (i == 1) then j = len_trim(old_file_name) k = len_trim(old_file_names(n)) m = len_trim(new_file_names(n)) new_file_name = trim(new_file_names(n)) if (j > k) new_file_name(m+1:m+1+j-k) = old_file_name(k+1:j) exit endif enddo end function new_file_name