PROCEDURE Analisis;
{DEBUG}
LABEL
1;
VAR
w:ARRAY[0..50] OF REAL;
rx:ARRAY[0..50] OF REAL;
rz:ARRAY[0..50] OF REAL;
r:ARRAY[0..50] OF REAL;
h:ARRAY[0..50] OF REAL;
Vx:ARRAY[0..50] OF REAL;
Vz:ARRAY[0..50] OF REAL;
V:ARRAY[0..50] OF REAL;
Vu:ARRAY[0..50] OF REAL;
Mtu:ARRAY[0..50] OF REAL;
Mtx:ARRAY[0..50] OF REAL;
Mtz:ARRAY[0..50] OF REAL;
Mt:ARRAY[0..50] OF REAL;
cota:ARRAY[0..50] OF REAL;
valor:ARRAY[1..100,1..100] OF STRING;
yy:ARRAY[1..20000] OF REAL; {Coordenada Y}
Fn:ARRAY[0..50] OF REAL;
Altura:ARRAY[0..50] OF REAL;
Qx,Qz,Q,alt,coef,Ta,Tb,rrr,ww,Qp,sr,profun,rango,campo,sum:REAL;
i,j,k,nn,m,KCode,col,ren,lon,nudos:INTEGER;
proyecto,nombre,comentario,region,zona,grupo,regularidad,renglon,carga,salida:STRING;
alfa,tex,Direccion:STRING;
ObjectHd:HANDLE;
Procedure Lee(carga:STRING);
VAR
dummy:STRING;
loc:INTEGER;
BEGIN
dummy:='';
loc:=0;
WHILE (loc=0) DO BEGIN
StdReadLn(dummy);
{WriteLn(dummy);}
loc:=POS(carga,dummy);
END;
END;
Procedure Actualizar(carga:STRING);
LABEL
1;
VAR
i,j,kk,referencia,nc,lon,signo:INTEGER;
parte1,parte2,texto:STRING;
BEGIN
Lee(carga);
Lee('JOINT LOAD');
WriteLn('');
WriteLn(carga);
StdReadLn(texto);
WriteLn(texto);
nc:=Str2Num(texto);
FOR i:=1 TO nc DO BEGIN
StdReadLn(texto);
referencia:=Str2Num(Copy(texto,7,6)); {Número del nudo con la carga}
signo:=Str2Num(Copy(texto,campo,12)); {Signo de la carga}
signo:=ABS(signo)/signo;
FOR j:=1 TO nn DO BEGIN
IF ((yy[referencia]<(Altura[j]+rango)) AND (yy[referencia]>(Altura[j]-rango))) THEN BEGIN
parte1:=Copy(texto,1,12); {Parte 1}
parte2:=Num2Str(3,signo*Fn[j]); {Parte 2}
lon:=LEN(parte2);
FOR kk:=1 TO 12-lon DO BEGIN
parte2:=Concat(' ',parte2);
END;
texto:=Concat(parte1,parte2);
WriteLn(texto);
GOTO 1;
END;
END;
1:
END;
END;
Procedure FechaGenesis(lugar,opcion:STRING);
VAR
Fecha,letra,dd,mm,aa,dds,dia:STRING;
NombreMes:ARRAY[1..12] OF STRING;
i:INTEGER;
BEGIN
NombreMes[1]:='Enero';
NombreMes[2]:='Febrero';
NombreMes[3]:='Marzo';
NombreMes[4]:='Abril';
NombreMes[5]:='Mayo';
NombreMes[6]:='Junio';
NombreMes[7]:='Julio';
NombreMes[8]:='Agosto';
NombreMes[9]:='Septiembre';
NombreMes[10]:='Octubre';
NombreMes[11]:='Noviembre';
NombreMes[12]:='Diciembre';
dia:=Copy(Date(0,0),1,3);
IF ((dia ='Mon') OR (dia ='Lun') OR (dia ='mon') OR (dia ='lun')) THEN dds:='Lunes';
IF ((dia ='Tue') OR (dia ='Mar') OR (dia ='tue') OR (dia ='mar')) THEN dds:='Martes';
IF ((dia ='Wed') OR (dia ='Mié') OR (dia ='wed') OR (dia ='mié')) THEN dds:='Miércoles';
IF ((dia ='Thu') OR (dia ='Jue') OR (dia ='thu') OR (dia ='jue')) THEN dds:='Jueves';
IF ((dia ='Fri') OR (dia ='Vie') OR (dia ='fri') OR (dia ='vie')) THEN dds:='Viernes';
IF ((dia ='Sat') OR (dia ='Sáb') OR (dia ='sat') OR (dia ='sáb')) THEN dds:='Sábado';
IF ((dia ='Sun') OR (dia ='Dom') OR (dia ='sun') OR (dia ='dom')) THEN dds:='Domingo';
dd:='';
mm:='';
aa:='';
i:=1;
Fecha:=Date(2,0);
letra:=Copy(Fecha,1,1);
IF ((dia='Mon') OR (dia='Tue') OR (dia='Wed') OR (dia='Thu') OR (dia='Fri') OR (dia='Sat') OR (dia='Sun')) THEN BEGIN
WHILE letra<>'/' DO BEGIN
mm:=Concat(mm,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
i:=i+1;
letra:=Copy(Fecha,i,1);
WHILE letra<>'/' DO BEGIN
dd:=Concat(dd,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
i:=i+1;
letra:=Copy(Fecha,i,1);
WHILE letra<>'' DO BEGIN
aa:=Concat(aa,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
END
ELSE BEGIN
WHILE letra<>'/' DO BEGIN
dd:=Concat(dd,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
i:=i+1;
letra:=Copy(Fecha,i,1);
WHILE letra<>'/' DO BEGIN
mm:=Concat(mm,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
i:=i+1;
letra:=Copy(Fecha,i,1);
WHILE letra<>'' DO BEGIN
aa:=Concat(aa,letra);
i:=i+1;
letra:=Copy(Fecha,i,1);
END;
END;
IF opcion='FT' THEN
Fecha:=Concat(dds,', ',dd,' de ',NombreMes[Str2Num(mm)],' de ',Num2Str(0,2000+Str2Num(aa)),', ',Date(0,2))
ELSE
Fecha:=Concat(dds,', ',dd,' de ',NombreMes[Str2Num(mm)],' de ',Num2Str(0,2000+Str2Num(aa)));
SetText(GetObject(lugar),Fecha);
END;
Procedure Texto(nombre:STRING;VAR dato:STRING);
VAR
ObjectHd:HANDLE;
BEGIN
ObjectHd:=GetObject(nombre);
dato:=GetText(ObjectHd);
END;
Procedure NumeroR(nombre:STRING;VAR dato:REAL);
VAR
ObjectHd:HANDLE;
BEGIN
ObjectHd:=GetObject(nombre);
dato:=Str2Num(GetText(ObjectHd));
END;
Procedure NumeroI(nombre:STRING;VAR dato:INTEGER);
VAR
ObjectHd:HANDLE;
BEGIN
ObjectHd:=GetObject(nombre);
dato:=Str2Num(GetText(ObjectHd));
END;
Procedure Acel(grupo:STRING;per,Q,c,Ta,Tb,r:REAL;VAR Qp,a:REAL);
BEGIN
IF (per<=Ta) THEN a:=(1+3*per/Ta)*c/4;
IF ((per>Ta) AND (per<=Tb)) THEN a:=c;
IF (per>Tb) THEN a:=c*(Tb/per)^r;
IF per=100 THEN a:=c;
IF grupo='A' THEN a:=1.5*a;
IF per>=Ta THEN
Qp:=Q
ELSE
Qp:=1+(per/Ta)*(Q-1);
END;
Procedure Tabla(titulo:STRING;x,y:REAL;Columnas,Renglones:INTEGER;Ancho,Alto:REAL;valor:ARRAY[1..100,1..100] OF STRING);
VAR
Tama,Esc: REAL;
i,j:INTEGER;
texto:STRING;
h:Handle;
BEGIN
PushAttrs;
DSelectAll;
h:=ActLayer;
Esc:=GetLScale(h);
Tama:=TRUNC(Alto*14);
BeginGroup;
PenSize(20);
PenPat(2);
FillPat(7);
PenFore(0,61166,0);
PenBack(65535,65535,65535);
FillFore(61166,0,0);
FillBack(65535,65535,65535);
Rect(0-x,0-y,Esc*Columnas*Ancho-x,Esc*1*Alto-y);
TextFont(GetFontID('Times'));
TextSize(Tama+4);
TextFace([]);
TextFlip(0);
TextRotate(0);
TextSpace(2);
TextJust(1);
PenFore(0,0,0);
TextVerticalAlign(1);
TextOrigin(Esc*1-x,Esc*(0.85*Alto)-y);
BeginText;
titulo
EndText;
PenSize(14);
PenPat(2);
FillPat(0);
PenFore(61166,0,0);
PenBack(65535,65535,65535);
FillFore(61166,0,0);
FillBack(65535,65535,65535);
Rect(0-x,0-y,Esc*Columnas*Ancho-x,-Esc*Renglones*Alto-y);
PenFore(0,0,52428);
PenSize(10);
Marker(0,1.930542,15);
FOR i:=1 TO Columnas-1 DO BEGIN
MoveTo(Esc*i*Ancho-x,0-y);
LineTo(Esc*i*Ancho-x,-Esc*Renglones*Alto-y);
END;
FOR i:=1 TO Renglones-1 DO BEGIN
MoveTo(0-x,-Esc*i*Alto-y);
LineTo(Esc*Columnas*Ancho-x,-Esc*i*Alto-y);
END;
TextFont(GetFontID('Times'));
TextSize(Tama+2);
TextFace([]);
TextFlip(0);
TextRotate(0);
TextSpace(2);
TextJust(2);
TextVerticalAlign(1);
FOR i:=1 TO Columnas DO BEGIN
FOR j:=1 TO Renglones DO BEGIN
TextOrigin(Esc*(Ancho/2+(i-1)*Ancho)-x,-Esc*(0.35*Alto+(j-1)*Alto)-y);
BeginText;
valor[j,i]
EndText;
END;
END;
EndGroup;
PopAttrs;
END;
Procedure Calcula;
LABEL
3,80,90,100;
VAR
P:ARRAY[0..50] OF REAL;
ra:ARRAY[0..50] OF REAL;
z:ARRAY[0..50,0..50] OF REAL;
t:ARRAY[0..50] OF REAL;
c:ARRAY[0..50] OF REAL;
Vo:ARRAY[0..50] OF REAL;
ht:ARRAY[0..50] OF REAL;
cc:ARRAY[0..50] OF REAL;
X:ARRAY[0..50] OF REAL;
Xp:ARRAY[0..50] OF REAL;
Y:ARRAY[0..50] OF REAL;
a:ARRAY[0..50,0..50] OF REAL;
b:ARRAY[0..50,0..50] OF REAL;
aa:ARRAY[0..50,0..51] OF REAL;
nr,raiz:INTEGER;
ran,mu,error,om2,ron,rod,ro,om,w0,cero,pivot,ace,ce,aaa,d1,d2,sv,def:REAL;
dr,dt,del,SWh,SWh2,fs,fi,TT,qq,k1,k2:REAL;
BEGIN
m:=nn+1;
FOR i:=1 TO nn DO BEGIN
FOR j:=1 TO nn DO BEGIN
a[i,j]:=0;
END;
END;
FOR i:=1 TO nn DO BEGIN
a[i,i]:=r[i];
IF i<nn THEN a[i,i]:=a[i,i]+r[i+1];
IF i>1 THEN a[i,i-1]:=-r[i];
IF i<nn THEN a[i,i+1]:=-r[i+1];
END;
FOR i:=1 TO nn DO BEGIN
X[i]:=i;
END;
IF nn>4 THEN
nr:=4
ELSE
nr:=nn;
raiz:=1;
ran:=0;
mu:=0;
error:=0.001;
90:
om2:=0;
80:
FOR i:=1 TO nn DO BEGIN
FOR j:=1 TO nn DO BEGIN
IF i=j THEN
aa[i,j]:=a[i,j]-mu*w[i]/981
ELSE
aa[i,j]:=a[i,j];
END;
END;
FOR i:=1 TO nn DO BEGIN
Xp[i]:=w[i]/981*X[i];
END;
FOR i:=1 TO nn DO BEGIN
aa[i,m]:=Xp[i];
END;
{********************************************}
{Sistema de ecuaciones lineales}
FOR i:=1 TO nn DO BEGIN
pivot:=aa[i,i];
FOR j:=1 TO m DO BEGIN
aa[i,j]:=aa[i,j]/pivot;
END;
FOR k:=1 TO nn DO BEGIN
IF k<>i THEN BEGIN
cero:=aa[k,i];
FOR j:=1 TO m DO BEGIN
aa[k,j]:=aa[k,j]-cero*aa[i,j];
END;
END;
END;
END;
{********************************************}
X[1]:=1;
FOR i:=2 TO nn DO BEGIN
X[i]:=aa[i,m]/aa[1,m];
END;
ron:=0;
rod:=0;
FOR i:=1 TO nn DO BEGIN
ron:=ron+aa[i,m]*Xp[i];
rod:=rod+w[i]/981*aa[i,m]^2;
END;
ro:=ron/rod;
om:=ro+mu;
IF abs(om2-om)>error THEN BEGIN
om2:=om;
GOTO 80;
END
ELSE BEGIN
IF abs(ran-om)>error THEN BEGIN
ran:=om;
ra[raiz]:=om;
error:=om/100;
FOR i:=1 TO nn DO BEGIN
z[i,raiz]:=X[i];
END;
raiz:=raiz+1;
Message('Raíz ' ,Direccion,': ',raiz-1,' = ',6.28/sqrt(om));
SysBeep;
{GetKeyDown(KCode);}
IF raiz>nr THEN GOTO 100;
END;
mu:=mu+1;
GOTO 90;
END;
100:
w0:=0;
FOR i:=1 TO nn DO BEGIN
w0:=w0+w[i];
END;
tex:=Concat('Periodos ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 4 DO BEGIN
LoadCell(i,j,'');
END;
END;
valor[1,1]:='Número';
valor[1,2]:='Periodo';
valor[1,3]:='Frecuencia';
valor[1,4]:='Frecuencia';
valor[2,1]:='del modo';
valor[2,2]:='Natural (seg)';
valor[2,3]:='(Hz)';
valor[2,4]:='Circular (2π/seg)';
FOR i:=1 TO nr DO BEGIN
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
ww:=sqrt(ra[i]);
t[i]:=6.2832/ww;
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,t[i]));valor[2+i,2]:=Num2Str(3,t[i]);
LoadCell(3+i,3,Num2Str(3,1/t[i]));valor[2+i,3]:=Num2Str(3,1/t[i]);
LoadCell(3+i,4,Num2Str(3,ww));valor[2+i,4]:=Num2Str(3,ww);
END;
CloseSS(ObjectHd);
profun:=-0.5-24.73;
Col:=4;
Ren:=nr+2;
Tabla('Periodos y frecuencias.',9.22,profun,Col,Ren,2.8,0.5,valor);
tex:=Concat('Modos ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 5 DO BEGIN
LoadCell(i,j,'');
END;
END;
valor[1,1]:='Número';
valor[2,1]:='del nivel';
valor[2,2]:='Modo 1';
valor[2,3]:='Modo 2';
valor[2,4]:='Modo 3';
valor[2,5]:='Modo 4';
FOR i:=1 TO nn DO BEGIN
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,z[i,1]));valor[2+i,2]:=Num2Str(3,z[i,1]);
LoadCell(3+i,3,Num2Str(3,z[i,2]));valor[2+i,3]:=Num2Str(3,z[i,2]);
LoadCell(3+i,4,Num2Str(3,z[i,3]));valor[2+i,4]:=Num2Str(3,z[i,3]);
LoadCell(3+i,5,Num2Str(3,z[i,4]));valor[2+i,5]:=Num2Str(3,z[i,4]);
END;
CloseSS(ObjectHd);
profun:=profun+0.5*(nn+3);
Col:=5;
Ren:=nr+3;
Tabla('Modos de vibrar de la estructura.',9.22,profun,Col,Ren,2.8,0.5,valor);
tex:=Concat('Espectros ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 2 DO BEGIN
LoadCell(i,j,'');
END;
END;
FOR i:=1 TO nr DO BEGIN
Acel(grupo,t[i],Q,coef,Ta,Tb,rrr,Qp,aaa);
IF i=1 THEN ace:=aaa;
IF regularidad='Irregular' THEN Qp:=0.8*Qp;
c[i]:=aaa;
t[i]:=c[i]*981/Qp;
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,aaa));valor[2+i,2]:=Num2Str(3,aaa);
END;
CloseSS(ObjectHd);
valor[1,1]:='Número';
valor[2,1]:='del nivel';
valor[2,2]:='Aceleración (g)';
Col:=2;
Ren:=nr+2;
Tabla('Ordenada de los espectros de diseño.',-2.6,-0.50-24.73,Col,Ren,3.5,0.5,valor);
FOR i:=1 TO nr DO BEGIN
d1:=0;
d2:=0;
FOR j:=1 TO nn DO BEGIN
d1:=d1+w[j]/981*z[j,i];
d2:=d2+w[j]/981*z[j,i]^2;
END;
c[i]:=d1/d2;
END;
FOR i:=1 TO nr DO BEGIN
FOR j:=1 TO nn DO BEGIN
z[j,i]:=t[i]*c[i]/ra[i]*z[j,i];
a[j,i]:=z[j,i];
END;
END;
FOR i:=1 TO nr DO BEGIN
FOR j:=nn DOWNTO 2 DO BEGIN
z[j,i]:=z[j,i]-z[j-1,i];
END;
END;
FOR i:=1 TO nn DO BEGIN
FOR j:=1 TO nr DO BEGIN
b[i,j]:=z[i,j];
END;
END;
FOR i:=1 TO nr DO BEGIN
FOR j:=1 TO nn DO BEGIN
z[j,i]:=r[j]*z[j,i];
END;
END;
tex:=Concat('Cortantes ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 5 DO BEGIN
LoadCell(i,j,'');
valor[i,j]:='';
END;
END;
valor[1,1]:='Número';
valor[2,1]:='del modo';
valor[2,2]:='Fuerza 1';
valor[2,3]:='Fuerza 2';
valor[2,4]:='Fuerza 3';
valor[2,5]:='Fuerza 4';
FOR i:=1 TO nn DO BEGIN
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,z[i,1]));valor[2+i,2]:=Num2Str(3,z[i,1]);
LoadCell(3+i,3,Num2Str(3,z[i,2]));valor[2+i,3]:=Num2Str(3,z[i,2]);
LoadCell(3+i,4,Num2Str(3,z[i,3]));valor[2+i,4]:=Num2Str(3,z[i,3]);
LoadCell(3+i,5,Num2Str(3,z[i,4]));valor[2+i,5]:=Num2Str(3,z[i,4]);
END;
FOR i:=1 TO nn DO BEGIN
sv:=0;
FOR j:=1 TO nr DO BEGIN
sv:=sv+z[i,j]^2;
END;
Vo[i]:=sqrt(sv);
END;
Ren:=nn+3;
SprdAlign(1);
IF (Vo[1]<=0.8*ace*w0/Qp) THEN BEGIN
LoadCell(4+nn,1,'Se aumentan las fuerzas cortantes por 0.8*a*Wo/Q’/Vo.');
valor[Ren,2]:='Se aumentan las fuerzas cortantes por 0.8*a*Wo/Q’/Vo.';
FOR j:=1 TO nn DO BEGIN
ra[i]:=Vo[i]*0.8*ace*w0/Qp/Vo[1];
END;
END
ELSE BEGIN
LoadCell(4+nn,1,'No se aumentan las fuerzas cortantes.');
valor[Ren,2]:='No se aumentan las fuerzas cortantes.';
END;
CloseSS(ObjectHd);
profun:=profun+0.5*(nn+3);
Col:=5;
Tabla('Matriz de cortantes (Ton).',9.22,profun,Col,Ren,2.8,0.5,valor);
FOR i:=1 TO nn-1 DO BEGIN
P[i]:=Vo[i]-Vo[i+1];
END;
P[nn]:=Vo[nn];
tex:=Concat('Totales ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 5 DO BEGIN
LoadCell(i,j,'');
valor[i,j]:='';
END;
END;
valor[1,1]:='Número';
valor[1,2]:='Cortante';
valor[1,3]:='Fuerza';
valor[1,4]:='Vn';
valor[1,5]:='Mtn';
valor[2,1]:='del nivel';
valor[2,2]:='Ton';
valor[2,3]:='Ton';
valor[2,4]:='kg';
valor[2,5]:='kg-m';
FOR i:=1 TO nn DO BEGIN
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,Vo[i]));valor[2+i,2]:=Num2Str(3,Vo[i]);
LoadCell(3+i,3,Num2Str(3,P[i]));valor[2+i,3]:=Num2Str(3,P[i]);
LoadCell(3+i,4,Num2Str(3,P[i]*Vu[i]*1000));valor[2+i,4]:=Num2Str(3,P[i]*Vu[i]*1000);Fn[i]:=P[i]*Vu[i]*1000;
LoadCell(3+i,5,Num2Str(3,P[i]*Mtu[i]*1000));valor[2+i,5]:=Num2Str(3,P[i]*Mtu[i]*1000);
END;
CloseSS(ObjectHd);
{******************************************************************}
Actualizar (carga);
{******************************************************************}
profun:=profun+0.5*(nn+4);
Col:=5;
Ren:=nn+2;
Tabla('Cortante, fuerzas totales y fuerzas en cada nudo..',9.22,profun,Col,Ren,2.8,0.5,valor);
FOR i:=1 TO nn DO BEGIN
sv:=0;
FOR j:=1 TO nr DO BEGIN
sv:=sv+b[i,j]^2;
END;
ra[i]:=sqrt(sv);
END;
tex:=Concat('Desplazamientos ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=4 TO 23 DO BEGIN
FOR j:=1 TO 5 DO BEGIN
LoadCell(i,j,'');
END;
END;
valor[1,1]:='Número';
valor[1,2]:='Relativos';
valor[1,3]:='Totales';
valor[1,4]:='De requisito';
valor[1,5]:='De entrepiso';
valor[2,1]:='del nivel';
valor[2,2]:='cm';
valor[2,3]:='cm';
valor[2,4]:='cm';
valor[2,5]:='∆x/h';
def:=0;
FOR i:=1 TO nn DO BEGIN
sv:=0;
FOR j:=1 TO nr DO BEGIN
sv:=sv+a[i,j]^2;
END;
dr:=sqrt(sv);
dt:=dr*Q;
def:=dt-def;
del:=def/h[i];
def:=dt;
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(3+i,1,Num2Str(0,i));valor[2+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(3+i,2,Num2Str(3,ra[i]));valor[2+i,2]:=Num2Str(3,ra[i]);
LoadCell(3+i,3,Num2Str(3,dr));valor[2+i,3]:=Num2Str(3,dr);
LoadCell(3+i,4,Num2Str(3,dt));valor[2+i,4]:=Num2Str(3,dt);
LoadCell(3+i,5,Num2Str(4,del));valor[2+i,5]:=Num2Str(4,del);
END;
CloseSS(ObjectHd);
profun:=profun+0.5*(nn+3);
Col:=5;
Ren:=nn+2;
Tabla('Desplazamientos.',9.22,profun,Col,Ren,2.8,0.5,valor);
Acel(grupo,100,Q,coef,Ta,Tb,rrr,Qp,aaa);
ht[1]:=h[1];
FOR i:=2 TO nn DO BEGIN
ht[i]:=ht[i-1]+h[i];
END;
SWh:=0;
SWh2:=0;
FOR i:=1 TO nn DO BEGIN
SWh:=SWh+w[i]*ht[i];
SWh2:=SWh2+w[i]*ht[i]^2;
END;
FOR i:=1 TO nn DO BEGIN
P[i]:=aaa/Qp*w[i]*ht[i]*w0/SWh;
END;
Vo[nn]:=P[nn];
FOR i:=nn DOWNTO 2 DO BEGIN
Vo[i-1]:=Vo[i]+P[i-1];
END;
X[1]:=Vo[1]/r[1];
FOR i:=2 TO nn DO BEGIN
X[i]:=X[i-1]+Vo[i]/r[i];
END;
fs:=0;
fi:=0;
FOR i:=1 TO nn DO BEGIN
fs:=fs+w[i]*X[i]^2;
fi:=fi+P[i]*X[i];
END;
TT:=6.3*sqrt(fs/fi/981);
tex:=Concat('Estático ',Direccion);
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
SprdWidth(10);
FOR i:=8 TO 26 DO BEGIN
FOR j:=1 TO 3 DO BEGIN
LoadCell(i,j,'');
END;
END;
LoadCell(3,1,'');
LoadCell(4,1,'');
LoadCell(5,1,'');
FOR i:=1 TO nn+3 DO BEGIN
FOR j:=1 TO 3 DO BEGIN
valor[i,j]:= '';
END;
END;
SprdAlign(2);
tex:=Concat('Periodo fundamental de vibración: ',Num2Str(3,TT),' seg.');
LoadCell(2,1,tex);
valor[1,2]:= tex;
Acel(grupo,TT,Q,coef,Ta,Tb,rrr,Qp,aaa);
tex:=Concat('Aceleración de diseño “a”: ',Num2Str(3,aaa));
LoadCell(3,1,tex);
valor[2,2]:= tex;
IF TT<=Tb THEN BEGIN
tex:=Concat('Se reducen las fuerzas cortantes. Se multiplican por “a”.');
LoadCell(4,1,tex);
valor[3,2]:= tex;
FOR i:=1 TO nn DO BEGIN
P[i]:=aaa/Qp*w[i]*ht[i]*w0/SWh;
END;
Vo[nn]:=P[nn];
FOR i:=nn DOWNTO 2 DO BEGIN
Vo[i-1]:=Vo[i]+P[i-1];
END;
END
ELSE BEGIN
tex:=Concat('Se reducen las fuerzas cortantes. Se multiplican por k1hi+k2hi^2.');
LoadCell(4,1,tex);
valor[4,2]:= tex;
valor[5,1]:='Número';
valor[5,2]:='Cortante';
valor[5,3]:='Fuerza';
valor[6,1]:='del nivel';
valor[6,2]:='Ton';
valor[6,3]:='Ton';
qq:=(Tb/TT)^rrr;
k1:=qq*(1-rrr*(1-qq))*w0/SWh;
k2:=1.5*rrr*qq*(1-qq)*w0/SWh2;
FOR i:=1 TO nn DO BEGIN
P[i]:=k1*aaa/Qp*w[i]*ht[i]+k2*aaa/Qp*w[i]*ht[i]^2;
END;
Vo[nn]:=P[nn];
FOR i:=nn DOWNTO 2 DO BEGIN
Vo[i-1]:=Vo[i]+P[i-1];
END;
END;
FOR i:=1 TO nn DO BEGIN
SprdAlign(4);
SprdFormat(0,0,'','');
LoadCell(7+i,1,Num2Str(0,i));valor[3+i,1]:=Num2Str(0,i);
SprdAlign(3);
SprdFormat(1,3,'','');
LoadCell(7+i,2,Num2Str(3,Vo[i]));valor[3+i,2]:=Num2Str(3,Vo[i]);
LoadCell(7+i,3,Num2Str(3,P[i]));valor[3+i,3]:=Num2Str(3,P[i]);
END;
CloseSS(ObjectHd);
profun:=profun+0.5*(nn+3);
Col:=3;
Ren:=nn+3;
Tabla('RESULTADOS DEL ANALISIS ESTATICO.',9.22,profun,Col,Ren,2.8,0.5,valor);
END;
{PROGRAMA PRINCIPAL}
BEGIN
SetCursor(WatchC);
TextFont(20);
TextSize(10);
TextFace([]);
TextSpace(2);
TextJust(2);
SetTool(2);
NumeroI('pisos',nn);
Texto('proyecto',proyecto);
Texto('nombre',nombre);
Texto('comentario',comentario);
Texto('region',region);
Texto('zona',zona);
Texto('grupo',grupo);
Texto('regularidad',regularidad);
NumeroR('Qx',Qx);
NumeroR('Qz',Qz);
Texto('nombre',nombre);
NumeroR('rango',rango);
{*************** Generación de fuerzas cortantes para Multiframe y lectura de coordenadas *************** }
Open(nombre);
ReadLn(renglon);
ReadLn(renglon);
ReadLn(renglon);
ReadLn(nudos);
FOR i:=1 TO nudos DO BEGIN
StdReadLn(renglon);
yy[i]:=Str2Num(Copy(renglon,31,12)); {Coordenada Y}
END;
lon:=LEN(nombre);
salida:=nombre;
Insert('-sismo',salida,lon-3);
Rewrite (salida);
WriteLn(salida);
WriteLn(Date(2,0));
tex:='Rigideces';
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
sum:=0;
FOR i:=1 TO nn DO BEGIN
w[i]:=GetCellNum(ObjectHd,i+3,2);
rx[i]:=GetCellNum(ObjectHd,i+3,3);
rz[i]:=GetCellNum(ObjectHd,i+3,4);
h[i]:=GetCellNum(ObjectHd,i+3,5);
sum:=sum+h[i];
Altura[i]:=sum;
END;
FOR i:=1 TO nn+2 DO BEGIN
FOR j:=1 TO 5 DO BEGIN
valor[i,j]:=GetCellStr(ObjectHd,i+1,j);
END;
END;
CloseSS(ObjectHd);
Layer('Parámetros');
DSelectAll;
SelectObj((N='PRH'));
DeleteObjs;
Tabla('Pesos, rigideces y alturas de entrepiso.',8.9,0.5-24.73,5,nn+2,2.8,0.5,valor);
SetName(LNewObj,'PRH');
tex:='Fuerzas';
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
FOR i:=1 TO nn DO BEGIN
Vx[i]:=GetCellNum(ObjectHd,i+3,2);
Vz[i]:=GetCellNum(ObjectHd,i+3,3);
Mtx[i]:=GetCellNum(ObjectHd,i+3,4);
Mtz[i]:=GetCellNum(ObjectHd,i+3,5);
END;
CloseSS(ObjectHd);
tex:='Espectros';
ObjectHd:=GetObject(tex);
SelectSS(ObjectHd);
tex:=GetCellStr(ObjectHd,1,1);
i:=1;
WHILE tex<>region DO BEGIN
i:=i+1;
tex:=GetCellStr(ObjectHd,i,1);
END;
WHILE tex<>zona DO BEGIN
i:=i+1;
tex:=GetCellStr(ObjectHd,i,1);
END;
coef:=GetCellNum(ObjectHd,i,2);
Ta:=GetCellNum(ObjectHd,i,3);
Tb:=GetCellNum(ObjectHd,i,4);
rrr:=GetCellNum(ObjectHd,i,5);
CloseSS(ObjectHd);
Message('DIRECCION X');
Direccion:='X';
carga:='F. Sismica en X';campo:=49;
ObjectHd:=GetObject('Fuerzas');
SelectSS(ObjectHd);
FOR i:=1 TO nn DO BEGIN
Vu[i]:=GetCellNum(ObjectHd,i+3,2);
Mtu[i]:=GetCellNum(ObjectHd,i+3,4);
END;
CloseSS(ObjectHd);
Q:=Qx;
FOR i:=1 TO nn DO BEGIN
r[i]:=rx[i];
V[i]:=Vx[i];
Mt[i]:=Mtx[i];
END;
Layer('Resultados X');
SelectAll;
DeleteObjs;
Calcula;
Message('DIRECCION Z');
Direccion:='Z';
carga:='F. Sismica en Z';campo:=74;
ObjectHd:=GetObject('Fuerzas');
SelectSS(ObjectHd);
FOR i:=1 TO nn DO BEGIN
Vu[i]:=GetCellNum(ObjectHd,i+3,3);
Mtu[i]:=GetCellNum(ObjectHd,i+3,5);
END;
CloseSS(ObjectHd);
Q:=Qz;
FOR i:=1 TO nn DO BEGIN
r[i]:=rz[i];
V[i]:=Vz[i];
Mt[i]:=Mtz[i];
END;
DSelectAll;
Layer('Resultados Z');
SelectAll;
DeleteObjs;
Calcula;
DSelectAll;
FechaGenesis('Fecha2','FT');
Layer('Resultados X');
DoMenuTextByName('Fit to Window',0);
SysBeep;
1:
ClrMessage;
END;
RUN(Analisis);