DISEÑO ASISTIDO POR COMPUTADORA DE COLUMNAS RECTANGULARES DE CONCRETO REFORZADO EN FLEXOCOMPRESION BIAXIAL CUMPLIENDO REQUISITOS DE RIGIDEZ Y RESISTENCIA
Por  M. I. Juan Aldasoro Robles, UNAM
Ir a página principal
DISEÑO ASISTIDO POR COMPUTADORA DE COLUMNAS RECTANGULARES DE CONCRETO REFORZADO EN FLEXOCOMPRESION BIAXIAL CUMPLIENDO REQUISITOS DE RIGIDEZ Y RESISTENCIA
Por  M. I. Juan Aldasoro Robles, UNAM
Ir a página principal
A. Introducción.
III. Programa de computadora
          El programa de computadora esta diseñado para permitir al usuario ejecutar el análisis o diseño de columnas de concreto. En una análisis, el usuario revisa una columna existente. En este caso, el usuario provee las dimensiones, calibre de las barras de acero, las propiedades de los materiales y la colocación del acero de refuerzo en la sección, explícitamente por medio de coordenadas o implícitamente con el recubrimiento. También, la carga axial y los momentos para condiciones de diseño y de servicio están disponibles. El programa entonces calcula la resistencia para condiciones de diseño y la rigidez para condiciones de servicio. proporcionales a las condiciones requeridas.
          En el caso de diseño, el usuario provee las dimensiones y las propiedades de los materiales. El calibre de las barras de acero y su colocación se determina de manera iterativa hasta que la resistencia y rigidez de la sección satisfaga los requisitos de diseño.
          Si alguno de los requerimientos mínimos del Reglamento no se cumplen, un mensaje de error se muestra al usuario, en la mayoría de los casos con opción para corregirlo. Los limites del porcentaje de acero que recomienda el Reglamento están incluidos en el programa, si no se cumplen se muestra un mensaje de advertencia y/o recomendación. Si se llega a un diseño satisfactorio, el pro-grama presenta la resistencia y rigidez requerida por el usuario.
          El procedimiento que se utiliza en este programa es un método iterativo computarizado que se muestra para el diseño y/o análisis de columnas rectangulares de concreto reforzado sujetas a carga axial y a momento flexionantle biaxial. El método, a diferencia de técnicas de aproximación disponibles anteriormente, asegura el equilibrio ir la compatibilidad de la solución final. La relación entre la profundidad y el ángulo de inclinación del eje neutro en una sección y la correspondiente posición de la combinación de carga y momentos flexionantes ha sido observada con detalle. Esto conduce a un eficiente algoritmo convergente el cual, por lo tanto, permito el diseño de columnas de concreto reforzado con momentos biaxiales de una manera eficiente y racional no disponible previamente. Los ejemplos muestran generalmente buena concordancia con
los resultados de varios métodos aproximados ya establecidos, con los resultados de soluciones con procedimientos electos y con las pruebas experimentales.
          Es claro que la mayoría de las soluciones previas disponibles para el caso de momento biaxlal de columnas han asumido que el refuerzo longitudinal era aproximadamente uniforme en cada lado. Cuando una técnica aproximada es utilizada, esta aproximación es necesaria. Sin embargo, cuando una aproximación más racional es empleada, como se presenta aquí, tal asunción no es necesaria En varios de los ejemplos dados es claro que al agrupar el retuerzo uniformemente en las cuatro caras de la columna se produce un diseño más aliciente

          En el Apéndice A, de la tesis completa, se presenta el diagrama de flujo del algoritmo, que se utiliza para resolver problemas de columnas que cumplan simultáneamente requisitos de rigidez y resistencia. Este diagrama de flujo no incluye todo el detalle para comprender con exactitud como se resuelven los problemas, esto se hizo con lo intención de no aburrir o perder en la complejidad al lector.
          Si se necesita más detalle, puede verse el listado del programa
“BRESI.ER” que se anexa en el Apóndice B. El programa está escrito en FORTRAN 77," ¿Por que en FORTRAN 77? porque es uno de los lenguajes más ampliamente utilizados en el mundo, está disponible en casi todas las computadoras, tiene un alto grado de portabilidad, es decir, transferibilidad, de una computadora a otra y alta velocidad de cálculo.
          Aunque el programa está diseñado de tal manera que se puede resolver un problema leyendo de pantalla y escribiendo en pantalla, existe la opción de leer de un archivo 7 escribir en pantalla, leer de un archivo y escribir en archivo o leer de pantalla y escribir en archivo.
          El compilador que se utilizó para diseñar el programa fue el Microsoft FORTRAN para Apple! Macintosh el cual es una implementación completa de FORTRAN 77. Contiene bodas las características del lenguaje del marco FORTRAN. El listado que a continuación se presenta está en Vectorscript, anidado dentro del programa CADD Vectorworks.
B. Listado del programa
PROCEDURE Bresler;
{DEBUG}
     LABEL
     1,2,3,4;
     CONST
     inc=60;
     VAR
     coor:ARRAY[1..100,1..2] OF REAL;
     area1:ARRAY[1..100] OF REAL;
     area:ARRAY[1..100] OF REAL;
     varilla:ARRAY[1..100,1..2] OF REAL;
     b,h,rec,fpc,fy,lon,est,ec,e0,dif,dif1,bb,hh,ca,cl:REAL;
     agr,pu,mux,muy,vu,vux,vuy,pres,eresx,eresy:REAL;
     por,prjar,comp,prbe,prbs,mrx,mry,err,sepc:REAL;
     x,y,vari,diamp,dp,s,FR,amax,amin,areat,ex,ey:REAL;
     fac,fbc,bp,hp,ang,ceo,puc,exc,eyc:REAL;
     po,ib1,ib2,ib3,ih1,ih2,ih3,exr,eyr,pr0,prx,pry,mxcen,mycen,ed:REAL;
     p,fact,Vulim,VcRlim,s0,s1,s2,s3,s4,has,cte,VcR,Av:REAL;
     i,ii,jj,k,nv,KCode,xy:INTEGER;
ductil,nombre,letrero,layername,sep:STRING;
     j:BOOLEAN;
     ObjectHd:HANDLE;
areasec,pr,ce,dia,exy,exyc,c1,c2,c3,a:REAL;
mxy,t,Ac,yc,dis,esi,long,fu,fs,alfa,eyi,areac:REAL;
colorIndex:LONGINT;

{$INCLUDE FechaGenesis.txt}

Procedure Texto(nombre:STRING;pos:INTEGER;VAR dato:STRING);
     VAR
     layername:STRING;
     ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
dato:=GetText(ObjectHd);
END;

Procedure Numero(nombre:STRING;pos:INTEGER;VAR dato:REAL);
     VAR
     layername:STRING;
     ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
dato:=Str2Num(GetText(ObjectHd));
END;

Procedure Poner(nombre,dato:STRING;pos:INTEGER);
     VAR
     layername:STRING;
     ObjectHd:HANDLE;
BEGIN
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);
layername:=Copy(layername,pos,1);
ObjectHd:=GetObject(Concat(nombre,layername));
SetText(ObjectHd,dato);
END;

{Subprograma para calcular los volúmenes de esfuerzos del concreto, momentos y centros de gravedad}
Procedure vol(bp,hp,fbc,ec,e0:REAL;VAR v,mx,my,x,y:REAL);
BEGIN
v:=fbc*bp*hp*ec/e0*(1/3-ec/e0/12);
mx:=fbc*bp*hp^2*ec/e0*(1/12-1/60*ec/e0);
my:=fbc*bp^2*hp*ec/e0*(1/12-1/60*ec/e0);
x:=my/v;
y:=mx/v;
END;

{Subprograma para calcular la fuerza, del concreto, del acero y los momentos producidos por éstas para secciones rectangulares}
Procedure fuerzas;
   VAR
   vI,mxI,myI,mxII,myII:REAL;
   vIIA,mxIIA,myIIA,vIIB,mxIIB,myIIB,mxIII,myIII,mxIV,myIV:REAL;
   xIIA,yIIA,xIIB,yIIB,xC,yC,bp1,hp1:REAL;
   vC,mxC,myC,mxy,eys,dis,es:REAL;
   esi,fs,cc,e,fu,ey,xxx,long:REAL;
   KCode,i:INTEGER;
    nombre,caso:STRING;

BEGIN
long:=hp*Sin(Arctan(bp/hp));
puc:=0;
mxcen:=0;
mycen:=0;
eys:=fy/2100000;
FOR i:=1 TO nv DO BEGIN
dis:=-(hp*coor[i,1]+bp*coor[i,2]-bp*hp)/sqrt(hp^2+bp^2);
esi:=ec*dis/long;
IF esi>=eys THEN fs:=fy;
IF ((esi<eys) AND (esi>(-eys))) THEN fs:=esi*2100000;
IF esi<=(-eys) THEN fs:=-fy;
fu:=area[i]*fs;
puc:=puc+fu;
mxcen:=mxcen+fu*(h/2-coor[i,2]);
mycen:=mycen+fu*(b/2-coor[i,1]);
END;

xxx:=bp/hp*(hp-h);
{ Caso I}
IF ((bp<=b) AND (hp<=h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,cc,mxI,myI,x,y);
END
{ Caso IIA}
ELSE IF ((bp>b) AND (hp<=h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
cc:=vI-vIIA;
mxII:=mxI-mxIIA;
myII:=myI-myIIA;
x:=myII/cc;
y:=mxII/cc;
END
{* Caso IIB}
ELSE IF ((bp<=b) AND (hp>h)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
cc:=vI-vIIB;
mxII:=mxI-mxIIB;
myII:=myI-myIIB;
x:=myII/cc;
y:=mxII/cc;
END
{* Caso III}
ELSE IF ((bp>b) AND (hp>h) AND (xxx<=b)) THEN BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
cc:=vI-vIIA-vIIB;
mxIII:=mxI-mxIIA-mxIIB;
myIII:=myI-myIIA-myIIB;
x:=myIII/cc;
y:=mxIII/cc;
END
{ Caso IV}
ELSE BEGIN
vol (bp,hp,fbc,ec,e0,vI,mxI,myI,x,y);
bp1:=bp-b;
hp1:=hp/bp*(bp-b);
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIA,mxIIA,myIIA,xIIA,yIIA);
myIIA:=vIIA*(b+xIIA);
bp1:=bp/hp*(hp-h);
hp1:=hp-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vIIB,mxIIB,myIIB,xIIB,yIIB);
mxIIB:=vIIB*(h+yIIB);
bp1:=bp/hp*(hp-h)-b;
hp1:=hp/bp*(bp-b)-h;
e:=ec*bp1/bp;
vol (bp1,hp1,fbc,e,e0,vC,mxC,myC,xC,yC);
mxC:=vC*(h+yC);
myC:=vC*(b+xC);
cc:=vI-vIIA-vIIB+vC;
mxIV:=mxI-mxIIA-mxIIB+mxC;
myIV:=myI-myIIA-myIIB+myC;
x:=myIV/cc;
y:=mxIV/cc;
END;
puc:=FR*(puc+cc);
mycen:=FR*(mycen+cc*(h/2-y));
mxcen:=FR*(mxcen+cc*(b/2-x));
exc:=mycen/puc;
eyc:=mxcen/puc;
END;

{Subprograma para calcular la resistencia de una columna
por el metodo de la fórmula inversa de Boris Bresler,
utilizando un método simplificado.}
Procedure Boris;
   VAR
   m,k1,dif,c,fue,cinc,ei,e,f:REAL;
BEGIN
k1:=0.85*fbc*bb;
dif:=1000;
c:=0;
cinc:=2*hh/100;
FOR ii:=1 TO 100 DO BEGIN
c:=c+cinc;
fue:=0;
m:=0;
e:=fy/2100000;
{Contribución del acero}
FOR jj:=1 TO nv DO BEGIN
ei:=0.003*(c-coor[jj,xy])/c;
IF abs(ei)>=e THEN
f:=area[i]*fy*abs(ei)/ei
ELSE
f:=area[i]*ei*2100000;
fue:=fue+f;
m:=m+(hh/2.-coor[jj,xy])*f;
END;
{Contribución del concreto}
IF c>hh THEN BEGIN
fue:=fue+k1*hh;
m:=m+0.1*k1*hh**2;
END
ELSE BEGIN
fue:=fue+k1*c;
m:=m+k1*c*(hh/2-0.4*c);
END;
exc:=m/fue;
dif1:=abs(ed-exc);
IF (dif1<dif) THEN BEGIN
dif:=dif1;
puc:=fue;
END;
END;
END;

BEGIN
SetCursor(WatchC);
Message('Revisando los datos...');
{************* Revisión de la información ***************}
SetConstrain('qsw');
SetTool(2);
PushAttrs;
DSelectAll;
ObjectHd:=ActLayer;
layername:=GetLName(ObjectHd);

IF ((layername='Columna C-1') OR (layername='Columna C-2') OR (layername='Columna C-3') OR
(layername='Columna C-4') OR (layername='Columna C-5')) THEN BEGIN

Numero('fpc',11,fpc);
Numero('fy',11,fy);
Numero('rec',11,rec);
Numero('lon',11,lon);
Numero('rec',11,rec);
Numero('lon',11,lon);
Numero('est',11,est);
Numero('agr',11,agr);
Numero('pu',11,pu);
Numero('mux',11,mux);
Numero('muy',11,muy);
Numero('vux',11,vux);
Numero('vuy',11,vuy);
Numero('cal',11,cl);
Texto('ductil',11,ductil);
Texto('sep',11,sep);

Poner('por','****',11);
Poner('as','****',11);
Poner('prjar','****',11);
Poner('comp','****',11);
Poner('prbe','****',11);
Poner('prbs','****',11);
Poner('mrx','****',11);
Poner('mry','****',11);
Poner('err','****',11);
Poner('sepc','****',11);
Poner('vmax','****',11);
Poner('comA','****',11);
Poner('comC','****',11);
Poner('comD','****',11);
Poner('ang','****',11);
Poner('ceo','****',11);

DSelectAll;
SelectObj(C='Texto');
DeleteObjs;

{************* Revisando los datos ***************}
DSelectAll;
SelectObj(C='Sección');

ObjectHD:=FSActLayer;
IF ObjectHD=NIL THEN BEGIN
AlrtDialog('No existe la sección.');
SetVCenter(0,0);
GOTO 1;
END;

b:=HWidth(ObjectHD);
h:=HHeight(ObjectHD);


DSelectAll;
SelectObj(C='Varilla');
vari:=0;
diamp:=0;
ObjectHD:=FSActLayer;
WHILE ObjectHD<>NIL DO BEGIN
vari:=vari+1;
HCenter(ObjectHD,x,y);
coor[vari,1]:=x;
coor[vari,2]:=y;
area1[vari]:=0.78*(HHeight(ObjectHD))^2;
diamp:=diamp+HHeight(ObjectHD);
ObjectHD:=NextSObj(ObjectHD);
END;
diamp:=diamp/vari;

DSelectAll;
SelectObj(C='Varilla');
ObjectHD:=FSActLayer;
IF ObjectHD<>NIL THEN BEGIN
nv:=0;
areat:=0;
FOR i:=1 TO vari DO BEGIN
j:=PtInRect(Coor[i,1],Coor[i,2],0,0,b,h);
IF j THEN BEGIN
nv:=nv+1;
varilla[nv,1]:=Coor[i,1];
varilla[nv,2]:=Coor[i,2];
area[nv]:=area1[i];
areat:=areat+area[nv];
END;
END;
END;
IF nv=0 THEN BEGIN
AlrtDialog('La sección no tiene ninguna varilla.');
SetVCenter(0,0);
GOTO 1;
END;
IF nv>100 THEN BEGIN
AlrtDialog('Las varillas no deben ser más de 100.');
GOTO 1;
END;

FOR i:=1 TO nv DO BEGIN
FOR k:=1 TO nv DO BEGIN
dp:=(sqrt(4*area[i]/3.1416)+sqrt(4*area[k]/3.1416))/2;
s:=sqrt((varilla[i,1]-varilla[k,1])^2+(varilla[i,2]-varilla[k,2])^2);
IF ((s>1.5*dp) AND (s<1.5*agr)) THEN BEGIN
AlrtDialog('Advertencia. La separación entre varillas no cumple con las Normas Técnicas Complementarias.');
GOTO 2;
END;
END;
END;

IF ((ductil<>'SI') AND  (ductil<>'NO')) THEN BEGIN
SysBeep;
AlrtDialog('La ductilidad de la estructura deber ser [SI] o [NO].');
GOTO 1;
END;

IF (ductil='NO') THEN BEGIN
FR:=0.8;
amin:=20*b*(h-rec)/fy;
amax:=0.06*b*(h-rec);
IF h/b>4 THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la dimensión transversal mayor de una columna y la menor no excederá de 4.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((b<20) OR (h<20)) THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 20 cm.');
AlrtDialog('No cumplir con este requisito viola las Normas Técnicas Complementarias, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.06.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 20/Fy.');
GOTO 1;
END;

END
ELSE BEGIN
FR:=0.6;
amin:=0.01*b*h;
amax:=0.04*b*h;
IF pu<b*h*fpc/10 THEN BEGIN
SysBeep;
AlrtDialog('La carga Pu no será menor que Agf^c/10.');
j:=YNDialog('Continuar de de todos modos con el cálculo de la resistencia...');
IF j THEN GOTO 4 ELSE GOTO 1;
END;
4:
IF ((b<30) OR (h<30)) THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 30 cm.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF b*h<pu/0.5/fpc THEN BEGIN
SysBeep;
AlrtDialog('El área Ag, no será menor que Pu/0.5f^c para toda combinación de carga.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((b/h<0.4) OR (h/b<0.4)) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el ancho y el peralte de la sección transversal no debe ser menor que 0.4.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF ((lon/h>15) OR (lon/b>15)) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la altura libre y la menor dimensión transversal no excederá de 15.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.04.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 0.01.');
GOTO 1;
END;
IF b>h THEN BEGIN
SysBeep;
AlrtDialog('El ancho de la sección transversal de la columna debe ser menor o igual que el peralte total.');
GOTO 1;
END;

END;
2:
fac:=FR*fpc;
fbc:=fac;  {Porque no se usa el rectángulo equivalente}
ex:=100*muy/pu;
ey:=100*mux/pu;
IF ((ex<0.05*h) OR (ex<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad X de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ex:=0.05*h;
IF ex<2 THEN ex:=2;
Poner('muy',Num2Str(0,Pu*ex/100+10),11);
END;
IF ((ey<0.05*h) OR (ey<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad Y de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ey:=0.05*h;
IF ey<2 THEN ey:=2;
Poner('mux',Num2Str(0,Pu*ey/100+10),11);
END;

{fuerzas;}

{Cálculo con la teroría de JAR
Parte del programa que controla el ángulo y profundidad del
eje neutro, así como el valor más cercano a la solución
del problema para secciones rectangulares}
k:=0;
dif:=1000;
ec:=0.003;
e0:=0.002;
ib1:=0;
ih1:=0;
ib2:=4*b/inc;
ih2:=4*h/inc;
3:
k:=k+1;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Teoría JAR]: ',trunc(ii/inc*100),' %');
FOR jj:=1 TO inc DO BEGIN

bp:=ib1+ii*ib2;
hp:=ih1+jj*ih2;
fuerzas;
dif1:=(abs(exc-ex)+abs(eyc-ey))/(ex+ey);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
pres:=puc;
eresx:=exc;
eresy:=eyc;
dif:=dif1;
ang:=180/3.1416*Arctan(bp/hp);
ceo:=hp*sin(3.1416/180*ang);
ib3:=bp;
ih3:=hp;
END;
END;
END;

po:=100*areat/(b*h);
Poner('por',Num2Str(2,po),11);
Poner('pmin',Num2Str(2,amin/b/h*100),11);
Poner('pmax',Num2Str(2,amax/b/h*100),11);
Poner('amin',Num2Str(2,amin),11);
Poner('amax',Num2Str(2,amax),11);
Poner('as',Num2Str(2,areat),11);
Poner('prjar',Num2Str(0,pres),11);
IF pres>=pu THEN
Poner('comp','La columna si resiste la compresión',11)
ELSE
Poner('comp','¡¡¡ La columna no resiste la compresión !!!',11);
Poner('mrx',Num2Str(0,pres*eresy/100),11);
Poner('mry',Num2Str(0,pres*eresx/100),11);
Poner('err',Num2Str(2,10*dif),11);
Poner('ang',Num2Str(2,ang),11);
Poner('ceo',Num2Str(2,ceo),11);


{Cálculo con la teroría de Bresler-JAR}

dif:=1000;
ih1:=0;
ih2:=4*h/inc;
bp:=4*b;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Bresler-JAR]: ',trunc(ii/(2*inc)*100),' %');
hp:=ih1+ii*ih2;
fuerzas;
dif1:=abs(eyc-ey)/(ey^2);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
prx:=puc;
dif:=dif1;
END;
END;

dif:=1000;
ib1:=0;
ib2:=4*b/inc;
hp:=4*h;
FOR ii:=1 TO inc DO BEGIN
Message('Porcentaje de avance [Bresler-JAR]: ',50+trunc(ii/(2*inc)*100),' %');
bp:=ib1+ii*ib2;
fuerzas;
dif1:=abs(exc-ex)/(ex^2);
IF ((dif1<dif) AND (puc>0)) THEN BEGIN
pry:=puc;
dif:=dif1;
END;
END;

pr0:=b*h*fbc+areat*fy;
prbe:=1/(abs(1/prx)+abs(1/pry)-1/(FR*pr0));
Poner('prbe',Num2Str(0,prbe),11);

Message('Teoría de Bresler simplificado].');
bb:=b;
hh:=h;
xy:=1;
ed:=ey;
Boris;
prx:=puc;

bb:=h;
hh:=b;
xy:=2;
ed:=ex;
Boris;
pry:=puc;
prbs:=FR/(abs(1/prx)+abs(1/pry)-1/pr0);
IF prbs<0.8*prbe THEN prbs:=0.8* prbe;
Poner('prbs',Num2Str(0,prbs),11);

{Revisión por cortante y cálculo de los estribos.}
p:=areat/4/b/(h-rec);
IF (0.7*fbc*h*b+2000*areat)>pu THEN
fact:=1+0.007*pu/b/h
ELSE
fact:=(b*h*0.68*fbc+areat*fy)/pu;
vu:=sqrt(vux^2+vuy^2);
cte:=FR*fact*b*(h-rec)*sqrt(fac);
Vulim:=2*cte;
VcRlim:=1.5*cte;
Poner('vmax',Num2Str(0,Vulim),11);
IF (vu>Vulim) THEN BEGIN
AlrtDialog('No se admite la sección por fuerza cortante.');
GOTO 1;
END;
{Cálculo de la fuerza cortante que toma el concreto.}
IF p<0.01 THEN
VcR:=cte*(0.2+30*p)
ELSE
VcR:=0.5*cte;
IF ((h/b>6) OR (b/h>6)) THEN VcR:=0.7*VcR;
IF ((h>70) OR (b>70)) THEN VcR:=0.7*VcR;
IF VcR>VcRlim THEN VcR:=VcRlim;
{Cálculo de la separación de los estribos.}
s0:=850/sqrt(fy)*diamp;
IF s0<48.*.3175*est THEN s0:=48.*.3175*est;
IF s0<b/2 THEN s0:=b/2;
IF s0<h/2 THEN s0:=h/2;
Av:=2*.0792*est**2;
IF (vu>VcR) THEN s4:=FR*Av*fy*(h-rec)/(vu-VcR);
s1:=FR*Av*fy/(3.5*b);
IF (vu<VcRlim) THEN s2:=0.5*(h-rec);
IF (vu>VcRlim) THEN s3:=0.25*(h-rec);
IF s0/2<s1 THEN s:=s0/2;
IF s2<s THEN s:=s2;
IF s3<s THEN s:=s3;
IF s4<s THEN s:=s4;
IF (ductil='SI') THEN BEGIN
IF s<10 THEN s:=10;
IF s<h/2 THEN s:=h/2;
IF s<b/2 THEN s:=b/2;
END;
IF s<10 THEN s:=10;
Poner('sepc',Num2Str(0,s),11);
has:=b;
IF h>has THEN has:=h;
IF 60>has THEN has:=60;
IF lon/6>has THEN has:=lon/6;
letrero:=Concat('Colocar a partir de los nudos ',Num2Str(0,has/s+1),' estribos # ',Num2Str(0,est),' a cada ',Num2Str(0,s),' cm, después colocarlos a cada ',Num2Str(0,2*s),' cm.');
Poner('comA',letrero,11);

IF ((b>30) OR (h>30)) THEN BEGIN
Poner('comC','Ninguna barra longitudinal que no tenga soporte lateral debe distar más de 15 cm de una',11);
Poner('comD','barra soportada lateralmente. Se recomienda colocar otros estribos o grapas.',11);
END;

Poner('var',num2str(0,nv),11);
Poner('cal',num2str(0,cl),11);

NameClass('Texto');
TextVerticalAlign(1);
FillPat(0);
FillBack(0);
TEXTJUST(1);
TEXTSIZE(12);
TextOrigin(b+15,h);
BeginText;
concat(num2str(0,nv),' # ',num2str(0,cl))
EndText;
TextOrigin(b+15,h-10);
IF est>=3 THEN BEGIN
BeginText;
Concat('Estribos # ',num2str(0,est),' @ ',sep)
EndText;
END
ELSE BEGIN
BeginText;
concat('Estribos de alambrón @ ',sep)
EndText;
END;
NameClass('None');


FechaGenesis(Concat('Fecha',Copy(layername,11,1)),'FT');

END
ELSE IF ((layername='Circular C-1') OR (layername='Circular C-2') OR (layername='Circular C-3')) THEN BEGIN
Numero('fpcC',12,fpc);
Numero('fyC',12,fy);
Numero('recC',12,rec);
Numero('lonC',12,lon);
Numero('estC',12,est);
Numero('agrC',12,agr);
Numero('puC',12,pu);
Numero('muxC',12,mux);
Numero('muyC',12,muy);
Numero('vuxC',12,vux);
Numero('vuyC',12,vuy);
Texto('ductilC',12,ductil);

Numero('calC',12,cl);
Texto('sepeC',12,sep);


Poner('porC','****',12);
Poner('asC','****',12);
Poner('prC','****',12);
Poner('compC','****',12);
Poner('mrC','****',12);
Poner('errC','****',12);
Poner('sepcC','****',12);
Poner('vmaxC','****',12);
Poner('comAC','****',12);
Poner('comCC','****',12);
Poner('comDC','****',12);
Poner('ceoC','****',12);

DSelectAll;
SelectObj(C='Texto');
DeleteObjs;

{************* Revisando los datos ***************}
DSelectAll;
SelectObj(C='Sección');
ObjectHD:=FSActLayer;
IF ObjectHD=NIL THEN BEGIN
AlrtDialog('No existe la sección.');
SetVCenter(0,0);
GOTO 1;
END;

dia:=HWidth(ObjectHD);

DSelectAll;
SelectObj(C='Varilla');
vari:=0;
diamp:=0;
ObjectHD:=FSActLayer;
WHILE ObjectHD<>NIL DO BEGIN
vari:=vari+1;
HCenter(ObjectHD,x,y);
coor[vari,1]:=x;
coor[vari,2]:=y;
area1[vari]:=0.78*(HHeight(ObjectHD))^2;
diamp:=diamp+HHeight(ObjectHD);
ObjectHD:=NextSObj(ObjectHD);
END;
diamp:=diamp/vari;


DSelectAll;
SelectObj(C='Varilla');
ObjectHD:=FSActLayer;
IF ObjectHD<>NIL THEN BEGIN
nv:=0;
areat:=0;
FOR i:=1 TO vari DO BEGIN
j:=PtInRect(Coor[i,1],Coor[i,2],0,0,dia,dia);
IF j THEN BEGIN
nv:=nv+1;
varilla[nv,1]:=Coor[i,1];
varilla[nv,2]:=Coor[i,2];
area[nv]:=area1[i];
areat:=areat+area[nv];
END;
END;
END;
IF nv=0 THEN BEGIN
AlrtDialog('La sección no tiene ninguna varilla.');
SetVCenter(0,0);
GOTO 1;
END;
IF nv>100 THEN BEGIN
AlrtDialog('Las varillas no deben ser más de 100.');
GOTO 1;
END;

FOR i:=1 TO nv DO BEGIN
FOR k:=1 TO nv DO BEGIN
dp:=(sqrt(4*area[i]/3.1416)+sqrt(4*area[k]/3.1416))/2;
s:=sqrt((varilla[i,1]-varilla[k,1])^2+(varilla[i,2]-varilla[k,2])^2);
IF ((s>1.5*dp) AND (s<1.5*agr)) THEN BEGIN
AlrtDialog('Advertencia. La separación entre varillas no cumple con las Normas Técnicas Complementarias.');
GOTO 2;
END;
END;
END;

IF ((ductil<>'SI') AND  (ductil<>'NO')) THEN BEGIN
SysBeep;
AlrtDialog('La ductilidad de la estructura deber ser [SI] o [NO].');
GOTO 1;
END;

IF (ductil='NO') THEN BEGIN
FR:=0.8;
amin:=20*(dia^2)*3.1416/4/fy;
amax:=0.06*(dia^2)*3.1416/4;
areasec:=3.1416/4*dia^2;
IF dia<20 THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 20 cm.');
AlrtDialog('No cumplir con este requisito viola las Normas Técnicas Complementarias, aunque el programa calculará la resistencia.');
END;
IF areat>amax THEN BEGIN
Poner('porC',Num2Str(2,areat*100/areasec),12);
Poner('asC',Num2Str(2,areat),12);
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.06. El programa calculará la resistencia pero no cumple con las NTC');
GOTO 2;
END;
IF areat<amin THEN BEGIN
Poner('porC',Num2Str(2,areat*100/areasec),12);
Poner('asC',Num2Str(2,areat),12);
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 20/Fy.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
GOTO 2;
END;

END
ELSE BEGIN
FR:=0.6;
amin:=0.01*(dia^2)*3.1416/4;
amax:=0.04*(dia^2)*3.1416/4;
IF pu<(dia^2)*3.1416/4*fpc/10 THEN BEGIN
SysBeep;
AlrtDialog('La carga Pu no será menor que Agf^c/10.');
GOTO 1;
END;
IF dia<30 THEN BEGIN
SysBeep;
AlrtDialog('La dimensión transversal mínima será por lo menos de 30 cm.');
AlrtDialog('No cumplir con este requisito viola el reglamento, aunque el programa calculará la resistencia.');
GOTO 2;
END;
IF (dia^2)*3.1416/4<pu/0.5/fpc THEN BEGIN
SysBeep;
AlrtDialog('El área Ag, no será menor que Pu/0.5f^c para toda combinación de carga.');
GOTO 2;
END;
IF (lon/dia>15) THEN BEGIN
SysBeep;
AlrtDialog('La relación entre la altura libre y la menor dimensión transversal no excederá de 15.');
GOTO 2;
END;
IF areat>amax THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será mayor que 0.04.');
GOTO 1;
END;
IF areat<amin THEN BEGIN
SysBeep;
AlrtDialog('La relación entre el área de refuerzo vertical y el área total de la sección no será menor que 0.01.');
GOTO 1;
END;
END;
2:
fac:=FR*fpc;
fbc:=fac;  {Porque no se usa el rectángulo equivalente}
ex:=100*muy/pu;
ey:=100*mux/pu;
IF ((ex<0.05*dia) OR (ex<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad X de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ex:=0.05*dia;
IF ex<2 THEN ex:=2;
Poner('muyC',Num2Str(0,Pu*ex/100+10),12);
END;
IF ((ey<0.05*dia) OR (ey<2)) THEN BEGIN
SysBeep;
AlrtDialog('La excentricidad Y de diseño no será menor que 0.05h ni menor que 2 cm.');
AlrtDialog('Se tomará para el cálculo la mínima reglamentaria.');
ey:=0.05*dia;
IF ey<2 THEN ey:=2;
Poner('muxC',Num2Str(0,Pu*ey/100+10),12);
END;



{Subprograma que controla el ángulo y profundidad del
eje neutro, así como el valor más cercano a la solución
del problema para secciones circulares.}
ec:=0.003;
exy:=sqrt(ex^2+ey^2);
dif:=1000;
ce:=0;

FOR ii:=1 TO 100 DO BEGIN
ce:=ce+0.02;
puc:=0;
mxy:=0;
long:=ce*dia;
t:=dia/2-long;
IF t<0 THEN t:=-t;
IF long>dia THEN t:=dia/2;
alfa:= ArcCos(t/(dia/2));
eyi:=fy/2100000;
FOR i:=1 TO nv DO BEGIN
dis:=long-coor[i,2];
esi:=ec*dis/long;
IF esi>=eyi THEN fs:=fy;
IF ((esi<eyi) AND (esi>(-eyi))) THEN fs:=esi*2100000;
IF esi<=(-eyi) THEN fs:=-fy;
fu:=area[i]*fs;
puc:=puc+fu;
mxy:=mxy+fu*(dia/2-coor[i,2]);
END;

IF long<=dia/2 THEN BEGIN
yc:=dia/3*(sin(alfa))^3/(alfa-sin(alfa)*cos(alfa));
Ac:=dia**2/4*(alfa-sin(alfa)*cos(alfa));
END
ELSE BEGIN
yc:=dia/3*(sin(alfa))^3/(3.1416-alfa+sin(alfa)*cos(alfa));
Ac:=3.1416*dia^2/4-dia^2/4.*(alfa-sin(alfa)*cos(alfa));
END;
puc:=FR*(puc+0.85*Ac*fbc);
mxy:=FR*(mxy+0.85*Ac*fbc*yc);
exyc:=mxy/puc;
dif1:=abs(exyc-exy)/exy;
IF dif1<dif THEN BEGIN
pres:=puc;
ec:=exyc;
dif:=dif1;
ceo:=long;
END;

END;

po:=100*areat/((dia^2)*3.1416/4);
Poner('porC',Num2Str(2,po),12);
Poner('asC',Num2Str(2,areat),12);
Poner('prC',Num2Str(0,pres),12);
IF pres>=pu THEN
Poner('compC','La columna si resiste la compresión',12)
ELSE
Poner('compC','¡¡¡ La columna no resiste la compresión !!!',12);
Poner('mrC',Num2Str(0,pres*ec/100),12);
Poner('muxyC',Num2Str(0,sqrt(mux^2+muy^2)),12);
Poner('errC',Num2Str(2,100*dif),12);
Poner('ceoC',Num2Str(2,ceo),12);

{Revisión por cortante y cálculo de los estribos.}
areac:=(dia^2)*3.1416/4;
p:=areat/4/areac;
IF (0.7*fbc*areac+2000*areat)>pu THEN
fact:=1+0.007*pu/areac
ELSE
fact:=(areac*0.68*fbc+areat*fy)/pu;
vu:=sqrt(vux^2+vuy^2);
cte:=FR*fact*areac*sqrt(fac);
Vulim:=2*cte;
VcRlim:=1.5*cte;
Poner('vmaxC',Num2Str(0,Vulim),12);
IF (vu>Vulim) THEN BEGIN
AlrtDialog('No se admite la sección por fuerza cortante.');
GOTO 1;
END;
{Cálculo de la fuerza cortante que toma el concreto.}
IF p<0.01 THEN
VcR:=cte*(0.2+30*p)
ELSE
VcR:=0.5*cte;
IF dia>70 THEN VcR:=0.7*VcR;
IF VcR>VcRlim THEN VcR:=VcRlim;

{Cálculo de la separación de los estribos.}

s0:=850/sqrt(fy)*diamp;
IF s0<48.*.3175*est THEN s0:=48.*.3175*est;
IF s0<dia/2 THEN s0:=dia/2;
IF s0<dia/2 THEN s0:=dia/2;
Av:=2*.0792*est**2;
IF (vu>VcR) THEN s4:=FR*Av*fy*(dia-rec)/(vu-VcR);
s1:=FR*Av*fy/(3.5*dia);
IF (vu<VcRlim) THEN s2:=0.5*(dia-rec);
IF (vu>VcRlim) THEN s3:=0.25*(dia-rec);
IF s0/2<s1 THEN s:=s0/2;
IF s2<s THEN s:=s2;
IF s3<s THEN s:=s3;
IF s4<s THEN s:=s4;
IF (ductil='SI') THEN BEGIN
IF s<10 THEN s:=10;
IF s<dia/2 THEN s:=dia/2;
IF s<dia/2 THEN s:=dia/2;
END;
IF s<10 THEN s:=10;
Poner('sepcC',Num2Str(0,s),12);
has:=b;
IF dia>has THEN has:=dia;
IF 60>has THEN has:=60;
IF lon/6>has THEN has:=lon/6;
letrero:=Concat('Colocar a partir de los nudos ',Num2Str(0,has/s+1),' estribos # ',Num2Str(0,est),' a cada ',Num2Str(0,s),' cm, después colocarlos a cada ',Num2Str(0,2*s),' cm.');
Poner('comAC',letrero,12);

NameClass('Texto');
FillPat(0);
FillBack(0);
TEXTJUST(1);
TEXTSIZE(12);
TextOrigin(dia+16+cl*2.54/8,dia-12.5+cl*2.54/8);
BeginText;
concat(num2str(0,nv),' # ',num2str(0,cl))
EndText;
TextOrigin(dia+16+cl*2.54/8,dia-22.5+cl*2.54/8);
IF est>=3 THEN BEGIN
BeginText;
Concat('Estribos # ',num2str(0,est),' @ ',sep)
EndText;
END
ELSE BEGIN
BeginText;
concat('Estribos de alambrón @ ',sep)
EndText;
END;
NameClass('None');

FechaGenesis(Concat('FechaC',Copy(layername,12,1)),'FT');

END
ELSE BEGIN
AlrtDialog('El tipo de columna debe ser rectangular o circular. Seleccione la columna adecuada.');
Layer('Columna C-1');
END;


DoMenuTextByName('Fit to Window',0);

1:
DSelectAll;
PopAttrs;
SysBeep;
ClrMessage;
END;
RUN (Bresler);
Ir Arriba