G2_atom.m
- This function calculates the continuous G2 factor fromthe cos and sin
- terms and also saves a struct variable for G2_calc_func()
- You might want to edit the atomtype names below to fit your needs...
Contents
Version
2.11
Contact
Please report problems/bugs to michael.holmboe@umu.se
Examples
- [G2,G_cos,G_sin,Gtwotheta,structure] = G2_atom(atom,Box_dim)
- [G2,G_cos,G_sin,Gtwotheta,structure] = G2_atom(atom,Box_dim,filename)
function [G2,G_cos,G_sin,Gtwotheta,structure,old_structure] = G2_atom(atom,Box_dim,varargin) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% format compact; if nargin==2 filename='outfile'; elseif nargin>2 filename=varargin{1}; end Inorganic_atoms = {'Si','Al','Alt','Feo','Mgo','Ob','Op','O','Oh','Omg','Ohmg','Oalt','Odsub','H','Ow','Hw','OW','HW','HW1','HW2','Li','Na','K','Cs','Mg','Ca','Sr','Ba','Cl','Br','Cc','Hc','Oc','Nc'}; % Octahedral and tetrahedral substitusions Atoms_noWater = {'Si','Al','Alt','Feo','Mgo','Mg','Ob','Op','O','Oh','Omg','Ohmg','Oalt','Odsub','H','Na','Cc','Hc','Oc','Nc'};%,'Li','Na','K','Cs','Mg','Ca','Sr','Ba','Cl'}; Atoms_clay = {'Si','Al','Alt','Feo','Mgo','Mg','Ob','Op','O','Oh','Omg','Ohmg','Oalt','Odsub','H'};%,'Li','Na','K','Cs','Mg','Ca','Sr','Ba','Cl'}; System = {'all'};% atom=translate_atom(atom,-[atom.x atom.y atom.z]); atom=wrap_atom(atom,Box_dim); Elements(1,1:3:3*length([atom.x]))=[atom.x]; Elements(1,2:3:3*length([atom.x]))=[atom.y]; Elements(1,3:3:3*length([atom.x]))=[atom.z]; Elements(:,1:3:end)=Elements(:,1:3:end) - min(min(Elements(:,1:3:end))); Elements(:,2:3:end)=Elements(:,2:3:end) - min(min(Elements(:,2:3:end))); Elements(:,3:3:end)=Elements(:,3:3:end) - min(min(Elements(:,3:3:end))); % ind_Feo=find(ismember([atom.type],'Al')); % ind_Feo=ind_Feo(1:9:end); % [atom(ind_Feo).type]=deal({'Feo'}); for push=1:1
scale_water=1;
nUC=1;%6*4*3;
dim='z';
stride=1;
pushSOL=0;%(-5+push)/10; %Å
nLayers=1; %3;
lambda=1.54187;
step=0.01; % Do not change
twotheta=[2:step:60]';
Gtwotheta=[2:.05:60]; % To be used in the modelling
Linecolor = [0 0 1];% [1-MooreReynolds-CLAYFF 0 MooreReynolds];
Linewidth = 2;
Fontsize = 18;
Add_Atom1 = {'Feo'}; Replace_Atom1={'Al'}; Atom1_frac=0;% 11in percent, normally < 4 Al per UC
Add_Atom2 = {'Alt'}; Replace_Atom2={'Si'}; Atom2_frac=0;% 1in percent, normally < 8 Si per UC
centerAtomtype='Al';
center_ind=find(strcmp([atom.type],centerAtomtype))';
% center_ind=center_ind(length(center_ind)/nLayers+1:2*length(center_ind)/nLayers);% center_ind=center_ind(1:length(center_ind)/nLayers);
scattering_factors='default';%'WaasmaierKirfel';%'Wright'; % 'Wright' or 'CromerMann'
for i=1:size(atom,2)
temp_label=[atom(i).type];
if size(temp_label{1},2)
temp_label{1}(2:end)=lower(temp_label{1}(2:end));
[atom(i).type]=temp_label;
end
end
inorganic_ind=find(ismember([atom.type],Inorganic_atoms));
Cc_ind=find(strncmpi([atom.type],'C',1));
Cc_ind=setdiff(Cc_ind,inorganic_ind);
[atom(Cc_ind).type]=deal({'Cc'})
Hc_ind=find(strncmpi([atom.type],'H',1));
Hc_ind=setdiff(Hc_ind,inorganic_ind);
[atom(Hc_ind).type]=deal({'Hc'})
Oc_ind=find(strncmpi([atom.type],'O',1));
Oc_ind=setdiff(Oc_ind,inorganic_ind);
[atom(Oc_ind).type]=deal({'Oc'})
Nc_ind=find(strncmpi([atom.type],'N',1));
Nc_ind=setdiff(Nc_ind,inorganic_ind);
[atom(Nc_ind).type]=deal({'Nc'})
if strcmpi(System,{'all'})
Atom_label = unique([atom.type]);
else
Atom_label = System(ismember(System,unique([atom.type])))
end
Ow_ind=find(strncmpi([atom.type],'Ow',2));[atom(Ow_ind).type]=deal('Ow');
Hw_ind=find(strncmpi([atom.type],'Hw',2));[atom(Hw_ind).type]=deal('Hw');
Atom_label(find(strncmpi(Atom_label,{'MW'},2)))=[];
Atom_label(find(strncmpi(Atom_label,{'HW2'},3)))=[];
Atom_label(find(strncmpi(Atom_label,{'Ow'},2)))={'Ow'};
Atom_label(find(strncmpi(Atom_label,{'Hw'},2)))={'Hw'};
if strcmp(dim,'x')
dim_column=2;
L = Box_dim(1);
d001=L/nLayers;
Distance=0:step:L;
elseif strcmp(dim,'y')
dim_column=1;
L = Box_dim(2);
d001=L/nLayers;
Distance=0:step:L;
else%if strcmp(dim,'z');
dim_column=0;
L = Box_dim(3);
d001=L/nLayers;
Distance=0:step:L;
end
ind_center_atom=3*center_ind-dim_column;
center_atom=reshape(Elements(:,ind_center_atom),[],1);
center_atom_hist=hist(center_atom,Distance)';
[Max_center,Max_row]=max(center_atom_hist);
shift=Max_row*step;
Distance_symm=Distance-d001/2+3/2*step;
Total_density=zeros(ceil(d001/step),1);
Total_density_disc=zeros(ceil(d001/step),1);
G_cos=zeros(size(twotheta,1),1);
G_sin=zeros(size(twotheta,1),1);
%hold on;
% for h=1:length(Atom_label)
% ind_atom=3*find(strcmp([atom.type],Atom_label(h)))'-dim_column;
% Element = reshape(Elements(:,ind_atom),[],1);
% Element = Element - shift + d001/2;
% Element = Wrap_Coord_func(Element, L);
% Element_density = histcounts(Element,Distance)';
% Element_density=(Element_density+flipud(Element_density))/2;
% Element_density=Element_density(1:ceil(d001/step),1);
% Total_density=Total_density+Element_density;
% end
SUMNDISCRETE=0;
norm=size(Elements,1)*nUC;
Total_density(:)=0;Total_Electron_density=0;
Element_count=0;
for h=1:length(Atom_label)
Element_ave_sum=0;
Element_count=Element_count+1;
ind_atom=3*find(strcmpi([atom.type],Atom_label(h)))'-dim_column;
disp('Atom_label')
Atom_label(h)
size(ind_atom)
disp('-----------')
Element = reshape(Elements(:,ind_atom),[],1);
Element = Element - shift + d001/2;
Element = Wrap_Coord_func(Element, L);
Element_density = histcounts(Element,Distance)'/norm;
Element_density = Element_density-floor(Element_density./d001)*d001;
Element_density = Element_density(1:ceil(d001/step),1);
Element_density = smooth((Element_density+flipud(Element_density))/2,11);
DW=0;
Set the Debye-Waller factor
if ismember(Atom_label(h),{'Si','Al','Alt','Mgo','Mg','H','Hc','Fe','Feo'}) DW=1.5 elseif ismember(Atom_label(h),{'Li','Na','K','Cs','Mg','Ca','Sr','Ba'}) DW=2 elseif ismember(Atom_label(h),{'Op','Ob','O','Oh','Oapical','Obasal','Omg','Ohmg','Oalt','Odsub','Br','Cl'}) DW=2 elseif ismember(Atom_label(h),{'Ow','Hw'}) disp('atomtype --> water') DW=2 else disp('Do not recognise the atomtype!!!') DW=2 end if ismember(Atom_label(h),{'Ow','Hw','OW','HW','HW1','HW2'}) Element_density=Element_density*scale_water; if pushSOL>0 extendedElement_density=[Element_density(1:length(Element_density)/2);zeros(1,floor(2*pushSOL/step))';Element_density(length(Element_density)/2+1:end)]; Element_density=interp1(1:length(extendedElement_density),extendedElement_density,1:length(Element_density))'; Element_density(1:length(Element_density)/2)=0; Element_density = sum(extendedElement_density)/sum(Element_density)*(Element_density+flipud(Element_density))/2; elseif pushSOL<0 truncatedElement_density=Element_density(1:length(Element_density)/2-floor(-pushSOL/step)); truncatedElement_density=[truncatedElement_density;flipud(truncatedElement_density)]; Element_density=interp1(1:length(truncatedElement_density),truncatedElement_density,1:length(Element_density))'; Element_density(isnan(Element_density))=truncatedElement_density(end); Element_density(1:length(Element_density)/2)=0; Element_density = sum(truncatedElement_density)/sum(Element_density)*(Element_density+flipud(Element_density))/2; if ismember(Atom_label(h),{'Ow' 'OW'}) disp('water content') sum(Element_density) end end end Element_f = atomic_scattering_factors(Atom_label(h),lambda,twotheta,DW); Atomtype Element_Electron_density = Element_density*nElectrons; Element_cos=zeros(size(twotheta,1),1); Element_sin=zeros(size(twotheta,1),1); for i=1:size(twotheta,1) PhaseAngle=2*pi()*Distance_symm(1:length(Element_density)).*(2*sin(twotheta(i)/2*pi()/180)/lambda); Element_cos(i,1) = Element_f(i)*Element_density.'*cos(PhaseAngle)'; Element_sin(i,1) = Element_f(i)*Element_density.'*sin(PhaseAngle)'; end % Element_cos=zeros(size(twotheta,1),1); Element_sin=zeros(size(twotheta,1),1); % for i=1:size(twotheta,1); % for j=1:ceil(d001/step); % cos_term(i,j) = Element_density(j) * Element_f(i) * cos(2*pi()*Distance(j)*(2*sin(twotheta(i)/2*pi()/180)/lambda)); % sin_term(i,j) = Element_density(j) * Element_f(i) * sin(2*pi()*Distance(j)*(2*sin(twotheta(i)/2*pi()/180)/lambda)); % end % Element_cos(i,1)=sum(cos_term(i,:),2); % Element_sin(i,1)=sum(sin_term(i,:),2); % end Element_G2 = Element_cos.^2+Element_sin.^2; Total_density=Total_density+Element_density; % Total_density_disc=Total_density_disc+Element_density_disc; Total_Electron_density = Total_Electron_density+Element_Electron_density; G_cos=G_cos+Element_cos; G_sin=G_sin+Element_sin; if sum(Element_density) > 0 SUMNDISCRETE=SUMNDISCRETE+Element_ave_sum; % assignin('base',strcat(char(Atom_label(h)),'_discr_sum'),Element_ave_sum); % new % assignin('base',strcat(char(Atom_label(h)),'_discr'),Element_ave); % new assignin('base',strcat(char(Atom_label(h)),'_cos'),Element_cos); % new assignin('base',strcat(char(Atom_label(h)),'_sin'),Element_sin); % new assignin('base',strcat(char(Atom_label(h)),'_G2'),Element_G2); assignin('base',strcat(char(Atom_label(h)),'_density'),Element_density); assignin('base',strcat(char(Atom_label(h)),'_electron_density'),Element_Electron_density); assignin('base',strcat(char(Atom_label(h)),'_f'),Element_f); %plot(twotheta,Element_f) end % hold on; % plot([UC(Element_count).Zdist],[UC(Element_count).Pdist]) % findpeaks([UC(Element_count).Pdist],[UC(Element_count).Zdist]','MinPeakDistance',0.1,'MinPeakProminence',.0005) % plot(Distance_symm(1:length(Total_density)),circshift(Element_density,[0 0])) % stem(Distance(1:length(Element_density)),circshift(Element_density,[0 0]),'Marker','none') % plot(Distance(1:length(Element_density)),circshift(Element_density,[ceil(d001/2/step) 0])) % stem(Distance(1:length(Element_density_disc)),circshift(Element_density_disc,[ceil(d001/2/step) 0]),'Marker','none')
Collect the structural data
structure(h).type=Atom_label(h);
structure(h).d001=d001;
structure(h).P=single(Element_density)';%UC(h).P;;%single(UC(h).P);
structure(h).e=nElectrons;
structure(h).Z=Distance_symm(1:length(Element_density));%(find(Element_density));;%Distance_symm(find(Element_density));
structure(h).B=DW;
end
Clear up structure
k=1;i=1;
newstructure=structure;
while i < size(structure,2)+1
for j=1:numel([structure(i).P])
if numel([structure(i).P]) > 1
newstructure(k)=structure(i);
newstructure(k).Z=structure(i).Z(j);
newstructure(k).P=structure(i).P(j);%/numel([structure(i).Z]);
newstructure(k).e=[structure(i).P(j)]*[structure(i).e];%/numel([structure(i).Z]);
end
k=k+1;
end
i=i+1;
end
ind_zero=find([newstructure.P]==0);
newstructure(ind_zero)=[];
old_structure=structure;
structure=newstructure;
G_cos=interp1(twotheta,G_cos,Gtwotheta);
G_sin=interp1(twotheta,G_sin,Gtwotheta);
G2=G_cos.^2+G_sin.^2;
save(strcat('G2md_',filename,'.mat'),'G2','G_cos','G_sin','G2','Gtwotheta','structure');
figure
hold on
plot(Gtwotheta,G2,'-','color',Linecolor,'LineWidth',Linewidth);set(gca,'PlotBoxAspectRatio',[1 1 1],'FontSize',Fontsize)
plot(Gtwotheta,G_cos,'-','color',Linecolor,'LineWidth',Linewidth);set(gca,'PlotBoxAspectRatio',[1 1 1],'FontSize',Fontsize)
plot(Gtwotheta,G_sin,'-','color',Linecolor,'LineWidth',Linewidth);set(gca,'PlotBoxAspectRatio',[1 1 1],'FontSize',Fontsize)
figure
hold on
plot(Distance(1:length(Total_density)),circshift(Total_density,[0 0]))
% plot(Distance_symm(1:length(Total_density)),circshift(Total_Electron_density,[0 0]))
% xlabel('2Theta','FontSize',Fontsize); ylabel('a.u.','FontSize',Fontsize);
end