% Funzione che ricostrusice i segmenti di pertinenza e la profondità dello % spostamento relativo. % Aggiornato il 18 Marzo 2021 function [SpeTL,PsTL,SpeTLHR,PsTLHR,SpeTLH,PsTLH,SpeTLHRH,PsTLHRH,SpeIPL,PsIPL,Inverti,... SpeIPLHR,PsIPLHR,SpeHD,PsHD,SpeHDVR,PsHDVR] = schemaSP(yesTL,yesTLHR,yesTLH,yesTLHRH,yesTLHR3D,yesTLHR3DH,... yesIPL,yesIPLHR,yesIPLHR3D,yesHD,yesHDVR,NodoTiltLink,NodoTiltLinkHR,NodoTiltLinkHR3D,... NodoTiltLinkH,NodoTiltLinkHRH,NodoTiltLinkHR3DH,NodoInPlaceLink,NodoInPlaceLinkHR,... NodoInPlaceLinkHR3D,NodoTiltLinkHD,NodoTiltLinkHDVR,Anchor_real,... rTL,rTLH,rTLHR,rTLHRH,rIPL,rIPLHR,rHD,rHDVR,catena,IDcentralina,DTcatena,FileName) % Apro file di testo fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'schemaSP function started'; fprintf(fileID,fmt,text); Shift = Anchor_real; Nodi = [cell2mat(catena(:,3)) cell2mat(catena(:,2))+Shift cell2mat(catena(:,1))]; % if Anchor_real == 0 % Last_Node = 0; % else % [r,~] = size(Nodi); % % Cerco l'ancora % for i = 1:r % if Nodi(i,3) == 9 % break % end % end % Last_Node = Anchor_real - Nodi(i,2) + 0.5; % Nodi(:,2) = Nodi(:,2) + Last_Node; % end %% Tilt Link V if yesTL == 1 % Definizione dei segmenti di pertinenza dei singoli accelerometri % SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) % PsTL = Profondità dello spostamento NodiTL = -1*cell2mat(NodoTiltLink(:,2:3)); NodiTL(:,2) = NodiTL(:,2) + Shift; % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora if rTL > 1 spe1 = Nodi(1,2)-((NodiTL(1,2) + NodiTL(2,2))/2); % segmento di pertinenza del primo nodo else spe1 = 1; end if rTL>2 spe2 = zeros(rTL-2,1); for i = 2:(rTL-1) media1 = (abs(NodiTL(i,2)) + abs(NodiTL(i-1,2)))/2; media2 = (abs(NodiTL(i,2)) + abs(NodiTL(i+1,2)))/2; spe2(i-1,1) = media1 - media2; end else spe2 = []; end if rTL > 1 spelast = (NodiTL(rTL-1,2)+NodiTL(rTL,2))/2; % segmento di pertinenza del nodo superficiale SpeTL = [spe0; spe1; spe2; spelast]; else SpeTL = [spe0; spe1]; end % Calcolo la profondità dello spostamento relativo ps0 = (-1)*Nodi(1,2); % profondità dell'ancora ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da % ancora + segmento di pertinenza del primo nodo ps2 = zeros(rTL-1,1); for j = 2:rTL if j == 2 psj = ps1 + SpeTL(j+1,1); % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo else psj = psPrec + SpeTL(j+1,1); psPrec = psj; end ps2(j-1,1) = psj; end PsTL = [ps0; ps1; ps2]; text = 'Segments of relevance and calculation points of Tilt Link V defined correctly'; fprintf(fileID,fmt,text); else % Non ci sono nodi Tilt Link SpeTL = []; PsTL = []; end %% Tilt Link HD V if yesHD == 1 % Definizione dei segmenti di pertinenza dei singoli accelerometri % SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) % PsTL = Profondità dello spostamento NodiTLHD = -1*cell2mat(NodoTiltLinkHD(:,2:3)); NodiTLHD(:,2) = NodiTLHD(:,2) + Shift; % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora if rHD > 1 spe1 = Nodi(1,2)-((NodiTLHD(1,2) + NodiTLHD(2,2))/2); % segmento di pertinenza del primo nodo else spe1 = 1; end if rHD>2 spe2 = zeros(rHD-2,1); for i = 2:(rHD-1) media1 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i-1,2)))/2; media2 = (abs(NodiTLHD(i,2)) + abs(NodiTLHD(i+1,2)))/2; spe2(i-1,1) = media1 - media2; end else spe2 = []; end if rHD > 1 spelast = (NodiTLHD(rHD-1,2)+NodiTLHD(rHD,2))/2; % segmento di pertinenza del nodo superficiale SpeHD = [spe0; spe1; spe2; spelast]; else SpeHD = [spe0; spe1]; end % Calcolo la profondità dello spostamento relativo ps0 = (-1)*Nodi(1,2); % profondità dell'ancora ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da % ancora + segmento di pertinenza del primo nodo ps2 = zeros(rHD-1,1); for j = 2:rHD if j == 2 if SpeHD(j+1,1) <= 1 psj = ps1 + SpeHD(j+1,1); else psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift; end % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo else if SpeHD(j+1,1) <= 1 psj = psPrec + SpeHD(j+1,1); else psj = cell2mat(NodoTiltLinkHD(j,3))+0.5+Shift; end psPrec = psj; end ps2(j-1,1) = psj; end PsHD = [ps0; ps1; ps2]; text = 'Segments of relevance and calculation points of Tilt Link HD V defined correctly'; fprintf(fileID,fmt,text); for i = 2:rHD+1 if SpeHD(i) > 1 SpeHD(i) = 1; end end else % Non ci sono nodi Tilt Link SpeHD = []; PsHD = []; end %% Tilt Link HD VR if yesHDVR == 1 % Definizione dei segmenti di pertinenza dei singoli accelerometri % SpeTL = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) % PsTL = Profondità dello spostamento NodiTLHDVR = -1*cell2mat(NodoTiltLinkHDVR(:,2:3)); NodiTLHDVR(:,2) = NodiTLHDVR(:,2) + Shift; % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora if rHDVR > 1 spe1 = Nodi(1,2)-((NodiTLHDVR(1,2) + NodiTLHDVR(2,2))/2); % segmento di pertinenza del primo nodo else spe1 = 1; end if rHDVR>2 spe2 = zeros(rHDVR-2,1); for i = 2:(rHDVR-1) media1 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i-1,2)))/2; media2 = (abs(NodiTLHDVR(i,2)) + abs(NodiTLHDVR(i+1,2)))/2; spe2(i-1,1) = media1 - media2; end else spe2 = []; end if rHDVR > 1 spelast = (NodiTLHDVR(rHDVR-1,2)+NodiTLHDVR(rHDVR,2))/2; % segmento di pertinenza del nodo superficiale SpeHDVR = [spe0; spe1; spe2; spelast]; else SpeHDVR = [spe0; spe1]; end % Calcolo la profondità dello spostamento relativo ps0 = (-1)*Nodi(1,2); % profondità dell'ancora ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TL è data da % ancora + segmento di pertinenza del primo nodo ps2 = zeros(rHDVR-1,1); for j = 2:rHDVR if j == 2 if SpeHDVR(j+1,1) <= 1 psj = ps1 + SpeHDVR(j+1,1); else psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift; end % la profondità a cui il nodo j di tipo Tilt Link rileva lo spostamento è data dalla % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo else if SpeHDVR(j+1,1) <= 1 psj = psPrec + SpeHDVR(j+1,1); else psj = cell2mat(NodoTiltLinkHDVR(j,3))+0.5+Shift; end psPrec = psj; end ps2(j-1,1) = psj; end PsHDVR = [ps0; ps1; ps2]; text = 'Segments of relevance and calculation points of Tilt Link HD VR defined correctly'; fprintf(fileID,fmt,text); for i = 2:rHDVR+1 if SpeHDVR(i) > 1 SpeHDVR(i) = 1; end end else % Non ci sono nodi Tilt Link VR SpeHDVR = []; PsHDVR = []; end %% Tilt Link HR V if yesTLHR == 1 % Definizione dei segmenti di pertinenza delle ampolle % PsTLHR = Profondità dello spostamento NodiTLHR = -1*cell2mat(NodoTiltLinkHR(:,2:3)); NodiTLHR(:,2) = NodiTLHR(:,2) + Shift; % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora if rTLHR == 1 % c'è una sola ampolla SpeTLHR = [0; 0.5]; % lo impongo di default else spe1 = Nodi(1,2)-((NodiTLHR(1,2) + NodiTLHR(2,2))/2); % segmento di pertinenza del primo nodo if rTLHR>2 spe2 = zeros(rTLHR-2,1); for i = 2:(rTLHR-1) media1 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i-1,2)))/2; media2 = (abs(NodiTLHR(i,2)) + abs(NodiTLHR(i+1,2)))/2; spei = media1 - media2; spe2(i-1,1) = spei; end else spe2 = []; end spelast = (NodiTLHR(rTLHR-1,2)+NodiTLHR(rTLHR,2))/2; % segmento di pertinenza del nodo superficiale SpeTLHR = [spe0; spe1; spe2; spelast]; end % Calcolo la profondità dello spostamento relativo ps0 = (-1)*Nodi(1,2); % profondità dell'ancora if rTLHR == 1 % c'è una sola ampolla PsTLHR = [ps0; -1*NodiTLHR(1,2)]; else ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo TLHR è data % da ancora + segmento di pertinenza del primo nodo ps2 = zeros(rTLHR-1,1); for j = 2:rTLHR if j == 2 psj = ps1 + SpeTLHR(j+1,1); % la profondità a cui il nodo j di tipo Tilt Link HR rileva lo % spostamento è data dalla somma fra il suo segmento di % pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della % profondità dello spostamento del nodo successivo else psj = psPrec + SpeTLHR(j+1,1); psPrec = psj; end ps2(j-1,1) = psj; end PsTLHR = [ps0; ps1; ps2]; end if yesTL == 1 % Se ci sono Tilt Link, il segmento di pertinenza % dell'ampolla lo scrivo considerando i nodi Tilt Link sopra e % sotto (se sono presenti) salta = zeros(rTLHR,1); esco = 0; % entra o meno nel ciclo successivo if yesTLHR3D == 1 [dim,~] = size(NodoTiltLinkHR3D); if rTLHR == dim % vuol dire che tutti i nodi sono dopppi esco = 1; % non entro nel ciclo successivo end end if esco == 0 NodiTLdown = zeros(rTLHR,1); NodiTLup = zeros(rTLHR,1); ProfTLHR = zeros(rTLHR*3,1); for i = 1:rTLHR prof = NodiTLHR(i,2); % cerco il nodo sotto all'Ampolla B = NodiTL(:,2) > prof; % uso > perchè il segno della profondità è + A = NodiTL(B,2); if i == 1 % guardo se il primo nodo è Ampolla o Mems C = isempty(A); if C == 1 % il primo nodo è Ampolla salta(i) = 1; else salta(i) = 0; end end NodoTLdown = A(end); % nodo Tilt Link sotto all'Ampolla % cerco il nodo dopo l'Ampolla B = NodiTL(:,2) < prof; A = NodiTL(B,2); CC = isempty(A); if C == 1 % Manca il nodo Sotto salta(i) = 1; else if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello % stesso nodo doppio, ignoro il passaggio (manca % il nodo sopra) salta(i) = 1; else salta(i) = 0; NodoTLup = A(1); NodiTLdown(i,1) = NodoTLdown; NodiTLup(i,1) = NodoTLup; % Nodo Tilt Link sopra all'ampolla end end end spe0 = 0; % segmento di pertinenza dell'ancora if salta(1) == 1 spe1 = Nodi(1,2)-NodiTLHR(1,2); % segmento di pertinenza del primo nodo ii = 2; else spe1 = Nodi(1,2)-NodiTLdown(1,1); % segmento di pertinenza del % primo nodo. N.B.: Per funzionare correttamente, il primo nodo % dopo l'ancora deve per forza essere un Tilt Link! ii = 1; end spe2 = zeros(rTLHR,1); for i = ii:rTLHR spei = (NodiTLdown(i,1)-NodiTLup(i,1))/2; spe2(i,1) = spei; end SpeTLHR = [spe0; spe1; spe2]; % Calcolo profondità dello spostamento relativo m = 1; for i = 1:rTLHR if salta(i) == 1 if i == 1 % considero l'ancora a = (Nodi(i,2)+NodiTLHR(i,2))/2; ProfTLHR = PsTLHR; else a = (NodiTLHR(i-1,2)+NodiTLHR(i,2))/2; end if i == rTLHR % ultimo nodo if salta(i) == 1 b = NodiTLHR(i,2); c = NodiTLHR(i,2)+0.25; else b = (NodiTLHR(i,2)+NodiTLup(i))/2; c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2; end else if salta(i+1) == 1 b = (NodiTLHR(i,2)+NodiTLHR(i+1,2))/2; c = (NodiTLHR(i+1,2)-(NodiTLHR(i,2)-NodiTLHR(i+1,2)))/2; else b = (NodiTLHR(i,2)+NodiTLup(i))/2; c = NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2; end end else a = (NodiTLdown(i)+NodiTLHR(i,2))/2; b = (NodiTLHR(i,2)+NodiTLup(i))/2; c = (NodiTLup(i)-(NodiTLHR(i,2)-NodiTLup(i))/2); end ProfTLHR(m,1) = a; ProfTLHR(m+1,1) = b; ProfTLHR(m+2,1) = c; m = m+3; end end end text = 'Segments of relevance and calculation points of Tilt Link HR V defined correctly'; fprintf(fileID,fmt,text); else % Non ci sono nodi Tilt Link HR PsTLHR = []; SpeTLHR = []; end %% Tilt Link HR3D % % CONTROLLA E CORREGGI. lA CORREZIONE FATTA QUI VA PURE SU TL E HR if yesTLHR3D == 1 NodoTLHR3D = zeros(rTL,1); t = 1; for i=1:rTL for j=1:rTLHR if NodiTL(i,2)==NodiTLHR(j,2) NodoTLHR3D(t,1)=NodiTL(i,2); SpeTLHR(j+1,1) = SpeTL(i+1,1); PsTLHR(j+1,1) = PsTL(i+1,1); % il segmento di pertinenza dell'ampolla è identico al SP del corrispondente Tilt Link V t=t+1; end end end end %% Tilt Link H if yesTLH == 1 % Definizione dei segmenti di pertinenza dei singoli accelerometri % SpeTLH = Segmento di Pertinenza del nodo (posizione i-esima del nodo i-esimo) % PsTLH = Posizione dello spostamento Nodi_H = Nodi; NodiTLH = cell2mat(NodoTiltLinkH(:,2:3)); % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora spe1 = -1*(Nodi_H(1,2)-((NodiTLH(1,2) + NodiTLH(2,2))/2)); % segmento di pertinenza del primo nodo, lo considero + if rTLH>2 spe2 = zeros(rTLH-2,1); for i = 2:(rTLH-1) media1 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i-1,2)))/2; media2 = (abs(NodiTLH(i,2)) + abs(NodiTLH(i+1,2)))/2; spei = media1 - media2; spe2(i-1,1) = -1*(spei); % li considero positivi end else spe2 = []; end % segmento di pertinenza dell'ultimo nodo, lo considero centrando il % nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante spelast = (NodiTLH(end,2)+(NodiTLH(end,2)-NodiTLH(rTLH-1,2))/2-((NodiTLH(rTLH-1,2)+NodiTLH(rTLH,2)))/2); SpeTLH = [spe0; spe1; spe2; spelast]; % raccolgo i segmenti di pertinenza % Calcolo la posizione dello spostamento relativo ps0 = Nodi_H(1,2); % posizione dell'ancora if spe1 <= 1 ps1 = Nodi_H(1,2)+spe1; % la posizione del primo nodo TLH è data da else ps1 = cell2mat(NodoTiltLinkH(1,3))+0.5; end % ancora + segmento di pertinenza del primo nodo ps2 = zeros(rTLH-1,1); for j = 2:rTLH if j == 2 if SpeTLH(j+1,1) <= 1 psj = ps1 + SpeTLH(j+1,1); else psj = cell2mat(NodoTiltLinkH(j,3))+0.5; end % la posizione a cui il nodo j di tipo Tilt Link H rileva lo spostamento è data dalla % somma fra il suo segmento di pertinenza e la posizione a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della posizione dello spostamento del nodo successivo else if SpeTLH(j+1,1) <= 1 psj = psPrec + SpeTLH(j+1,1); else psj = cell2mat(NodoTiltLinkH(j,3))+0.5; end psPrec = psj; end ps2(j-1,1) = psj; end PsTLH = [ps0; ps1; ps2]; text = 'Segments of relevance and calculation points of Tilt Link H defined correctly'; fprintf(fileID,fmt,text); for i = 2:rTLH+1 if SpeTLH(i) > 1 SpeTLH(i) = 1; end end else % Non ci sono nodi Tilt Link H SpeTLH = []; PsTLH = []; end %% Tilt Link HR H if yesTLHRH == 1 % Definizione dei segmenti di pertinenza delle ampolle % PsTLHRH = posizione dello spostamento Nodi_HRH = Nodi; NodiTLHRH = cell2mat(NodoTiltLinkHRH(:,2:3)); % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora spe1 = -1*(Nodi_HRH(1,2)-((NodiTLHRH(1,2)+NodiTLHRH(2,2))/2)); % segmento di pertinenza del primo nodo spe2 = zeros(rTLHRH-2,1); if rTLHRH>2 for i = 2:(rTLHRH-1) media1 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i-1,2)))/2; media2 = (abs(NodiTLHRH(i,2)) + abs(NodiTLHRH(i+1,2)))/2; spei = media1 - media2; spe2(i-1,1) = -1*(spei); % li considero positivi end else spe2 = []; end % segmento di pertinenza dell'ultimo nodo, lo considero centrando il % nodo rispetto al nodo sotto e a un ipotetico nodo sopra equidistante spelast = (NodiTLHRH(end,2)+(NodiTLHRH(end,2)-NodiTLHRH(rTLH-1,2))/2-((NodiTLHRH(rTLH-1,2)+NodiTLHRH(rTLH,2)))/2); % raccolgo i segmenti di pertinenza SpeTLHRH = [spe0; spe1; spe2; spelast]; % Calcolo la posizione dello spostamento relativo ps0 = Nodi_HRH(1,2); % posizione dell'ancora if spe1 <= 1 ps1 = Nodi_HRH(1,2)+spe1; % la posizione del primo nodo TLHRH è data da ancora + segmento di pertinenza del primo nodo else ps1 = cell2mat(NodoTiltLinkHRH(1,3))+0.5; end ps2 = zeros(rTLHRH-1,1); for j = 2:rTLHRH if j == 2 if SpeTLHRH(j+1,1) <= 1 psj = ps1 + SpeTLHRH(j+1,1); else psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; end % la posizione a cui il nodo j di tipo Tilt Link HR H rileva lo % spostamento è data dalla somma fra il suo segmento di % pertinenza e la posizione a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della % posizione dello spostamento del nodo successivo else if SpeTLHRH(j+1,1) <= 1 psj = psPrec + SpeTLHRH(j+1,1); else psj = cell2mat(NodoTiltLinkHRH(j,3))+0.5; end psPrec = psj; end ps2(j-1,1) = psj; end PsTLHRH = [ps0; ps1; ps2]; for i = 2:rTLHRH+1 if SpeTLHRH(i) > 1 SpeTLHRH(i) = 1; end end if yesTLH == 1 % Se ci sono Tilt Link H, il segmento di pertinenza % dell'ampolla lo scrivo considerando i nodi Tilt Link H prima e % dopo (se sono presenti), a meno che questi non siano Tilt Link % HR3D H salta = zeros(rTLHRH,1); esco = 0; % entra o meno nel ciclo successivo if yesTLHR3DH == 1 [dim,~] = size(NodoTiltLinkHR3DH); if rTLHRH == dim % vuol dire che tutti i nodi sono dopppi esco = 1; % esco dal ciclo successivo end end if esco == 0 NodiTLHdown = zeros(rTLHRH,1); NodiTLHup = zeros(rTLHRH,1); ProfTLHRH = zeros(rTLHRH*3,1); for i = 1:rTLHRH prof = NodiTLHRH(i,2); % cerco il nodo prima dell'Ampolla B = NodiTLH(:,2) < prof; A = NodiTLH(B,2); if i == 1 % guardo se il primo nodo è Ampolla o Tilt Link C = isempty(A); if C == 1 % il primo nodo è Ampolla salta(i) = 1; else salta(i) = 0; end end NodoTLHdown = A(end); % nodo Tilt Link H prima dell'Ampolla % cerco il nodo dopo l'Ampolla B = NodiTLH(:,2) > prof; A = NodiTLH(B,2); CC = isempty(A); if C == 1 % Manca il nodo dopo salta(i) = 1; else if CC == 1 % ovvero se Tilt Link e Tilt Link HR sono nello % stesso nodo doppio, ignoro il passaggio (manca % il nodo sopra) salta(i) = 1; else salta(i) = 0; NodoTLHup = A(1); NodiTLHdown(i,1) = NodoTLHdown; NodiTLHup(i,1) = NodoTLHup; % Nodo Tilt Link H dopo l'ampolla end end end spe0 = 0; % segmento di pertinenza dell'ancora if salta(1) == 1 spe1 = Nodi(1,2)-NodiTLHRH(1,2); % segmento di pertinenza del primo nodo ii = 2; else spe1 = Nodi(1,2)-NodiTLHdown(1,1); % segmento di pertinenza del % primo nodo. N.B.: Per funzionare correttamente, il primo nodo % dopo l'ancora deve per forza essere un Tilt Link H! ii = 1; end spe2 = zeros(rTLHRH,1); for i = ii:rTLHRH spei = (NodiTLHdown(i,1)-NodiTLHup(i,1))/2; spe2(i,1) = spei; end SpeTLHRH = [spe0; spe1; spe2]; % Calcolo posizione dello spostamento relativo m = 1; for i = 1:rTLHRH if salta(i) == 1 if i == 1 % considero l'ancora a = -1*((Nodi_HRH(i,2)+NodiTLHRH(i,2))/2); ProfTLHRH = PsTLHRH; else a = -1*((NodiTLHRH(i-1,2)+NodiTLHRH(i,2))/2); end if i == rTLHRH % ultimo nodo if salta(i) == 1 b = -1*(NodiTLHRH(i,2)); c = -1*(NodiTLHRH(i,2)+0.25); else b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); end else if salta(i+1) == 1 b = -1*((NodiTLHRH(i,2)+NodiTLHRH(i+1,2))/2); c = -1*(NodiTLHRH(i+1,2)-(NodiTLHRH(i,2)-NodiTLHRH(i+1,2))/2); else b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); end end else a = -1*((NodiTLHdown(i)+NodiTLHRH(i,2))/2); b = -1*((NodiTLHRH(i,2)+NodiTLHup(i))/2); c = -1*(NodiTLHup(i)-(NodiTLHRH(i,2)-NodiTLHup(i))/2); end ProfTLHRH(m,1) = a; ProfTLHRH(m+1,1) = b; ProfTLHRH(m+2,1) = c; m = m+3; end end text = 'Segments of relevance and calculation points of Tilt Link HR H defined correctly'; fprintf(fileID,fmt,text); end else % Non ci sono nodi Tilt Link HR H PsTLHRH = []; SpeTLHRH = []; end %% Tilt Link HR3D H if yesTLHR3DH == 1 NodoTLHR3DH = zeros(rTLH,1); t = 1; for i=1:rTLH for j=1:rTLHRH if NodiTLH(i,2)==NodiTLHRH(j,2) NodoTLHR3DH(t,1)=NodiTLH(i,2); SpeTLHRH(j+1,1) = SpeTLH(i+1,1); PsTLHRH(j+1,1) = PsTLH(i+1,1); t=t+1; end end end end %% In Place Link if yesIPL == 1 NodiIPL = -1*cell2mat(NodoInPlaceLink(:,2:3)); NodiIPL(:,2) = NodiIPL(:,2) + Shift; % Controllo quale sia il numero del nodo più profondo per invertire % eventualmente le matrici Nodo1 = find(cell2mat(NodoInPlaceLink(:,2))==1); Prof1 = cell2mat(NodoInPlaceLink(Nodo1,3)); Nodo2 = find(cell2mat(NodoInPlaceLink(:,2))==2); Prof2 = cell2mat(NodoInPlaceLink(Nodo2,3)); if Prof22 spe2 = zeros(rIPL-2,1); for i = 2:(rIPL-1) if Inverti == 0 media1 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i-1,2)))/2; media2 = (abs(NodiIPL(i,2)) + abs(NodiIPL(i+1,2)))/2; elseif Inverti == 1 media1 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL,2)))/2; media2 = (abs(NodiIPL(rIPL-i+1,2)) + abs(NodiIPL(rIPL-i,2)))/2; end spe2(i-1,1) = media1 - media2; end else spe2 = []; end if Inverti == 0 spelast = (NodiIPL(rIPL-1,2)+NodiIPL(rIPL,2))/2; % segmento di pertinenza del nodo superficiale elseif Inverti == 1 spelast = (NodiIPL(2,2)+NodiIPL(1,2))/2; % segmento di pertinenza del nodo superficiale end SpeIPL = [spe0; spe1; spe2; spelast]; % Calcolo la profondità dello spostamento relativo if Inverti == 0 ps0 = (-1)*Nodi(1,2); % profondità dell'ancora elseif Inverti == 1 ps0 = (-1)*Nodi(end,2); % profondità dell'ancora end if spe1 <= 1 ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPL è data da else ps1 = cell2mat(NodoInPlaceLink(1,3))+0.5; end % ancora + segmento di pertinenza del primo nodo ps2 = zeros(rIPL-1,1); for j = 2:rIPL if j == 2 if SpeIPL(j+1,1) <= 1 psj = ps1 + SpeIPL(j+1,1); else psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift; end % la profondità a cui il nodo j di tipo In Place Link rileva lo spostamento è data dalla % somma fra il suo segmento di pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della profondità dello spostamento del nodo successivo else if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ... strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ... strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ... strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1 if SpeIPL(j+1,1) <= 0.5 psj = psPrec + SpeIPL(j+1,1); else psj = cell2mat(NodoInPlaceLink(j,3))+0.25+Shift; end else if SpeIPL(j+1,1) <= 1 psj = psPrec + SpeIPL(j+1,1); else psj = cell2mat(NodoInPlaceLink(j,3))+0.5+Shift; end end psPrec = psj; end ps2(j-1,1) = psj; end PsIPL = [ps0; ps1; ps2]; text = 'Segments of relevance and calculation points of In Place Link defined correctly'; fprintf(fileID,fmt,text); for i = 2:rIPL+1 if SpeIPL(i) > 1 SpeIPL(i) = 1; end if strcmp(IDcentralina,'ID0070') == 1 && strcmp(DTcatena,'DT0111 IPI') == 1 || ... strcmp(IDcentralina,'ID0071') == 1 && strcmp(DTcatena,'DT0112 IPI') == 1 || ... strcmp(IDcentralina,'ID0072') == 1 && strcmp(DTcatena,'DT0113 IPI') == 1 || ... strcmp(IDcentralina,'ID0073') == 1 && strcmp(DTcatena,'DT0114 IPI') == 1 if SpeIPL(i) > 0.5 SpeIPL(i) = 0.5; end end end else % Non ci sono nodi In Place Link SpeIPL = []; PsIPL = []; Inverti = []; end %% In Place Link HR if yesIPLHR == 1 % Definizione dei segmenti di pertinenza delle ampolle % PsIPLHR = Profondità dello spostamento NodiIPLHR = -1*cell2mat(NodoInPlaceLinkHR(:,2:3)); NodiIPLHR(:,2) = NodiIPLHR(:,2) + Shift; % Costruisco il segmento di pertinenza spe0 = 0; % segmento di pertinenza dell'ancora if rIPLHR == 1 % c'è una sola ampolla SpeIPLHR = [0; 0.5]; % lo impongo di default else spe1 = Nodi(1,2)-((NodiIPLHR(1,2) + NodiIPLHR(2,2))/2); % segmento di pertinenza del primo nodo if rIPLHR>2 spe2 = zeros(rIPLHR-2,1); for i = 2:(rIPLHR-1) media1 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i-1,2)))/2; media2 = (abs(NodiIPLHR(i,2)) + abs(NodiIPLHR(i+1,2)))/2; spei = media1 - media2; spe2(i-1,1) = spei; end else spe2 = []; end spelast = (NodiIPLHR(rIPLHR-1,2)+NodiIPLHR(rIPLHR,2))/2; % segmento di pertinenza del nodo superficiale SpeIPLHR = [spe0; spe1; spe2; spelast]; end % Calcolo la profondità dello spostamento relativo ps0 = (-1)*Nodi(1,2); % profondità dell'ancora if rIPLHR == 1 % c'è una sola ampolla PsIPLHR = [ps0; -1*NodiIPLHR(1,2)]; else if spe1 <= 1 ps1 = (-1)*Nodi(1,2)+spe1; % la profondità del primo nodo IPLHR è data % da ancora + segmento di pertinenza del primo nodo else ps1 = cell2mat(NodoInPlaceLinkHR(1,3))+0.5+Shift; end ps2 = zeros(rIPLHR-1,1); for j = 2:rIPLHR if j == 2 if SpeIPLHR(j+1,1) <= 1 psj = ps1 + SpeIPLHR(j+1,1); else psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift; end % la profondità a cui il nodo j di tipo Tilt Link HR rileva lo % spostamento è data dalla somma fra il suo segmento di % pertinenza e la profondità a cui rileva lo spostamento % il nodo precedente psPrec = psj; % mi serve come appoggio per il calcolo della % profondità dello spostamento del nodo successivo else if SpeIPLHR(j+1,1) <= 1 psj = psPrec + SpeIPLHR(j+1,1); else psj = cell2mat(NodoInPlaceLinkHR(j,3))+0.5+Shift; end psPrec = psj; end ps2(j-1,1) = psj; end PsIPLHR = [ps0; ps1; ps2]; end for i = 2:rIPLHR+1 if SpeIPLHR(i) > 1 SpeIPLHR(i) = 1; end end if yesIPL == 1 % Se ci sono In Place Link, il segmento di pertinenza % dell'ampolla lo scrivo considerando i nodi In Place Link sopra e % sotto (se sono presenti) salta = zeros(rIPLHR,1); esco = 0; % entra o meno nel ciclo successivo if yesIPLHR3D == 1 [dim,~] = size(NodoInPlaceLinkHR3D); if rIPLHR == dim % vuol dire che tutti i nodi sono dopppi esco = 1; % non entro nel ciclo successivo end end if esco == 0 NodiIPLdown = zeros(rIPLHR,1); NodiIPLup = zeros(rIPLHR,1); ProfIPLHR = zeros(rIPLHR*3,1); for i = 1:rIPLHR prof = NodiIPLHR(i,2); % cerco il nodo sotto all'Ampolla B = NodiIPL(:,2) > prof; % uso > perchè il segno della profondità è + A = NodiIPL(B,2); if i == 1 % guardo se il primo nodo è Ampolla o Mems C = isempty(A); if C == 1 % il primo nodo è Ampolla salta(i) = 1; else salta(i) = 0; end end NodoIPLdown = A(end); % nodo In Place Link sotto all'Ampolla % cerco il nodo dopo l'Ampolla B = NodiIPL(:,2) < prof; A = NodiIPL(B,2); CC = isempty(A); if C == 1 % Manca il nodo Sotto salta(i) = 1; else if CC == 1 % ovvero se In Place Link e In Place Link HR sono nello % stesso nodo doppio, ignoro il passaggio (manca % il nodo sopra) salta(i) = 1; else salta(i) = 0; NodoIPLup = A(1); NodiIPLdown(i,1) = NodoIPLdown; NodiIPLup(i,1) = NodoIPLup; % Nodo In Place Link sopra all'ampolla end end end spe0 = 0; % segmento di pertinenza dell'ancora if salta(1) == 1 spe1 = Nodi(1,2)-NodiIPLHR(1,2); % segmento di pertinenza del primo nodo ii = 2; else spe1 = Nodi(1,2)-NodiIPLdown(1,1); % segmento di pertinenza del % primo nodo. N.B.: Per funzionare correttamente, il primo nodo % dopo l'ancora deve per forza essere un Tilt Link! ii = 1; end spe2 = zeros(rIPLHR,1); for i = ii:rIPLHR spei = (NodiIPLdown(i,1)-NodiIPLup(i,1))/2; spe2(i,1) = spei; end SpeIPLHR = [spe0; spe1; spe2]; % Calcolo profondità dello spostamento relativo m = 1; for i = 1:rIPLHR if salta(i) == 1 if i == 1 % considero l'ancora a = (Nodi(i,2)+NodiIPLHR(i,2))/2; ProfIPLHR = PsIPLHR; else a = (NodiIPLHR(i-1,2)+NodiIPLHR(i,2))/2; end if i == rIPLHR % ultimo nodo if salta(i) == 1 b = NodiIPLHR(i,2); c = NodiIPLHR(i,2)+0.25; else b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2; end else if salta(i+1) == 1 b = (NodiIPLHR(i,2)+NodiIPLHR(i+1,2))/2; c = (NodiIPLHR(i+1,2)-(NodiIPLHR(i,2)-NodiIPLHR(i+1,2)))/2; else b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; c = NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2; end end else a = (NodiIPLdown(i)+NodiIPLHR(i,2))/2; b = (NodiIPLHR(i,2)+NodiIPLup(i))/2; c = (NodiIPLup(i)-(NodiIPLHR(i,2)-NodiIPLup(i))/2); end ProfIPLHR(m,1) = a; ProfIPLHR(m+1,1) = b; ProfIPLHR(m+2,1) = c; m = m+3; end end end text = 'Segments of relevance and calculation points of In Place Link HR defined correctly'; fprintf(fileID,fmt,text); else % Non ci sono nodi In Place Link HR PsIPLHR = []; SpeIPLHR = []; end %% In Place Link HR 3D if yesIPLHR3D == 1 NodoIPLHR3D = zeros(rIPL,1); t = 1; for i=1:rIPL for j=1:rIPLHR if NodiIPL(i,2)==NodiIPLHR(j,2) NodoIPLHR3D(t,1)=NodiIPL(i,2); SpeIPLHR(j+1,1) = SpeIPL(i+1,1); PsIPLHR(j+1,1) = PsIPL(i+1,1); % il segmento di pertinenza dell'ampolla è identico al SP % del corrispondente MEMS t=t+1; end end end end % Chiudo Testo fclose(fileID); end