diff --git a/@BearImp/BearImp.m b/@BearImp/BearImp.m index fb856d8ba9b122bda08414c8ee67335e4fe5b2df..7fdfc4a8a6f33cf59a0f614a9048664912246382 100644 --- a/@BearImp/BearImp.m +++ b/@BearImp/BearImp.m @@ -69,13 +69,13 @@ classdef BearImp < handle & matlab.mixin.Copyable if nargin > 0 switch setup case 'default' - obj.setBearing('6205-C3'); - obj.setLube('FVA Referenz-Öl III'); + obj.setBearing('DGBB_6205_C3'); + obj.setLube('FVA Referenz-Öl III barus'); obj.F_r = 1000; obj.F_a = 0; obj.omega = 3000/60*2*pi; - obj.T_Oil = 50; - obj.resolutionPerRotation = 360; + obj.T_Oil = 60; + obj.resolutionPerRotation = 90; end end obj.method = BearImpOptions; @@ -103,7 +103,8 @@ classdef BearImp < handle & matlab.mixin.Copyable end methods (Access = public, Static) - C_out = calcCap_puchtler2025(s,R_WK,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha,a,b) + C_out = calcCap_puchtler2025 (s,R_WK,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha,h_0,a,b ,options) + C_out = calcCap_semianalytisch3D(s,R_WK,R_R, B_R ,B,R_L,epsilon_r, h_0,a,b,nt,np,options) end methods diff --git a/@BearImp/calcCap.m b/@BearImp/calcCap.m index e97b9089c0279b57f6f137e2fce3b4f1de6834c7..f89d241e336e0c57ab865ca8a7511e077a15c13a 100644 --- a/@BearImp/calcCap.m +++ b/@BearImp/calcCap.m @@ -297,9 +297,9 @@ function runPuchtler2025(indices) C_semi_o = nan( numel(temp_s)/2, 1); end temp_alpha = B.alpha(:,:,posBall_conductive); - % calcCap_puchtler2025( s , R_RE, R_R , R_ZL , R_ZR , B, R_L , epsilon_r , alpha , h_0 , a , b ) - tmp_puchtler_i = @(runSemi) BearImp.calcCap_puchtler2025(temp_s(1,runSemi), tempR_RE, tempR_li,-G.d_bLi/2,-G.d_bRi/2, L.B, -G.R_bi, S.epsilon_Oel,temp_alpha(runSemi),temp_h_0(1,runSemi),temp_a(1,runSemi),temp_b(1,runSemi)); - tmp_puchtler_o = @(runSemi) BearImp.calcCap_puchtler2025(temp_s(2,runSemi), tempR_RE, tempR_la, G.D_bLa/2, G.D_bRa/2, L.B, G.R_ba, S.epsilon_Oel,temp_alpha(runSemi),temp_h_0(2,runSemi),temp_a(2,runSemi),temp_b(2,runSemi)); + % calcCap_puchtler2025( s , R_RE, R_R , R_ZL , R_ZR , B, R_L , epsilon_r , alpha , h_0 , a , b ) + tmp_puchtler_i = @(runSemi) BearImp.calcCap_puchtler2025(temp_s(1,runSemi), tempR_RE, tempR_li,-G.d_bLi/2,-G.d_bRi/2, L.B, -G.R_bi, S.epsilon_Oel,temp_alpha(runSemi),temp_h_0(1,runSemi),temp_a(1,runSemi),temp_b(1,runSemi),'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); + tmp_puchtler_o = @(runSemi) BearImp.calcCap_puchtler2025(temp_s(2,runSemi), tempR_RE, tempR_la, G.D_bLa/2, G.D_bRa/2, L.B, G.R_ba, S.epsilon_Oel,temp_alpha(runSemi),temp_h_0(2,runSemi),temp_a(2,runSemi),temp_b(2,runSemi),'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); if AddOn.Parallel_Computing_Toolbox && (numel(indices) > 20 || ~isempty(gcp('nocreate'))) % Pool nur starten, wenn mehr als 20 Berechnungen nötig tempC_i = nan(1,numel(indices)); @@ -333,8 +333,8 @@ function runSemianalytisch3D(indices) if AddOn.Parallel_Computing_Toolbox - tmp_semi_i = @(runSemi) semianalytisch3D(temp_s(1,runSemi), tempR_RE, tempR_li, G.B_i, L.B, -G.R_ri, S.epsilon_Oel,temp_a(1,runSemi),temp_b(1,runSemi),110,110); - tmp_semi_a = @(runSemi) semianalytisch3D(temp_s(2,runSemi), tempR_RE, tempR_la, G.B_a, L.B, G.R_ra, S.epsilon_Oel,temp_a(2,runSemi),temp_b(2,runSemi),110,110); + tmp_semi_i = @(runSemi) BearImp.calcCap_semianalytisch3D(temp_s(1,runSemi), tempR_RE, tempR_li, G.B_i, L.B, -G.R_ri, S.epsilon_Oel,temp_h_0(1,runSemi),temp_a(1,runSemi),temp_b(1,runSemi),110,110,'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); + tmp_semi_a = @(runSemi) BearImp.calcCap_semianalytisch3D(temp_s(2,runSemi), tempR_RE, tempR_la, G.B_a, L.B, G.R_ra, S.epsilon_Oel,temp_h_0(2,runSemi),temp_a(2,runSemi),temp_b(2,runSemi),110,110,'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); parfor runSemi = indices C_semi_i(runSemi) = feval(tmp_semi_i, runSemi); %da parfor loop nicht auf nested functions (semianalytisch3D) direkt zugreifen kann @@ -344,8 +344,9 @@ function runSemianalytisch3D(indices) else for runSemi = 1 : numel(temp_s)/2 - C_semi_i(runSemi) = semianalytisch3D(temp_s(1,runSemi), tempR_RE, tempR_li, G.B_i, L.B, -G.R_ri, S.epsilon_Oel,temp_a(1,runSemi),temp_b(1,runSemi),110,110); - C_semi_a(runSemi) = semianalytisch3D(temp_s(2,runSemi), tempR_RE, tempR_la, G.B_a, L.B, G.R_ra, S.epsilon_Oel,temp_a(2,runSemi),temp_b(2,runSemi),110,110); + % calcCap_semianalytisch3D( s , R_WK, R_R , B_R, B, R_L , epsilon_r , h_0 , a , b , nt, np) + C_semi_i(runSemi) = BearImp.calcCap_semianalytisch3D(temp_s(1,runSemi), tempR_RE, tempR_li, G.B_i, L.B, -G.R_ri, S.epsilon_Oel,temp_h_0(1,runSemi),temp_a(1,runSemi),temp_b(1,runSemi),110,110,'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); + C_semi_a(runSemi) = BearImp.calcCap_semianalytisch3D(temp_s(2,runSemi), tempR_RE, tempR_la, G.B_a, L.B, G.R_ra, S.epsilon_Oel,temp_h_0(2,runSemi),temp_a(2,runSemi),temp_b(2,runSemi),110,110,'CmethodDeformedArea',C.method.deformedArea,'r2smallCriterion',C.method.r2smallCriterion); end end @@ -353,129 +354,6 @@ function runSemianalytisch3D(indices) C.C_out(2,:,posBall_conductive)=C_semi_a; end -function C_Zusatz=semianalytisch3D(s,R_WK,R_R,B_R,B,R_L,epsilon_r,varargin) -% Semianalytische Berechnung der Kapazität von unbelasteten Wälzkörpern -% sowie Randbereichen belasteter WK am Innen und Außenring -% Autor: Steffen Puchtler -% Herleitung: Masterthesis "Optimierung des Berechnungsverfahrens für die -% elektrische Kapazität von EHD-Kontakten unter Berücksichtigung des realen -% elektrischen Feldes", S. 23-26 -% -% unbelastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r) -% belastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,a,b) - -% Diskretisierung nicht Default: -% unbelastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,0,0,nt,np) -% belastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,a,b,nt,np) - -% Inputparameter: -% S Minimaler Abstand zwischen Wälzkörper und Laufbahn m -% R_WK Wälzkörperradius m -% f Schmiegung (R_R / D_WK) - -% B_R Rillenbreite m -% B Breite des Lagers m -% R_L Radius der Laufbahn m !!! R_L < 0 am Innenring -% epsilon_r Relative Permittivität des Schmierstoffs - -% a,b Halbachsen der Hertzschen Flächen m -% nt,np Anzahl der Diskretisierngen in theta bzw. phi - - -% profile on - - switch nargin - case 7 - nt = 60; np = 60; - belastet = false; - case 9 - nt = 110; np = 110; - a = varargin{1}; - b = varargin{2}; - belastet = a~=0 && b~=0; - case 11 - a = varargin{1}; - b = varargin{2}; - nt = varargin{3}; - np = varargin{4}; - belastet = a~=0 && b~=0; - otherwise - warning('The number of input arguments is wrong! Please check the input of semianalytisch3D.') - end - - DeltaR = R_R-R_WK-s; - R_T = R_L - R_R; - Dz = R_R-sqrt(R_R^2-B_R^2/4); - r_yz = @(phi) (R_WK-R_L+s).*cos(phi) + sqrt((R_L-Dz).^2-(R_WK-R_L+s).^2.*sin(phi).^2)*sign(R_L); - if belastet - Theta_0 = @(phi) a*sqrt(max(1/R_WK^2-phi.^2/b^2,0)); - else - Theta_0 = @(~) 0; - end - Theta_1 = @(phi) atan(B_R/2./r_yz(phi)); - Theta_2 = @(phi) atan(B /2./r_yz(phi)); - if R_L > 0 - phi_1 = pi/2; - else - phi_1 = asin(R_L/(R_L-s-R_WK))*0.99; - end - p = linspace(0,phi_1,np); - P = repmat(p',1,nt); - T_t = zeros(size(P)); - for ii = 1:np - T_t(ii,:) = linspace(Theta_0(p(ii)),Theta_1(p(ii)),nt); - end - - r = zeros(size(T_t)); - for ii = 1:size(T_t,1) - for jj = 1:size(T_t,2) - theta = T_t(ii,jj); - phi = P(ii,jj); - fun = @(r) (R_T+R_R*sqrt(1-(r.*sin(theta)/R_R).^2)).^2 - (r.*sin(phi).*cos(theta)).^2 - (DeltaR+R_T+r.*cos(phi).*cos(theta)).^2; -% options=optimset('Display','off','FunValCheck','off','OutputFcn',[],'PlotFcns',[],'TolX',eps); - r(ii,jj) = fzero(fun,R_WK); - end - end - clear phi theta - invalid = r(:)>1; - r2small = r(:)/R_WK<1.00125; - if any(invalid) - warning('%i Entries of r have been removed',sum(invalid)) - C_Zusatz=nan; - return - elseif any(r2small) -% fprintf('%i Entries of r have been removed \n',sum(r2small)) - r(r2small)=inf; - end - - integrand_t = R_WK^2./(r-R_WK).*cos(T_t); - firstInteg = zeros(1,np); - for ii = 1:np - firstInteg(ii) = trapz(T_t(ii,:),integrand_t(ii,:)); - end - C_Rille = 4*epsilon_r * obj.epsilon_0 * trapz(P(:,1)',firstInteg); - - - T_k = zeros(size(P)); - for ii = 1:np - T_k(ii,:) = linspace(Theta_1(p(ii)),Theta_2(p(ii)),nt); - end - integrand_k = R_WK^2./((r_yz(P)-s)./cos(T_k)-R_WK).*cos(T_k); - firstInteg = zeros(1,np); - for ii = 1:np - firstInteg(ii) = trapz(T_k(ii,:),integrand_k(ii,:)); - end - C_Rand = 4*epsilon_r * obj.epsilon_0 * trapz(P(:,1)',firstInteg); - - C_Zusatz=C_Rille + C_Rand; -% if nargout == 1 -% varargout = {C_Rille + C_Rand}; -% elseif nargout == 2 -% varargout = {C_Rille,C_Rand}; -% end - -% profile off -% profile viewer - -end - function seperateVecs=splitVec(vec,status) %da die parfor-Schleife nur Vektoren bearbeiten kann, die in Ganzzahl %Schritten auf- oder absteigen, wird in dieser Funktion jeder Vektor in diff --git a/@BearImp/calcCap_puchtler2025.m b/@BearImp/calcCap_puchtler2025.m index 7df9cd22e588f1ae077083beaa89cdd2261d6752..0fea296884379c5d79ace6e41ce5ed07944fa938 100644 --- a/@BearImp/calcCap_puchtler2025.m +++ b/@BearImp/calcCap_puchtler2025.m @@ -1,4 +1,4 @@ -function C_out = calcCap_puchtler2025(s,R_RE,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha,h_0,a,b) +function C_out = calcCap_puchtler2025(s,R_RE,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha,h_0,a,b,options) arguments s @@ -13,6 +13,8 @@ function C_out = calcCap_puchtler2025(s,R_RE,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha h_0 a = 0 b = 0 + options.CmethodDeformedArea = 'neglect' + options.r2smallCriterion = 'r<1.00125*R_RE' end Delta_x = -(R_R - R_RE - s)*sin(alpha); @@ -20,7 +22,7 @@ function C_out = calcCap_puchtler2025(s,R_RE,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha B_RhR = sqrt(R_R^2 - (R_R - R_L + R_ZR)^2); B_RhL = sqrt(R_R^2 - (R_R - R_L + R_ZL)^2); - r_groove = @(phi,theta) r_easy(phi,theta,R_RE,R_R,R_L,Delta_x,Delta_z,h_0); + r_groove = @(phi,theta) r_easy(phi,theta,R_RE,R_R,R_L,Delta_x,Delta_z,h_0,options); r_rimL = @(phi,theta) (-Delta_z*cos(phi) + sign(R_L)*sqrt(R_ZL^2 - Delta_z^2*sin(phi).^2))./cos(theta); r_rimR = @(phi,theta) (-Delta_z*cos(phi) + sign(R_L)*sqrt(R_ZR^2 - Delta_z^2*sin(phi).^2))./cos(theta); @@ -49,7 +51,7 @@ function C_out = calcCap_puchtler2025(s,R_RE,R_R,R_ZL,R_ZR,B,R_L,epsilon_r,alpha C_out = C_grooveR + C_grooveL + C_rimR + C_rimL; end -function r = r_easy(phi,theta,R_RE,R_R,R_L,Delta_x,Delta_z,h_0) +function r = r_easy(phi,theta,R_RE,R_R,R_L,Delta_x,Delta_z,h_0,options) assert(all(size(phi)==size(theta))) r = nan(size(phi)); @@ -63,6 +65,16 @@ function r = r_easy(phi,theta,R_RE,R_R,R_L,Delta_x,Delta_z,h_0) fun = @(r) real((r*sin(thisPhi)*cos(thisTheta)./(R_L_R_R+R_R*sqrt(1-R_R_inv_sq*(r*sin(thisTheta)-Delta_x).^2))).^2 + ((r*cos(thisPhi)*cos(thisTheta)+Delta_z)./(R_L_R_R+R_R*sqrt(1-R_R_inv_sq*(r*sin(thisTheta)-Delta_x).^2))).^2 - 1); % real for fzero to not interrupt at imaginary values. Results are real anyway r(ii) = fzero(fun,1.2*R_RE); end - r(r<h_0+R_RE) = h_0+R_RE; %% TODO: oder = inf? %% - %r(r<R_RE*1.00125) = inf; + switch options.r2smallCriterion + case 'r<1.00125*R_RE' + r2small = r(:)/R_RE<1.00125; + case 'r<h_0+R_RE' + r2small = r(:)<h_0+R_RE; + end + switch options.CmethodDeformedArea + case 'neglect' + r(r2small) = inf; + case 'filmThickness' + r(r2small) = h_0+R_RE; + end end \ No newline at end of file diff --git a/@BearImp/calcCap_semianalytisch3D.m b/@BearImp/calcCap_semianalytisch3D.m new file mode 100644 index 0000000000000000000000000000000000000000..a4c73eda303d00ce2067e2b3a5d4c1445854f030 --- /dev/null +++ b/@BearImp/calcCap_semianalytisch3D.m @@ -0,0 +1,129 @@ +function C_out = calcCap_semianalytisch3D(s,R_WK,R_R,B_R,B,R_L,epsilon_r,h_0,a,b,nt,np,options) +% Semianalytische Berechnung der Kapazität von unbelasteten Wälzkörpern +% sowie Randbereichen belasteter WK am Innen und Außenring +% Autor: Steffen Puchtler +% Herleitung: Masterthesis "Optimierung des Berechnungsverfahrens für die +% elektrische Kapazität von EHD-Kontakten unter Berücksichtigung des realen +% elektrischen Feldes", S. 23-26 +% +% unbelastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r) +% belastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,a,b) + +% Diskretisierung nicht Default: +% unbelastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,0,0,nt,np) +% belastet: C_out = semianalytisch3D(S,R_WK,f,B_R,B,R_L,epsilon_r,a,b,nt,np) + +% Inputparameter: +% S Minimaler Abstand zwischen Wälzkörper und Laufbahn m +% R_WK Wälzkörperradius m +% f Schmiegung (R_R / D_WK) - +% B_R Rillenbreite m +% B Breite des Lagers m +% R_L Radius der Laufbahn m !!! R_L < 0 am Innenring +% epsilon_r Relative Permittivität des Schmierstoffs - +% a,b Halbachsen der Hertzschen Flächen m +% nt,np Anzahl der Diskretisierngen in theta bzw. phi - + +% profile on + + arguments + s + R_WK + R_R + B_R + B + R_L + epsilon_r + h_0 + a = 0 + b = 0 + nt = 110 + np = 110 + options.CmethodDeformedArea = 'neglect' + options.r2smallCriterion = 'r<1.00125*R_RE' + end + + belastet = a~=0 && b~=0; + + if ~belastet && nargin <= 9 + nt = 60; np = 60; + end + + DeltaR = R_R-R_WK-s; + R_T = R_L - R_R; + Dz = R_R-sqrt(R_R^2-B_R^2/4); + r_yz = @(phi) (R_WK-R_L+s).*cos(phi) + sqrt((R_L-Dz).^2-(R_WK-R_L+s).^2.*sin(phi).^2)*sign(R_L); + if belastet + Theta_0 = @(phi) a*sqrt(max(1/R_WK^2-phi.^2/b^2,0)); + else + Theta_0 = @(~) 0; + end + Theta_1 = @(phi) atan(B_R/2./r_yz(phi)); + Theta_2 = @(phi) atan(B /2./r_yz(phi)); + if R_L > 0 + phi_1 = pi/2; + else + phi_1 = asin(R_L/(R_L-s-R_WK))*0.99; + end + p = linspace(0,phi_1,np); + P = repmat(p',1,nt); + T_t = zeros(size(P)); + for ii = 1:np + T_t(ii,:) = linspace(Theta_0(p(ii)),Theta_1(p(ii)),nt); + end + + r = zeros(size(T_t)); + for ii = 1:size(T_t,1) + for jj = 1:size(T_t,2) + theta = T_t(ii,jj); + phi = P(ii,jj); + fun = @(r) (R_T+R_R*sqrt(1-(r.*sin(theta)/R_R).^2)).^2 - (r.*sin(phi).*cos(theta)).^2 - (DeltaR+R_T+r.*cos(phi).*cos(theta)).^2; +% options=optimset('Display','off','FunValCheck','off','OutputFcn',[],'PlotFcns',[],'TolX',eps); + r(ii,jj) = fzero(fun,R_WK); + end + end + clear phi theta + switch options.r2smallCriterion + case 'r<1.00125*R_RE' + r2small = r(:)/R_WK<1.00125; + case 'r<h_0+R_RE' + r2small = r(:)<h_0+R_WK; + end +% fprintf('%i Entries of r have been changed \n',sum(r2small)) + switch options.CmethodDeformedArea + case 'neglect' + r(r2small) = inf; + case 'filmThickness' + r(r2small) = h_0+R_RE; + end + + integrand_t = R_WK^2./(r-R_WK).*cos(T_t); + firstInteg = zeros(1,np); + for ii = 1:np + firstInteg(ii) = trapz(T_t(ii,:),integrand_t(ii,:)); + end + C_Rille = 4*epsilon_r * 8.854187817e-12 * trapz(P(:,1)',firstInteg); + + + T_k = zeros(size(P)); + for ii = 1:np + T_k(ii,:) = linspace(Theta_1(p(ii)),Theta_2(p(ii)),nt); + end + integrand_k = R_WK^2./((r_yz(P)-s)./cos(T_k)-R_WK).*cos(T_k); + firstInteg = zeros(1,np); + for ii = 1:np + firstInteg(ii) = trapz(T_k(ii,:),integrand_k(ii,:)); + end + C_Rand = 4*epsilon_r * 8.854187817e-12 * trapz(P(:,1)',firstInteg); + + C_out = C_Rille + C_Rand; +% if nargout == 1 +% varargout = {C_Rille + C_Rand}; +% elseif nargout == 2 +% varargout = {C_Rille,C_Rand}; +% end + +% profile off +% profile viewer + +end \ No newline at end of file diff --git a/BearImpOptions.m b/BearImpOptions.m index 50c75f738a07e40fa33a387edb03c94c36157527..2d0ef6130c2fd9495269b21a43487f05032f6b77 100644 --- a/BearImpOptions.m +++ b/BearImpOptions.m @@ -37,6 +37,8 @@ classdef BearImpOptions < handle & dynamicprops & matlab.mixin.CustomDisplay & m possibleOption.H.roughnessCorrection = {'on','off'}; possibleOption.C.unloadedRE = { 'neglect','stateOfTheArt', 'Leander_Parallel','Leander_Radial','LeanderSteffen','TobiasSteffen_Kugelfläche','TobiasSteffen_Laufbahnfläche','semianalytisch3D','Puchtler2025'}; possibleOption.C.outsideArea = {'k-factor','neglect','stateOfTheArt','Schneider_k_c','Leander_Parallel','Leander_Radial','LeanderSteffen','TobiasSteffen_Kugelfläche','TobiasSteffen_Laufbahnfläche','semianalytisch3D','Puchtler2025'}; + possibleOption.C.deformedArea= {'neglect','filmThickness'}; + possibleOption.C.r2smallCriterion = {'r<1.00125*R_RE','r<h_0+R_RE'}; possibleOption.C.k_vh_factor = {'on','off'}; possibleOption.C.pressureDistribution = {'on','off'}; possibleOption.C.roughnessCorrection = {'off','Napel'}; @@ -54,6 +56,8 @@ classdef BearImpOptions < handle & dynamicprops & matlab.mixin.CustomDisplay & m defaultOption.H.roughnessCorrection = 'off'; defaultOption.C.unloadedRE = 'semianalytisch3D'; defaultOption.C.outsideArea = 'semianalytisch3D'; + defaultOption.C.deformedArea= 'neglect'; + defaultOption.C.r2smallCriterion = 'r<1.00125*R_RE'; defaultOption.C.k_vh_factor = 'off'; defaultOption.C.pressureDistribution = 'on'; defaultOption.C.roughnessCorrection = 'off';