function output=g2n(input_series, oldest14Cdate) % Use to update a GISP2 based chronology to NGRIP. % Input series: 2-column in k.y. BP (before 1950). % Max conversion age is 100.8 ka. Outside of this range, % Input series age converted to b2k (before 2000) by adding 50 years. % Oldest radiocarbon date is optional input. % Conversion begins from radiocarbon date if specified. % Output is 'GICC05modelext' (GICC05 with ss09sea) in ka b2k % USE WITH CAUTION ONLY ON RECORDS BASED ON GISP2 M/S94! % % Version 1.0; 2013-08-28 % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see if(nargin<1), error('No input series specified'); end % input series in kiloyears x=input_series(:,1); y=input_series(:,2); % test for input in kiloyears if(max(x)>10000) warning('Input series appears to be in years. Converting to kiloyears.'); x=x/1000; end % load depth ties, ngrip and gisp2 data fid=fopen('g2nties.txt'); c=textscan(fid,'%f %f %f %f %f %f %f %f %s %s','delimiter','\t','headerlines',1,'emptyvalue',-999); fclose(fid); [gisp2_old_depth,gisp2_old_age,gisp2_o18,ngrip_depth,ngrip_age,ngrip_o18,tie_gisp2_depth,tie_ngrip_depth,vers,ref]=deal(c{:}); clear ans fid c % find and remove -999 values mapped to empty cells gisp2_old_depth(find(gisp2_old_depth==-999))=[]; gisp2_old_age(find(gisp2_old_age==-999))=[]; gisp2_o18(find(gisp2_o18==-999))=[]; ngrip_depth(find(ngrip_depth==-999))=[]; ngrip_age(find(ngrip_age==-999))=[]; tie_gisp2_depth(find(tie_gisp2_depth==-999))=[]; tie_ngrip_depth(find(tie_ngrip_depth==-999))=[]; % find remove empty cells from cell arrays ref(cellfun('isempty',ref))=[]; vers(2:length(vers))=[]; vers=char(vers); % find and remove NaNs from GISP2 nanindex=[find(isnan(gisp2_o18))' find(isnan(gisp2_old_depth))' find(isnan(gisp2_old_age))']; gisp2_o18(nanindex)=[]; gisp2_old_age(nanindex)=[]; gisp2_old_depth(nanindex)=[]; % create depth lookup table and remove NaNs depth_pointers=horzcat(tie_gisp2_depth,tie_ngrip_depth); depth_pointers(find(isnan(depth_pointers(:,1))),:)=[]; depth_pointers(find(isnan(depth_pointers(:,2))),:)=[]; % create new GISP2 depth scale based on NGRIP gisp2_new_depth=interp1(depth_pointers(:,1),depth_pointers(:,2),gisp2_old_depth); %find indexes bounding update interval min_convert_index=find(gisp2_new_depth >= min(tie_ngrip_depth),1); max_convert_index=max(find(gisp2_new_depth <= max(tie_ngrip_depth))); % apply GICC05modelext chronology to new GISP2 depth scale if exist('gisp2_new_age')~=1 gisp2_new_age=interp1(ngrip_depth,ngrip_age,gisp2_new_depth); end % import ages younger than import interval and convert to b2k if min_convert_index > 1 gisp2_new_age(1:min_convert_index-1)=gisp2_old_age(1:min_convert_index-1)+.05; % Check for age reversal at concatenation point. Temporary issue with the 1.0 version data. if vers(1)=='1' & vers(3)=='0' if abs(gisp2_new_age(682)-8.2654)>0.0001 error('Age reversal pre-correction age value %f inconsistent. Aborting.', gisp2_new_age(682)); end gisp2_new_age(682) = 8.2497; %mean of indexes 683 and 681 in v 1.0 data end end % remove data older than update interval (these vectors become new lookup table) gisp2_new_age(max_convert_index+1:length(gisp2_new_age))=[]; gisp2_old_age(max_convert_index+1:length(gisp2_old_age))=[]; % create new age scale for selected interval, import out-of-range ages and convert to b2k x2=interp1(gisp2_old_age,gisp2_new_age,x); % package for output to user output=horzcat(x2,y); % determine updated range and account for radiocarbon date if min(x)>gisp2_old_age(min_convert_index) age_range(1)=min(x); else age_range(1)=x(find(x >= gisp2_old_age(min_convert_index),1)); end if exist('oldest14Cdate') if oldest14Cdate>gisp2_old_age(min_convert_index) start_index=find(x >= oldest14Cdate,1); output(1:start_index-1,1)=x(1:start_index-1)+.05; age_range(1)=x(find(x >= oldest14Cdate,1)); if min(diff(output(:,1)))<=0 warning(['Splicing original ages into GICC05 ages at ' num2str(oldest14Cdate) 'ka BP resulted in an age reversal. Please manually splice in younger ages']); output(1:start_index-1,1)=NaN; end end end if max(x)