Presently, only “ClaMat” and “ClaLam” classes have been modified in “extendedCLA.rb”.
Methods devoted to the printing of stiffness and compliance matrices, laminate engineering constants, etc., are added. The list of these functions include:
“write_ABBD” for the writing of laminate ABBD stiffness matrix.
“write_abbd_complMat” for the writing of laminate ABBD compliance matrix.
“write_G” for the writing of laminate out-of-plane shear stiffness matrix.
“write_g_complMat” for the writing of laminate out-of-plane shear compliance matrix.
“write_alfaEGh123”, “write_alfaEh2” and “write_alfaEh3”, for the writing of laminate CTE related quantities , , , and .
“write_alfa” for the writing of laminate CTE related vectors , , , , and respectively.
“write_alfaEGh123”, “write_alfaEh2” and “write_alfaEh3”, for the writing of laminate CTE related quantities , , , and .
“write_alfa” for the writing of laminate CTE related vectors , , , , and respectively.
“write_engineering” for the printing of laminate equivalent engineering constants.
Each of these diagnostic functions has two arguments: an ostream object corresponding to the File in which Results are printed, and a Real value corresponding to the angle with respect to the laminate axes for which the diagnostic is to be written. The following lines show the programming of “write_engineering” method:
class ClaLam
...
def write_engineering(os,theta=0.0)
constants=get_engineering(theta)
tab=["E_xx", "E_k0_xx", "E_f_xx",\
"E_yy", "E_k0_yy","E_f_yy",\
"G_xy", "G_k0_xy", "G_f_xy",\
"nu_xy", "nu_k0_xy", "nu_f_xy",\
"nu_yx", "nu_k0_yx", "nu_f_yx",\
"G_xz", "G_yz"]
counter=0
tab.each do |elem|
if (counter.modulo(3)==0) then
os.printf(" ")
end
str=format("%s = %11g",elem,constants[elem])
os.printf("%25s",str)
counter+=1
if (counter.modulo(3)==0||counter==tab.size) then
os.printf("\n")
end
end
end
...
end # class ClaLam
The programming of the other diagnostic methods is very similar to this one.
The following method writes the laminate load response at laminate level (i.e. no ply results):
def write_loadResponse(os,theta=0.0)
if (!isMechanicalLoadingDefined()) then
raise "No load response has been calculated."
end
if (isThermalLoadingDefined()) then
deltaT=getDeltaT
os.printf(" %14s%14g\n","deltaT",deltaT)
t0=getT0()
os.printf(" %14s%14g\n","T0",t0)
gradT=getGradT
os.printf(" %14s%14g\n\n","gradT",gradT)
end
if (isMoistureLoadingDefined()) then
deltaH=getDeltaH
os.printf(" %14s%14g\n","deltaH",deltaH)
h0=getH0
os.printf(" %14s%14g\n","H0",h0)
gradH=getGradH
os.printf(" %14s%14g\n\n","gradH",gradH)
end
os.printf(" %30s%14s%14s%14s\n","type","XX","YY","XY")
f=getNormalForces(theta)
m=getMoments(theta)
s=getNormalStrains(theta)
c=getCurvatures(theta)
os.printf(" %30s%14g%14g%14g\n","Normal Forces",f[0],f[1],f[2])
os.printf(" %30s%14g%14g%14g\n","Moments",m[0],m[1],m[2])
os.printf(" %30s%14g%14g%14g\n","Normal Strains",s[0],s[1],s[2])
os.printf(" %30s%14g%14g%14g\n","Curvatures",c[0],c[1],c[2])
f=getAverageInPlaneStresses(theta)
m=getFlexuralStresses(theta)
s=getAverageInPlaneStrains(theta)
c=getFlexuralStrains(theta)
os.printf(" %30s%14g%14g%14g\n","Average in-plane stresses",f[0],f[1],f[2])
os.printf(" %30s%14g%14g%14g\n","Flexural stresses",m[0],m[1],m[2])
os.printf(" %30s%14g%14g%14g\n","Average strains",s[0],s[1],s[2])
os.printf(" %30s%14g%14g%14g\n","Flexural in-plane strains",c[0],c[1],c[2])
os.printf("\n %30s%14s%14s\n","type","XZ","YZ")
q=getShearForces(theta)
g=getShearStrains(theta)
os.printf(" %30s%14g%14g\n","Shear Forces",q[0],q[1])
os.printf(" %30s%14g%14g\n","Shear Strains",q[0],q[1])
q=getAverageShearStresses(theta)
g=getAverageShearStrains(theta)
os.printf(" %30s%14g%14g\n","Average shear stresses",q[0],q[1])
os.printf(" %30s%14g%14g\n","Average shear strains",g[0],g[1])
end
Again, in this case, the method has two arguments. Indeed, the components of Laminate load response can be obtained in any direction. Note that this method gives sensible results, only if the “calcResponse” method has been called on the ClaLam object. This remark is valid for all the methods that return information related to a particular loading.
The method “write_PliesInPlaneStrainsAndStresses” has only one argument and writes plies in-plane stresses and strains:
def write_PliesInPlaneStrainsAndStresses(os)
if (!isMechanicalLoadingDefined()) then
raise "No load response has been calculated."
end
epsTab=getPliesStrains
sigTab=getPliesStresses
epsMechTab=getPliesMechanicalStrains
os.printf(" %8s%5s","layer","loc")
os.printf("%14s%14s%14s","eps_11","eps_22","gamma_12")
os.printf("%14s%14s%14s","sig_11","sig_22","sig_12")
os.printf("%14s%14s%14s","eps_mech_11","eps_mech_22","gamma_mech_12")
os.printf("\n")
(0...epsTab.size).each do |i|
os.printf(" %8d%5s",epsTab[i][0],epsTab[i][1])
os.printf("%14g%14g%14g",epsTab[i][2],epsTab[i][3],epsTab[i][7])
os.printf("%14g%14g%14g",sigTab[i][2],sigTab[i][3],sigTab[i][7])
os.printf("%14g%14g%14g",epsMechTab[i][2],epsMechTab[i][3],epsMechTab[i][7])
os.printf("\n")
end
end
Methods “write_PliesTemperatures” and “write_PliesMoistures” are also defined to write thermal and hygrometric laminate states at ply level. These methods are very similar to “write_PliesInPlaneStrainsAndStresses”.
Correspondingly, the ply failure indices and reserve factors can be calculated and written:
def write_crit(os,db,criteria,fos=1.0) if (!isMechanicalLoadingDefined()) then raise "No load response has been calculated." end if (db==nil) then sdRes=getDerived(criteria) fiRes=getFailureIndices(criteria) rfRes=getReserveFactors(criteria,fos) else sdRes=getDerived(db,criteria) fiRes=getFailureIndices(db,criteria) rfRes=getReserveFactors(db,criteria,fos) end ... end
This last method has several arguments:
“os” specifies where the results are written.
“db” is the ClaDb that is used to calculate failure indices and reserve factors. This argument may be necessary to retrieve plies material allowables and calculate the failure indices. If the argument is nil, then the laminate allowables are used to estimate failure indices.
“criteria” is an Array of strings corresponding to the criteria for which reserve factors and failure indices are requested.
“fos” is an optional argument corresponding to the factor of safety used in the calculation of reserve factors. Its default value is 1.
Note that all the methods added to the ClaLam class perform write operations only. Obviously, methods returning values can also be defined and will ultimately be more useful. But the examples above show that FeResPost is highly customizable and can be adapted to the needs of nearly any user. For example, it should be possible to interface it with graphical packages like ImageMagick or Gnuplot, or with spreadsheets like excel through the win32ole package. Using the Tcl/Tk, it should even be possible to create an interactive program with graphical interfaces.
Similarly, in “ClaMat” class, several printing methods have been defined. A list of these methods follows:
“write_Compliance”,
“write_InPlaneAlfaE”,
“write_InPlaneAlfa”,
“write_InPlaneBetaE”,
“write_InPlaneBeta”,
“write_InPlaneCompliance”,
“write_InPlaneStiffness”,
“write_OOPSAlfaG”,
“write_OOPSAlfa”,
“write_OOPSBetaG”,
“write_OOPSBeta”,
“write_OOPSCompliance”,
“write_OOPSStiffness”,
“write_Stiffness”.
Each of these methods has two arguments: an output stream object, and an optional angle . (Its default value is 0.)