| 1 | dimitri | 1.1 | % function  create_tide_bc_second(nx, ny, cbdry_used,tide_num, time_nodal) ; | 
| 2 |  |  | % | 
| 3 |  |  | % Input:  nx, the size of first dimension of MITgcm domain | 
| 4 |  |  | %         ny, the size of second dimension of MITgcm domain | 
| 5 |  |  | %     cbdry_used, cell array specify which boundary to add tidal boundary condition, | 
| 6 |  |  | %                 {'s', 'n', 'w', 'e'}, South, North, West, and East | 
| 7 |  |  | %             If there is no ocean points on one boundary, donot specify it. | 
| 8 |  |  | %             Otherwise it will generate an error in interpolation. | 
| 9 |  |  | %             For this case, use tide_bc_empty to generate a zero amplitude tide BC. | 
| 10 |  |  | %     tide_num: tidal components to be included in tidal BC file | 
| 11 |  |  | %     time_nodal: time for nodal correction | 
| 12 |  |  | % | 
| 13 |  |  | % Output: Tidal boundary condition files will be generated with names like | 
| 14 |  |  | %          OB[N,S,E,W][am,ph].seaice_obcs | 
| 15 |  |  | % | 
| 16 |  |  | % | 
| 17 |  |  | % Note: | 
| 18 |  |  | % | 
| 19 |  |  | % 1) The script will read boundary grid file bdry_grid_[swne].mat generated by create_bc_grid.m | 
| 20 |  |  | % 2) The script will use  CAT2008b to generate tidal bc files  with names like | 
| 21 |  |  | %              OB[NSWE]am.seaice_obcs, for tidal current amplitude   (m/s) | 
| 22 |  |  | %              OB[NSWE]ph.seaice_obcs, phase in seconds  (s) | 
| 23 |  |  | % | 
| 24 |  |  | % 3) The following ten  tidal constituents can be included | 
| 25 |  |  | %              m2  s2  n2  k2  k1  o1  p1  q1 mf mm | 
| 26 |  |  | %              1   2   3   4   5   6   7   8  9  10 | 
| 27 |  |  | % | 
| 28 |  |  | % 4) The phase generated here inludes the Greenwich Phase of tidal constituent, | 
| 29 |  |  | %     nodal correction term, and a time constant in order to use nodal correction formula of CAT2008b | 
| 30 |  |  | % | 
| 31 |  |  | %          phase_in_second = ( tidal_period*phase_in_radian/2*pi - mitgcm_timec) | 
| 32 |  |  | % | 
| 33 | dimitri | 1.2 | % 5) CAT2008 directory needs to be specified in test_tide_bc.m | 
| 34 | dimitri | 1.1 | % as following,  addpath /data17/home/xiao/CAT/Tool/TMD2.03 | 
| 35 |  |  | % | 
| 36 |  |  | % XC WANG 25mar2013 | 
| 37 |  |  | %         17dec2012 | 
| 38 |  |  | % | 
| 39 |  |  |  | 
| 40 |  |  | function  create_tide_bc_second(nx, ny, cbdry_used,tide_num, time_nodal) ; | 
| 41 |  |  |  | 
| 42 |  |  | %The path of CATS2008b needed to be specified either here or in test_tide_bc.m | 
| 43 |  |  | %addpath /data17/home/xiao/CAT/Tool/TMD2.03 | 
| 44 |  |  |  | 
| 45 |  |  | sec_in_day = 86400 ; | 
| 46 |  |  | c8 = 8;  c4 =4 ; | 
| 47 |  |  |  | 
| 48 |  |  | %name of tide file of CATS2008b | 
| 49 |  |  | model_file =['Model_CATS2008b_km']; | 
| 50 |  |  |  | 
| 51 |  |  | % Dimension of Boundary files | 
| 52 |  |  | % NX, grid points in first  dimension of MITgcm | 
| 53 |  |  | % NY, grid points in second dimension of MITgcm | 
| 54 |  |  | % NH, grid points in vertical direction | 
| 55 |  |  | NX =nx; NY =ny; | 
| 56 |  |  |  | 
| 57 |  |  | % | 
| 58 |  |  | rad2deg = 180/pi ; | 
| 59 |  |  | deg2rad = pi/180 ; | 
| 60 |  |  |  | 
| 61 |  |  | % Set the Boundary to add tides | 
| 62 |  |  | % AngleCS_bc, AngleSN_bc are the Cos and Sin and angle of U axis of MITgcm | 
| 63 |  |  | % from due east | 
| 64 |  |  | %c_bdry3 = {'s', 'n', 'w', 'e'} ; | 
| 65 |  |  | c_bdry3 = cbdry_used ; | 
| 66 |  |  |  | 
| 67 |  |  | for ibc = 1:length(c_bdry3) | 
| 68 |  |  |  | 
| 69 |  |  | c_bdry=c_bdry3{ibc} ; | 
| 70 |  |  | bdry_file=['bdry_grid_',c_bdry, '.mat']; | 
| 71 |  |  | load(bdry_file, 'lat_bc', 'lon_bc', 'depth_bc', 'AngleCS_bc', 'AngleSN_bc') ; | 
| 72 |  |  |  | 
| 73 |  |  |  | 
| 74 |  |  | % Make sure it is column vector | 
| 75 |  |  | [nx_t1 ny_t1]  = size(lat_bc) ; | 
| 76 |  |  | if(nx_t1 ~= 1) | 
| 77 |  |  | lat_bc = lat_bc'; | 
| 78 |  |  | lon_bc = lon_bc'; | 
| 79 |  |  | depth_bc = depth_bc' ; | 
| 80 |  |  | AngleCS_bc = AngleCS_bc'  ; | 
| 81 |  |  | AngleSN_bc = AngleSN_bc'  ; | 
| 82 |  |  | end | 
| 83 |  |  |  | 
| 84 |  |  |  | 
| 85 |  |  | % Characters for Model Tidal BC file | 
| 86 |  |  | cob=upper(c_bdry) ; | 
| 87 |  |  | fld={'am','ph'}     ; | 
| 88 |  |  |  | 
| 89 |  |  |  | 
| 90 |  |  | if any(strcmp(cob, {'N','S'})) | 
| 91 |  |  | OBlength = NX ; | 
| 92 |  |  | else | 
| 93 |  |  | OBlength = NY ; | 
| 94 |  |  | end | 
| 95 |  |  |  | 
| 96 |  |  |  | 
| 97 |  |  | %  Use tide_num to specify what tidal components to include | 
| 98 |  |  | [uamp upha depth_tmd conlist0] = tmd_extract_HC(model_file, lat_bc, lon_bc, 'U',  tide_num); | 
| 99 |  |  | [vamp vpha depth_tmd conlist0] = tmd_extract_HC(model_file, lat_bc, lon_bc, 'V',  tide_num); | 
| 100 |  |  |  | 
| 101 |  |  | % Make sure  uamp etc are [length(tide_num), OBlength) ] | 
| 102 |  |  | % When length(tide_num) == 1, the amp is (OBlength, 1), not (1, OBlength) | 
| 103 |  |  | [nxsize nysize] = size(uamp); | 
| 104 |  |  | if( nxsize ~= length(tide_num) ) | 
| 105 |  |  | uamp= uamp' ; | 
| 106 |  |  | vamp= vamp' ; | 
| 107 |  |  | upha= upha' ; | 
| 108 |  |  | vpha= vpha' ; | 
| 109 |  |  | end | 
| 110 |  |  |  | 
| 111 |  |  | conlist = conlist0(tide_num, :); | 
| 112 |  |  |  | 
| 113 |  |  |  | 
| 114 |  |  | % Nodal Correction Using CAT2008b formula | 
| 115 |  |  | % time0 = datenum(1979, 1, 1); | 
| 116 |  |  | time0 = time_nodal  ; | 
| 117 |  |  | time1992 = datenum(1992, 1,1) ; | 
| 118 |  |  | [pu pf] = nodal(time0-time1992+48622, conlist); | 
| 119 |  |  | [pu pf] = nodal(time0-time1992+48622, conlist); | 
| 120 |  |  |  | 
| 121 |  |  | % Get Ph parameters | 
| 122 |  |  | for k=1:length(tide_num) | 
| 123 |  |  | [ispec(k), amp(k), ph(k), omega(k), alpha(k), cNum] = constit(conlist(k, :)); | 
| 124 |  |  | period(k) = 2*pi/omega(k) ; | 
| 125 |  |  | end | 
| 126 |  |  |  | 
| 127 |  |  | % Time constant for nodal correction | 
| 128 |  |  | mitgcm_timec = (time_nodal-time1992)*sec_in_day    ; | 
| 129 |  |  |  | 
| 130 |  |  | amp_all = zeros(OBlength, length(tide_num)) ; | 
| 131 |  |  | pha_all = zeros(OBlength, length(tide_num)) ; | 
| 132 |  |  |  | 
| 133 |  |  | uamp_all = zeros(OBlength, length(tide_num)) ; | 
| 134 |  |  | upha_all = zeros(OBlength, length(tide_num)) ; | 
| 135 |  |  | vamp_all = zeros(OBlength, length(tide_num)) ; | 
| 136 |  |  | vpha_all = zeros(OBlength, length(tide_num)) ; | 
| 137 |  |  |  | 
| 138 |  |  | for itide =1:length(tide_num) | 
| 139 |  |  | %for itide =1:1 | 
| 140 |  |  |  | 
| 141 |  |  | for itemp = 1:OBlength | 
| 142 |  |  | utide_am0(itemp)  = uamp(itide, itemp) ; | 
| 143 |  |  | utide_ph0(itemp)  = upha(itide, itemp) ; | 
| 144 |  |  |  | 
| 145 |  |  | vtide_am0(itemp)  = vamp(itide, itemp) ; | 
| 146 |  |  | vtide_ph0(itemp)  = vpha(itide, itemp) ; | 
| 147 |  |  | end | 
| 148 |  |  |  | 
| 149 |  |  | % Interpolate to all grid | 
| 150 |  |  | utide_am0 = intp_line_safe(utide_am0, lat_bc) ; | 
| 151 |  |  | utide_ph0 = intp_line_safe(utide_ph0, lat_bc)  ; | 
| 152 |  |  | vtide_am0 = intp_line_safe(vtide_am0, lat_bc) ; | 
| 153 |  |  | vtide_ph0 = intp_line_safe(vtide_ph0, lat_bc) ; | 
| 154 |  |  |  | 
| 155 |  |  | % Conduct nodal correction based  CMT2008b formulae and scripts | 
| 156 |  |  | % | 
| 157 |  |  | % Tidal prediction is | 
| 158 |  |  | % pf*amp*cos[omega(t-time0+time0-time1992) -(pha - ph - pu)] | 
| 159 |  |  | utide_ph0 = utide_ph0*deg2rad-ph(itide)-pu(itide) ; | 
| 160 |  |  | vtide_ph0 = vtide_ph0*deg2rad-ph(itide)-pu(itide) ; | 
| 161 |  |  | utide_am0 = utide_am0*pf(itide) ; | 
| 162 |  |  | vtide_am0 = vtide_am0*pf(itide) ; | 
| 163 |  |  |  | 
| 164 |  |  | % Convert to current based on Depth from GCM | 
| 165 |  |  | utide_ph0 = utide_ph0*rad2deg ; | 
| 166 |  |  | vtide_ph0 = vtide_ph0*rad2deg ; | 
| 167 |  |  |  | 
| 168 |  |  |  | 
| 169 |  |  | % Depth can have zeros | 
| 170 |  |  | utide_am0 = utide_am0 ./ depth_bc ; | 
| 171 |  |  | vtide_am0 = vtide_am0 ./ depth_bc ; | 
| 172 |  |  | %utide_am0(:) = utide_am0(:) ./ depth_bc(:) ; | 
| 173 |  |  | %vtide_am0(:) = vtide_am0(:) ./ depth_bc(:) ; | 
| 174 |  |  |  | 
| 175 |  |  |  | 
| 176 |  |  | % rotate to a MITgcm  coordinate | 
| 177 |  |  | [utide_am1 utide_ph1 vtide_am1 vtide_ph1] = tide_rot(utide_am0,utide_ph0,vtide_am0,vtide_ph0,AngleCS_bc, AngleSN_bc)  ; | 
| 178 |  |  |  | 
| 179 |  |  | uamp_all(:, itide) = utide_am1(:) ; | 
| 180 |  |  | upha_all(:, itide) = utide_ph1(:) ; | 
| 181 |  |  | vamp_all(:, itide) = vtide_am1(:) ; | 
| 182 |  |  | vpha_all(:, itide) = vtide_ph1(:) ; | 
| 183 |  |  |  | 
| 184 |  |  | if any(strcmp(cob, {'N', 'S'})) | 
| 185 |  |  | amp_all(:, itide) = vtide_am1(:) ; | 
| 186 |  |  | pha_all_rad(:, itide) = vtide_ph1(:)*deg2rad ; | 
| 187 |  |  | % pha_all(:, itide) = vtide_ph1(:) ; | 
| 188 |  |  | else | 
| 189 |  |  | amp_all(:, itide) = utide_am1(:) ; | 
| 190 |  |  | pha_all_rad(:, itide) = utide_ph1(:)*deg2rad ; | 
| 191 |  |  | % pha_all(:, itide) = utide_ph1(:) ; | 
| 192 |  |  | end | 
| 193 |  |  |  | 
| 194 |  |  | pha_all_sec(:, itide) = period(itide) .* pha_all_rad(:, itide)/(2*pi) - mitgcm_timec ; | 
| 195 |  |  |  | 
| 196 |  |  | end     % end of itide | 
| 197 |  |  |  | 
| 198 |  |  | % Conver Nan to Zero | 
| 199 |  |  | badp  = ~isfinite(amp_all) ; | 
| 200 |  |  | amp_all(badp) = 0 ; | 
| 201 |  |  | badp  = ~isfinite(pha_all_sec) ; | 
| 202 |  |  | pha_all_sec(badp) = 0 ; | 
| 203 |  |  |  | 
| 204 |  |  |  | 
| 205 |  |  | %if(1==0) | 
| 206 |  |  | % Write to file | 
| 207 |  |  | cfld = fld{1} ; | 
| 208 |  |  | %fnm=['OB' cob cfld '.seaice_obcs.k1']; | 
| 209 |  |  | fnm=['OB' cob cfld '.seaice_obcs']; | 
| 210 |  |  | writebin(fnm, amp_all) ; | 
| 211 |  |  |  | 
| 212 |  |  |  | 
| 213 |  |  | cfld = fld{2} ; | 
| 214 |  |  | %fnm=['OB' cob cfld '.seaice_obcs.k1']; | 
| 215 |  |  | fnm=['OB' cob cfld '.seaice_obcs']; | 
| 216 |  |  | writebin(fnm, pha_all_sec) ; | 
| 217 |  |  | %end | 
| 218 |  |  |  | 
| 219 |  |  | end | 
| 220 |  |  |  | 
| 221 |  |  |  | 
| 222 |  |  | % mitgcm_timec = (time_nodal-time1992)*sec_in_day ; | 
| 223 |  |  |  | 
| 224 |  |  | return |