Proektsoftbg / Calcpad

Free and open source software for mathematical and engineering calculations.
https://calcpad.eu
MIT License
358 stars 43 forks source link

Simulating while #95

Closed hildebrandopsj closed 1 year ago

hildebrandopsj commented 1 year ago

@Proektsoftbg how can i simulate a while function with calcpad?

Proektsoftbg commented 1 year ago

Hi,

All types of cycles can be simulated with conditional #repeat block:

    #repeat
        'code
        #if 'condition
            #break 'or #continue
        #end if
        'more code
    #loop 

It depends on where you will put the #if-#break-#end if block - in the beginnig or end to get either while(...){...} or do{...}while(...) equivalents. The rest is just a syntax sugar.

hildebrandopsj commented 1 year ago

Well, my case is a little complex. I trying to translate some Matlab script to calcpad, it's a for with many while's inside.

I have the script in fortran, vba and matlab.

LOURENÇO.pdf

Proektsoftbg commented 1 year ago

Probaby you can edit the code with Notepad++ and use some find/replace first.

  1. In Notepad++ press Ctrl+H.
  2. Click the "Regular expression" checkbox
  3. Enter the following string to search for:
    (while)\((.*?)\)
  4. Enter the string to replace with:
    #repeat\n#if $2\n\t#break\n#end if
  5. Click "Replace All".

image

It will replace all

while(...)

expressions with

#repeat
#if ...
    #break
#end if
hildebrandopsj commented 1 year ago

Thanks @Proektsoftbg , i Will try to use macros tô solve this, i made the code using some similar, but it always results in some infinity loop.

hildebrandopsj commented 1 year ago

@Proektsoftbg i finally got it! Here is the result, the sign convention is from STRAP (Atir Software) but can easy be adapted for eurocode convention (just invert the Mxy sign).

This script do a automatic design of concrete shell

#show
"Dimensionamento de elementos de casca
'<hr />
#Pre
'<h4>Coeficientes de Ponderação</h4>'
γ_s = ? 
γ_c = ? 
'<h4>Concreto</h4>'
'<p>Escolha o fck: 
'<select data-target="f_ck">
'<option value=15>C15</option > 
'<option value=18>C18</option>
'<option value=20>C20</option>
'<option value=25>C25</option>
'<option value=30>C30</option>
'<option value=35>C35</option>
'<option value=40>C40</option>
'<option value=45>C45</option>
'<option value=50>C50</option>
'<option value=55>C55</option>
'<option value=60>C60</option>
'<option value=65>C65</option>
'<option value=70>C70</option>
'<option value=75>C75</option>
'<option value=80>C80</option>
'<option value=85>C85</option>
'<option value=90>C90</option>
'</select></p>
'<p id="f_ck" style="display:none;">'f_ck = ? '</p>
'<h4>Aço</h4>'
'<p>Escolha o aço utilizado para a armadura longitudinal:
'<select data-target="fyk">
'<option value=250>CA25</option> 
'<option value=500>CA50</option>
'<option value=600>CA60</option>
'</select></p>
'<p id="fyk" style="display:none;">'f_yk = ? MPa'</p>
#post
'<h4>Propriedades dos Materiais</h4>'
'<h4>Concreto</h4>'
#hide
α_v2 = 1 - f_ck/250
#post
f_ck'MPa
f_cd = f_ck/γ_c'MPa
f_cd1 = 0.85*α_v2*f_cd'MPa
f_cd2 = 0.60*α_v2*f_cd'MPa
ε_cp = -2/1000
#hide
#if f_ck ≤ 50
f_ctm = 0.3*f_ck^(2/3)'MPa
#else
f_ctm = 2.12*ln(1 + 0.11*f_ck)'MPa
#end if
f_ctk,inf = 0.7*f_ctm'MPa
f_ctk,sup = 1.3*f_ctm'MPa
f_ctd = f_ctk,inf/γ_c'MPa
#post
'<h4>Aço</h4>'
E_s = 210000MPa
f_yk
f_yd = f_yk/γ_s
ε_yi = f_yd/E_s
#Hide
f_ck = f_ck*MPa
f_cd = f_cd*MPa
f_cd1 = f_cd1*MPa
f_cd2 = f_cd2*MPa
f_ctk,inf = f_ctk,inf*MPa
f_ctk,sup = f_ctk,sup*MPa
f_ctm = f_ctm*MPa
f_ctd = f_ctd*MPa
#show
'<h4>Geometria</h4>
h = ? cm' - Espessura da casca
h_sx,zt = ? cm' - Distância da armadura superior na direção xx até a camada central
h_sx,zb = ? cm' - Distância da armadura inferior na direção xx até a camada central
h_sy,zt = ? cm' - Distância da armadura superior na direção yy até a camada central
h_sy,zb = ? cm' - Distância da armadura inferior na direção yy até a camada central
'<h4>Solicitações</h4>
N_x = ? kN/m' = força paralela ao eixo xx 
N_y = ? kN/m' = força paralela ao eixo yy
N_xy = ? kN/m' = força cortante
M_x = ? kN*m/m' = momento fletor em torno do eixo yy
M_y = ? kN*m/m' = momento fletor em torno do eixo xx
M_xy = ? kN*m/m' = momento torsor
V_x = ? kN/m
V_y = ? kN/m
#hide
ΔN_x,t = 0kN/m
ΔN_x,b = 0kN/m
ΔN_y,t = 0kN/m
ΔN_y,b = 0kN/m
#show
"Espessuras
a_zt = 0.2*h
a_zb = 0.2*h
#post
h_zt = h/2 - a_zt/2
h_zb = h/2 - a_zb/2
h_c = h - a_zt - a_zb
it = 0
#post
#repeat
"Iterações
#val
'Iteração número: 'it = it + 1
#equ
"Esforços cortantes no núcleo
V_0 = sqrt(V_x^2 + V_y^2)
θ_0 = atan(V_y/V_x)
V_r = 0.25*f_ctd*h_c
#if V_0/V_r > 1
θ_N = 45°
Δn_x = (V_x^2)/(2*V_0)*cot(θ_N)
Δn_y = (V_y^2)/(2*V_0)*cot(θ_N)
Δn_xy = (V_x*V_y)/(2*V_0)*cot(θ_N)
#else
Δn_x = 0kN/m
Δn_y = 0kN/m
Δn_xy = 0kN/m
#end if
"Esforços de membrana
'Camada superior
N_x,zt = (N_x*h_zb + M_x)/(h_zt + h_zb) + ΔN_x,t + Δn_x
N_y,zt = (N_y*h_zb + M_y)/(h_zt + h_zb) + ΔN_y,t + Δn_y
N_xy,zt = (N_xy*h_zb + M_xy)/(h_zt + h_zb) + Δn_xy
N_c1,t = (N_x,zt + N_y,zt)/2 + sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
N_c2,t = (N_x,zt + N_y,zt)/2 - sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
'Camada inferior
N_x,zb = (N_x*h_zt - M_x)/(h_zt + h_zb) + ΔN_x,b + Δn_x
N_y,zb = (N_y*h_zt - M_y)/(h_zt + h_zb) + ΔN_y,b + Δn_y
N_xy,zb = (N_xy*h_zt - M_xy)/(h_zt + h_zb) + Δn_xy
N_c1,b = (N_x,zb + N_y,zb)/2 + sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
N_c2,b = (N_x,zb + N_y,zb)/2 - sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
"Reforço da membrana
'Camada superior
#if N_c1,t ≤ 0kN/m
'Caso 4
θ_t = 0°
N_c2,t = (N_x,zt + N_y,zt)/2 - sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
N_c,t = N_c2,t
N_sx,t = 0kN/m
N_sy,t = 0kN/m
#else if N_x,zt < -abs(N_xy,zt)
'Caso 2
θ_t = atan(-(N_x,zt/N_xy,zt))*°
N_sx,t = 0kN/m
N_sy,t = N_y,zt - (N_xy,zt^2)/N_x,zt
N_c,t = N_x,zt + (N_xy,zt^2)/N_x,zt
#else if N_y,zt < -abs(N_xy,zt)
'Caso 3
θ_t = atan(-N_xy,zt/N_y,zt)*°
N_sx,t = N_x,zt - (N_xy,zt^2)/N_y,zt
N_sy,t = 0kN/m
N_c,t = N_y,zt + (N_xy,zt^2)/N_y,zt
#else
'Caso 1
θ_t = 45°
N_sx,t = N_x,zt + abs(N_xy,zt)
N_sy,t = N_y,zt + abs(N_xy,zt)
N_c,t = -2*abs(N_xy,zt)
#end if
'Camada inferior
#if N_c1,b ≤ 0kN/m
'Caso 4
θ_b = 0°
N_c2,b = (N_x,zb + N_y,zb)/2 - sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
N_c,b = N_c2,b
N_sx,b = 0kN/m
N_sy,b = 0kN/m
#else if N_x,zb < -abs(N_xy,zb)
'Caso 2
θ_b = atan(-N_x,zb/N_xy,zb)*°
N_sx,b = 0kN/m
N_sy,b = N_y,zb - (N_xy,zb^2)/N_x,zb
N_c,b = N_x,zb + (N_xy,zb^2)/N_x,zb
#else if N_y,zb < -abs(N_xy,zb)
'Caso 3
θ_b = atan(-N_xy,zb/N_y,zb)*°
N_sx,b = N_x,zb - (N_xy,zb^2)/N_y,zb
N_sy,b = 0kN/m
N_c,b = N_y,zb + (N_xy,zb^2)/N_y,zb
#else
'Caso 1
θ_b = -45°
N_sx,b = N_x,zb + abs(N_xy,zb)
N_sy,b = N_y,zb + abs(N_xy,zb)
N_c,b = -2*abs(N_xy,zb)
#end if
"Força real na armadura
'Direção x
#if (N_sx,t > 0kN/m)*(N_sx,b > 0kN/m)
N_sx,t,shell = (N_sx,t*(h_sx,zb + h_zt) + N_sx,b*(h_sx,zb - h_zb))/(h_sx,zt + h_sx,zb)
N_sx,b,shell = N_sx,t + N_sx,b - N_sx,t,shell
N_sx,t = N_sx,t,shell
N_sx,b = N_sx,b,shell
#else if N_sx,t > 0kN/m
N_sx,t,shell = (N_sx,t*(h_zt + h_zb))/(h_zb + h_sx,zt)
ΔN_x,b = N_sx,t - N_sx,t,shell
N_sx,t = N_sx,t,shell
#else if N_sx,b > 0kN/m
N_sx,b,shell = (N_sx,b*(h_zt + h_zb))/(h_zt + h_sx,zb)
ΔN_x,t = N_sx,b - N_sx,b,shell
N_sx,b = N_sx,b,shell
#end if
'Direção y
#if (N_sy,t > 0kN/m)*(N_sy,b > 0kN/m)
N_sy,t,shell = (N_sy,t*(h_zt + h_sy,zb) + N_sy,b*(h_sy,zb - h_zb))/(h_sy,zt + h_sy,zb)
N_sy,b,shell = N_sy,t + N_sy,b - N_sy,t,shell
N_sy,t = N_sy,t,shell
N_sy,b = N_sy,b,shell
#else if N_sy,t > 0kN/m
N_sy,t,shell = (N_sy,t*(h_zt + h_zb))/(h_zb + h_sy,zt)
ΔN_y,b = N_sy,t - N_sy,t,shell
N_sy,t = N_sy,t,shell
#else if N_sy,b > 0kN/m
N_sy,b,shell = (N_sy,b*(h_zt + h_zb))/(h_zt + h_sy,zb)
ΔN_y,t = N_sy,b - N_sy,b,shell
N_sy,b = N_sy,b,shell
#end if
"Resistência do concreto
'Camada superior
#if N_c1,t ≤ 0kN/m
'Caso 4
f_c,t = f_cd1
#else if N_x,zt < -abs(N_xy,zt)
'Caso 2
ε_1,t = (ε_yi - ε_cp*cos(θ_t)^2)/sin(θ_t)^2
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#else if N_y,zt < -abs(N_xy,zt)
'Caso 3
ε_1,t = (ε_yi - ε_cp*sin(θ_t)^2)/cos(θ_t)^2
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#else
'Caso 1
ε_1,t = 2*(ε_yi - 0.5*ε_cp)
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#end if
'Camada inferior
#if N_c1,b ≤ 0kN/m
'Caso 4
f_c,b = f_cd1
#else if N_x,zb < -abs(N_xy,zb)
'Caso 2
ε_1,b = (ε_yi - ε_cp*cos(θ_b)^2)/sin(θ_b)^2
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#else if N_y,zb < -abs(N_xy,zb)
'Caso 3
ε_1,b = (ε_yi - ε_cp*sin(θ_b)^2)/cos(θ_b)^2
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#else
'Caso 1
ε_1,b = 2*(ε_yi - 0.5*ε_cp)
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#end if
"Armaduras necessárias
A_sx,t = N_sx,t/f_yd|cm^2/m
A_sy,t = N_sy,t/f_yd|cm^2/m
A_sx,b = N_sx,b/f_yd|cm^2/m
A_sy,b = N_sy,b/f_yd|cm^2/m
"Correção das espessuras
a_zt,old = a_zt
a_zb,old = a_zb
a_zt = abs(N_c,t)/f_c,t|cm
a_zb = abs(N_c,b)/f_c,b|cm
h_zt = h/2 - a_zt/2
h_zb = h/2 - a_zb/2
h_c = h - a_zt - a_zb
#if ((a_zt,old - a_zt)/a_zt,old ≤ 0.00000001)*((a_zb,old - a_zb)/a_zb,old ≤ 0.00000001)
#break
#else
#continue
#end if
#loop
"Resultados Finais
'Número de iterações necessárias
it
'Resultados da camada superior
a_zt
f_c,t
θ_t
'Resultados da camada inferior
a_zb
f_c,b
θ_b
'Armadura necessária na direção x
A_sx,t|cm^2/m
A_sx,b|cm^2/m
'Armadura necessária na direção y
A_sy,t|cm^2/m
A_sy,b|cm^2/m
Proektsoftbg commented 1 year ago

Wow, @hildebrandopsj, this is really amaizing! Great job!

And also very complicated. I do not have this done yet. Would you mind if I translate it and use it here in Bulgaria? It is very similar to Eurocode, so probably only a few things will need to be changed.

hildebrandopsj commented 1 year ago

@Proektsoftbg be my guest! If you have any doubts or suggestions, let me know. The whole worksheet is based in some articles and validated with ceb 223

hildebrandopsj commented 1 year ago

@Proektsoftbg i made a few corrections in the code and some new implementations (Influence of shear in the outer plates). The sign convention in this worksheet is equal to SAP2000 and Scia Engineer

#show
"Dimensionamento de elementos de casca
'<hr />
#Pre
'*** A convenção de sinais utilizada nesta planilha é idêntica aos softwares SAP2000 e SCIA ***
'* Para comparar com os resultados do CEB Bulletin 223 é necessário inverter os valores dos momentos Mx e My *
'<h4>Coeficientes de Ponderação</h4>'
γ_s = ? 
γ_c = ? 
'<h4>Concreto</h4>'
'<p>Escolha o fck: 
'<select data-target="f_ck">
'<option value=15>C15</option > 
'<option value=18>C18</option>
'<option value=20>C20</option>
'<option value=25>C25</option>
'<option value=30>C30</option>
'<option value=35>C35</option>
'<option value=40>C40</option>
'<option value=45>C45</option>
'<option value=50>C50</option>
'<option value=55>C55</option>
'<option value=60>C60</option>
'<option value=65>C65</option>
'<option value=70>C70</option>
'<option value=75>C75</option>
'<option value=80>C80</option>
'<option value=85>C85</option>
'<option value=90>C90</option>
'</select></p>
'<p id="f_ck" style="display:none;">'f_ck = ? '</p>
'<h4>Aço</h4>'
'<p>Escolha o aço utilizado para a armadura longitudinal:
'<select data-target="fyk">
'<option value=250>CA25</option> 
'<option value=500>CA50</option>
'<option value=600>CA60</option>
'</select></p>
'<p id="fyk" style="display:none;">'f_yk = ? MPa'</p>
#post
'<h4>Propriedades dos Materiais</h4>'
'<h4>Concreto</h4>'
#hide
α_v2 = 1 - f_ck/250
#post
f_ck'MPa
f_cd = f_ck/γ_c'MPa
f_cd1 = 0.85*α_v2*f_cd'MPa
f_cd2 = 0.60*α_v2*f_cd'MPa
ε_cp = -2/1000
#hide
#if f_ck ≤ 50
f_ctm = 0.3*f_ck^(2/3)'MPa
#else
f_ctm = 2.12*ln(1 + 0.11*f_ck)'MPa
#end if
f_ctk,inf = 0.7*f_ctm'MPa
f_ctk,sup = 1.3*f_ctm'MPa
f_ctd = f_ctk,inf/γ_c'MPa
#post
'<h4>Aço</h4>'
E_s = 210000MPa
f_yk
f_yd = f_yk/γ_s
ε_yi = f_yd/E_s
#Hide
f_ck = f_ck*MPa
f_cd = f_cd*MPa
f_cd1 = f_cd1*MPa
f_cd2 = f_cd2*MPa
f_ctk,inf = f_ctk,inf*MPa
f_ctk,sup = f_ctk,sup*MPa
f_ctm = f_ctm*MPa
f_ctd = f_ctd*MPa
#show
'<h4>Geometria</h4>
h = ? cm' - Espessura da casca
h_sx,zt = ? cm' - Distância da armadura superior na direção xx até a camada central
h_sx,zb = ? cm' - Distância da armadura inferior na direção xx até a camada central
h_sy,zt = ? cm' - Distância da armadura superior na direção yy até a camada central
h_sy,zb = ? cm' - Distância da armadura inferior na direção yy até a camada central
'<h4>Solicitações</h4>
N_x = ? kN/m' = força paralela ao eixo xx 
N_y = ? kN/m' = força paralela ao eixo yy
N_xy = ? kN/m' = força cortante
M_x = ? kN*m/m' = momento fletor em torno do eixo yy
M_y = ? kN*m/m' = momento fletor em torno do eixo xx
M_xy = ? kN*m/m' = momento torsor
V_x = ? kN/m
V_y = ? kN/m
#hide
ΔN_x,t = 0kN/m
ΔN_x,b = 0kN/m
ΔN_y,t = 0kN/m
ΔN_y,b = 0kN/m
#show
"Espessuras
a_zt = 0.2*h
a_zb = 0.2*h
#post
h_zt = h/2 - a_zt/2
h_zb = h/2 - a_zb/2
h_c = h - a_zt - a_zb
it = 0
#post
'<div class="fold">
"Resultados
#repeat
#val
'Iteração número: 'it = it + 1
#equ
"Esforços cortantes no núcleo
V_0 = sqrt(V_x^2 + V_y^2)
V_r = 0.25*f_ctd*h_c
#if V_0/V_r > 1
θ_N = 45°
Δn_x = (V_x^2)/(2*V_0)*cot(θ_N)
Δn_y = (V_y^2)/(2*V_0)*cot(θ_N)
Δn_xy = (V_x*V_y)/(2*V_0)*cot(θ_N)
#else
Δn_x = 0kN/m
Δn_y = 0kN/m
Δn_xy = 0kN/m
#end if
"Esforços de membrana
'Camada superior
N_x,zt = (N_x*h_zb - M_x)/(h_zt + h_zb) + ΔN_x,t + Δn_x
N_y,zt = (N_y*h_zb - M_y)/(h_zt + h_zb) + ΔN_y,t + Δn_y
N_xy,zt = (N_xy*h_zb - M_xy)/(h_zt + h_zb) + Δn_xy
N_c1,t = (N_x,zt + N_y,zt)/2 + sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
N_c2,t = (N_x,zt + N_y,zt)/2 - sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
'Camada inferior
N_x,zb = (N_x*h_zt + M_x)/(h_zt + h_zb) + ΔN_x,b + Δn_x
N_y,zb = (N_y*h_zt + M_y)/(h_zt + h_zb) + ΔN_y,b + Δn_y
N_xy,zb = (N_xy*h_zt + M_xy)/(h_zt + h_zb) + Δn_xy
N_c1,b = (N_x,zb + N_y,zb)/2 + sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
N_c2,b = (N_x,zb + N_y,zb)/2 - sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
"Casos de dimensionamento
#val
'<h4>Camada superior</h4>
#if ((N_x,zt + abs(N_xy,zt)) > 0kN/m)*((N_y,zt + abs(N_xy,zt)) > 0kN/m)
'Caso 'caso_t = 1
#else if ((N_x,zt + abs(N_xy,zt)) ≤ 0kN/m)*((N_y,zt + abs(N_xy,zt)) > 0kN/m)
'Caso 'caso_t = 2
#else if ((N_x,zt + abs(N_xy,zt)) > 0kN/m)*((N_y,zt + abs(N_xy,zt)) ≤ 0kN/m)
'Caso 'caso_t = 3
#else if ((N_x,zt + abs(N_xy,zt)) ≤ 0kN/m)*((N_y,zt + abs(N_xy,zt)) ≤ 0kN/m)
'Caso 'caso_t = 4
#end if
'<h4>Camada inferior</h4>
#if ((N_x,zb + abs(N_xy,zb)) > 0kN/m)*((N_y,zb + abs(N_xy,zb)) > 0kN/m)
'Caso 'caso_b = 1
#else if ((N_x,zb + abs(N_xy,zb)) ≤ 0kN/m)*((N_y,zb + abs(N_xy,zb)) > 0kN/m)
'Caso 'caso_b = 2
#else if ((N_x,zb + abs(N_xy,zb)) > 0kN/m)*((N_y,zb + abs(N_xy,zb)) ≤ 0kN/m)
'Caso 'caso_b = 3
#else if ((N_x,zb + abs(N_xy,zb)) ≤ 0kN/m)*((N_y,zb + abs(N_xy,zb)) ≤ 0kN/m)
'Caso 'caso_b = 4
#end if
#equ
"Esforços no centro da camada
'<h4>Camada superior</h4>
#if caso_t ≡ 1
θ_t = 45°
N_sx,t = N_x,zt + abs(N_xy,zt)
N_sy,t = N_y,zt + abs(N_xy,zt)
N_c,t = -2*abs(N_xy,zt)
#else if caso_t ≡ 2
θ_t = atan(-(N_x,zt/N_xy,zt))*°
N_sx,t = 0kN/m
N_sy,t = N_y,zt - (N_xy,zt^2)/N_x,zt
N_c,t = N_x,zt + (N_xy,zt^2)/N_x,zt
#else if caso_t ≡ 3
θ_t = atan(-N_xy,zt/N_y,zt)*°
N_sx,t = N_x,zt - (N_xy,zt^2)/N_y,zt
N_sy,t = 0kN/m
N_c,t = N_y,zt + (N_xy,zt^2)/N_y,zt
#else if caso_t ≡ 4
θ_t = 0°
N_c2,t = (N_x,zt + N_y,zt)/2 - sqrt(((N_x,zt - N_y,zt)/2)^2 + N_xy,zt^2)
N_c,t = N_c2,t
N_sx,t = 0kN/m
N_sy,t = 0kN/m
#end if
'<h4>Camada inferior</h4>
#if caso_b ≡ 1
θ_b = -45°
N_sx,b = N_x,zb + abs(N_xy,zb)
N_sy,b = N_y,zb + abs(N_xy,zb)
N_c,b = -2*abs(N_xy,zb)
#else if caso_b ≡ 2
θ_b = atan(-N_x,zb/N_xy,zb)*°
N_sx,b = 0kN/m
N_sy,b = N_y,zb - (N_xy,zb^2)/N_x,zb
N_c,b = N_x,zb + (N_xy,zb^2)/N_x,zb
#else if caso_b ≡ 3
θ_b = atan(-N_xy,zb/N_y,zb)*°
N_sx,b = N_x,zb - (N_xy,zb^2)/N_y,zb
N_sy,b = 0kN/m
N_c,b = N_y,zb + (N_xy,zb^2)/N_y,zb
#else if caso_b ≡ 4
θ_b = 0°
N_c2,b = (N_x,zb + N_y,zb)/2 - sqrt(((N_x,zb - N_y,zb)/2)^2 + N_xy,zb^2)
N_c,b = N_c2,b
N_sx,b = 0kN/m
N_sy,b = 0kN/m
#end if
"Esforços na posição da armadura
'Direção x
#if (N_sx,t > 0kN/m)*(N_sx,b > 0kN/m)
N_sx,t,shell = (N_sx,t*(h_sx,zb + h_zt) + N_sx,b*(h_sx,zb - h_zb))/(h_sx,zt + h_sx,zb)
N_sx,b,shell = N_sx,t + N_sx,b - N_sx,t,shell
N_sx,t = N_sx,t,shell
N_sx,b = N_sx,b,shell
#else if N_sx,t > 0kN/m
N_sx,t,shell = (N_sx,t*(h_zt + h_zb))/(h_zb + h_sx,zt)
ΔN_x,b = N_sx,t - N_sx,t,shell
N_sx,t = N_sx,t,shell
#else if N_sx,b > 0kN/m
N_sx,b,shell = (N_sx,b*(h_zt + h_zb))/(h_zt + h_sx,zb)
ΔN_x,t = N_sx,b - N_sx,b,shell
N_sx,b = N_sx,b,shell
#end if
'Direção y
#if (N_sy,t > 0kN/m)*(N_sy,b > 0kN/m)
N_sy,t,shell = (N_sy,t*(h_zt + h_sy,zb) + N_sy,b*(h_sy,zb - h_zb))/(h_sy,zt + h_sy,zb)
N_sy,b,shell = N_sy,t + N_sy,b - N_sy,t,shell
N_sy,t = N_sy,t,shell
N_sy,b = N_sy,b,shell
#else if N_sy,t > 0kN/m
N_sy,t,shell = (N_sy,t*(h_zt + h_zb))/(h_zb + h_sy,zt)
ΔN_y,b = N_sy,t - N_sy,t,shell
N_sy,t = N_sy,t,shell
#else if N_sy,b > 0kN/m
N_sy,b,shell = (N_sy,b*(h_zt + h_zb))/(h_zt + h_sy,zb)
ΔN_y,t = N_sy,b - N_sy,b,shell
N_sy,b = N_sy,b,shell
#end if
"Resistência do concreto
'<h4>Camada superior</h4>
#if caso_t ≡ 1
ε_1,t = 2*(ε_yi - 0.5*ε_cp)
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#else if caso_t ≡ 2
ε_1,t = (ε_yi - ε_cp*cos(θ_t)^2)/sin(θ_t)^2
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#else if caso_t ≡ 3
ε_1,t = (ε_yi - ε_cp*sin(θ_t)^2)/cos(θ_t)^2
#if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,t/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,t/ε_cp))
#end if
f_c,t = f_cd1*β
#else if caso_t ≡ 4
f_c,t = f_cd1
#end if
'<h4>Camada inferior</h4>
#if caso_b ≡ 1
ε_1,b = 2*(ε_yi - 0.5*ε_cp)
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#else if caso_b ≡ 2
ε_1,b = (ε_yi - ε_cp*cos(θ_b)^2)/sin(θ_b)^2
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#else if caso_b ≡ 3
ε_1,b = (ε_yi - ε_cp*sin(θ_b)^2)/cos(θ_b)^2
#if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) ≤ (0.6/0.85)
β = 0.6/0.85
#else if (1/(0.8 - 0.34*(ε_1,b/ε_cp))) > 1
β = 1
#else
β = 1/(0.8 - 0.34*(ε_1,b/ε_cp))
#end if
f_c,b = f_cd1*β
#else if caso_b ≡ 4
f_c,b = f_cd1
#end if
"Armaduras necessárias
A_sx,t = N_sx,t/f_yd|cm^2/m
A_sy,t = N_sy,t/f_yd|cm^2/m
A_sx,b = N_sx,b/f_yd|cm^2/m
A_sy,b = N_sy,b/f_yd|cm^2/m
"Correção das espessuras
a_zt,old = a_zt
a_zb,old = a_zb
a_zt = abs(N_c,t)/f_c,t|cm
a_zb = abs(N_c,b)/f_c,b|cm
h_zt = h/2 - a_zt/2
h_zb = h/2 - a_zb/2
h_c = h - a_zt - a_zb
#if (a_zt ≡ a_zt,old)*(a_zb ≡ a_zb,old)
#break
#else
#continue
#end if
#loop
'</div>
"Resultados Finais
'Número de iterações necessárias
#val
it
#equ
'<h4>Resultados da camada superior</h4>
#val
'Caso 'caso_t
#equ
a_zt
f_c,t
θ_t
'<h4>Resultados da camada inferior</h4>
#val
'Caso 'caso_b
#equ
a_zb
f_c,b
θ_b
'Armadura necessária na direção x
A_sx,t|cm^2/m
A_sx,b|cm^2/m
'Armadura mínima na direção x
#if A_sx,t ≡ 0cm^2/m
A_sx,t,min = 0cm^2/m
#else
A_sx,t,min = (0.15/100)*h|cm^2/m
#end if
#if A_sx,b ≡ 0cm^2/m
A_sx,b,min = 0cm^2/m
#else
A_sy,b,min = (0.15/100)*h|cm^2/m
#end if
'Armadura necessária na direção y
A_sy,t|cm^2/m
A_sy,b|cm^2/m
'Armadura mínima na direção y
#if A_sy,t ≡ 0cm^2/m
A_sy,t,min = 0cm^2/m
#else
A_sy,t,min = (0.15/100)*h|cm^2/m
#end if
#if A_sy,b ≡ 0cm^2/m
A_sy,b,min = 0cm^2/m
#else
A_sy,b,min = (0.15/100)*h|cm^2/m
#end if
"Verificação das camadas externas
#if (a_zt + a_zb) > h
'Peça reprovada
#else
'Aprovada
#end if
"Verificação da camadas interna
#if (a_zt + a_zb) > h
'Verificar camadas externas!
#else
#if V_0/V_r > 1
'É necessário armar ao cisalhamento!
#else
'Armadura transversal dispensada
#end if
#end if