Save File Function
This is an auxiliary function of the LESM (Linear Elements Structure Model) program that writes all information about a structural model in a neutral-format file with the .lsm extension.
Contents
Function Code
function saveFile(drv,lsm) include_constants; fprintf(lsm, 'NEUTRAL-FORMAT FILE\n'); fprintf(lsm, 'This file stores all information about a structure model that can be read and\n'); fprintf(lsm, 'loaded by the LESM (Linear Elements Structure Model) program.\n'); fprintf(lsm, 'To modify the model, edit only the data below the %%TAGS\n\n'); %-------------------------------------------------------------------------- % Version header fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify version number: ''X.XX''\n'); fprintf(lsm, '%%HEADER.VERSION\n'); fprintf(lsm, '1.1'); fprintf(lsm, '\n\n'); %-------------------------------------------------------------------------- % Analysis header fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify analysis model type: ''TRUSS2D'', ''FRAME2D'', ''Grillage'', ''TRUSS3D'' OR ''FRAME3D''\n'); fprintf(lsm, '%%HEADER.ANALYSIS\n'); mdata = guidata(findobj('Tag','GUI_Main')); anm = get(mdata.popupmenu_Anm,'Value') - 1; if anm == TRUSS2D_ANALYSIS fprintf(lsm, '''TRUSS2D'''); elseif anm == FRAME2D_ANALYSIS fprintf(lsm, '''FRAME2D'''); elseif anm == GRILLAGE_ANALYSIS fprintf(lsm, '''GRILLAGE'''); elseif anm == TRUSS3D_ANALYSIS fprintf(lsm, '''TRUSS3D'''); elseif anm == FRAME3D_ANALYSIS fprintf(lsm, '''FRAME3D'''); end fprintf(lsm, '\n\n'); %-------------------------------------------------------------------------- % Nodal coordinates if drv.nnp > 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Provide nodal coordinates\n'); fprintf(lsm, 'First line: Total number of nodes\n'); fprintf(lsm, 'Following lines: Node ID, coord_X [m], coord_Y [m], coord_Z [m]\n'); fprintf(lsm, '%%NODE.COORD\n'); fprintf(lsm, '%d\n', drv.nnp); for n = 1:drv.nnp fprintf(lsm, '%d %d %d %d\n', n, drv.nodes(n).coord(1),... drv.nodes(n).coord(2),... drv.nodes(n).coord(3)); end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Support conditions if drv.nnp > 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify essential boundary conditions (support conditions)\n'); fprintf(lsm, 'First line: Total number of nodes\n'); fprintf(lsm, 'Following lines: Node ID, ebc_dX, ebc_dY, ebc_dZ, ebc_rX, ebc_rY, ebc_rZ\n'); fprintf(lsm, 'ebc = 0 --> Free degree-of-freedom\n'); fprintf(lsm, 'ebc = 1 --> Fixed degree-of-freedom\n'); fprintf(lsm, '%%NODE.SUPPORT\n'); fprintf(lsm, '%d\n', drv.nnp); for n = 1:drv.nnp fprintf(lsm, '%d %d %d %d %d %d %d\n', n,... drv.nodes(n).ebc(1), drv.nodes(n).ebc(2),... drv.nodes(n).ebc(3), drv.nodes(n).ebc(4),... drv.nodes(n).ebc(5), drv.nodes(n).ebc(6)); end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Material properties if drv.nmat > 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Provide materials\n'); fprintf(lsm, 'First line: Total number of materials\n'); fprintf(lsm, 'Following lines: Material ID, Elasticity [MPa], Poisson Ration, Thermal exp. coeff. [/oC]\n'); fprintf(lsm, '%%MATERIAL.ISOTROPIC\n'); fprintf(lsm, '%d\n', drv.nmat); for m = 1:drv.nmat fprintf(lsm, '%d %d %d %d\n', m,... 1e-3 * drv.materials(m).elasticity,... drv.materials(m).poisson,... drv.materials(m).thermExp); end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Cross-section properties if drv.nsec > 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Provide cross-sections\n'); fprintf(lsm, 'First line: Total number of cross-sections\n'); fprintf(lsm, 'Following lines: Cross-section ID, Area_x [cm2], Area_y [cm2], Area_z [cm2]\n'); fprintf(lsm, ' Inertia_x [cm4], Inertia_y [cm4], Inertia_z [cm4]\n'); fprintf(lsm, ' Height_y [cm], Height_z [cm]\n'); fprintf(lsm, '%%SECTION.PROPERTY\n'); fprintf(lsm, '%d\n', drv.nsec); for s = 1:drv.nsec fprintf(lsm, '%d %d %d %d %d %d %d %d %d\n', s,... 1e4*drv.sections(s).area_x,... 1e4*drv.sections(s).area_y,... 1e4*drv.sections(s).area_z,... 1e8*drv.sections(s).inertia_x,... 1e8*drv.sections(s).inertia_y,... 1e8*drv.sections(s).inertia_z,... 1e2*drv.sections(s).height_y,... 1e2*drv.sections(s).height_z); end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Beam end liberation fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Flag specification for different beam end liberation conditions\n'); fprintf(lsm, '1 - Continuous end / Continuous end\n'); fprintf(lsm, '2 - Hinged end / Continuous end\n'); fprintf(lsm, '3 - Continuous end / Hinged end\n'); fprintf(lsm, '4 - Hinged end / Hinged end\n'); fprintf(lsm, '%%BEAM.END.LIBERATION\n'); fprintf(lsm, '4\n'); fprintf(lsm, '1 1 1 1 1 1 1 1 1 1 1 1 1\n'); fprintf(lsm, '2 1 1 1 1 1 0 1 1 1 1 1 1\n'); fprintf(lsm, '3 1 1 1 1 1 1 1 1 1 1 1 0\n'); fprintf(lsm, '4 1 1 1 1 1 0 1 1 1 1 1 0\n'); fprintf(lsm, '\n'); %-------------------------------------------------------------------------- % Elements (Navier or Timoshenko) if drv.nel > 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Provide elements\n'); fprintf(lsm, 'First line: Total number of elements\n'); fprintf(lsm, 'Following lines: Element ID, Material ID, Cross-section ID, End lib. flag,\n'); fprintf(lsm, ' Init. Node ID, Final Node ID, vz_X, vz_Y, vz_Z\n'); if drv.elems(1).type == MEMBER_NAVIER fprintf(lsm, '%%ELEMENT.BEAM.NAVIER\n'); elseif drv.elems(1).type == MEMBER_TIMOSHENKO fprintf(lsm, '%%ELEMENT.BEAM.TIMOSHENKO\n'); end fprintf(lsm, '%d\n', drv.nel); for e = 1:drv.nel if (drv.elems(e).hingei == CONTINUOUS_END) && (drv.elems(e).hingef == CONTINUOUS_END) lib = 1; elseif (drv.elems(e).hingei == HINGED_END) && (drv.elems(e).hingef == CONTINUOUS_END) lib = 2; elseif (drv.elems(e).hingei == CONTINUOUS_END) && (drv.elems(e).hingef == HINGED_END) lib = 3; elseif (drv.elems(e).hingei == HINGED_END) && (drv.elems(e).hingef == HINGED_END) lib = 4; end fprintf(lsm, '%d %d %d %d %d %d %d %d %d\n', e,... drv.elems(e).material.id, drv.elems(e).section.id, lib,... drv.elems(e).nodes(1).id, drv.elems(e).nodes(2).id,... drv.elems(e).vz(1), drv.elems(e).vz(2), drv.elems(e).vz(3)); end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Nodal prescribed displacements nnpd = 0; for n = 1:drv.nnp if ~isempty(drv.nodes(n).prescDispl) nnpd = nnpd + 1; end end if nnpd ~= 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify nodal prescribed displacements\n'); fprintf(lsm, 'First line: Total number of nodes with prescribed displacement\n'); fprintf(lsm, 'Following lines: Node ID, dX [mm], dY [mm], dZ [mm], rX [rad], rY [rad], rZ [rad]\n'); fprintf(lsm, '%%LOAD.CASE.NODAL.DISPLACEMENT\n'); fprintf(lsm, '%d\n', nnpd); for n = 1:drv.nnp if ~isempty(drv.nodes(n).prescDispl) fprintf(lsm, '%d %d %d %d %d %d %d\n', n,... 1e3*drv.nodes(n).prescDispl(1), 1e3*drv.nodes(n).prescDispl(2),... 1e3*drv.nodes(n).prescDispl(3), drv.nodes(n).prescDispl(4),... drv.nodes(n).prescDispl(5), drv.nodes(n).prescDispl(6)); end end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Nodal loads nnnl = 0; for n = 1:drv.nnp if ~isempty(drv.nodes(n).nodalLoad) nnnl = nnnl + 1; end end if nnnl ~= 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify applied nodal loads\n'); fprintf(lsm, 'First line: Total number of nodes with applied load\n'); fprintf(lsm, 'Following lines: Node ID, fX [kN], fY [kN], fZ [kN], mX [kNm], mY [kNm], mZ [kNm]\n'); fprintf(lsm, '%%LOAD.CASE.NODAL.FORCE\n'); fprintf(lsm, '%d\n', nnnl); for n = 1:drv.nnp if ~isempty(drv.nodes(n).nodalLoad) fprintf(lsm, '%d %d %d %d %d %d %d\n', n,... drv.nodes(n).nodalLoad(1), drv.nodes(n).nodalLoad(2),... drv.nodes(n).nodalLoad(3), drv.nodes(n).nodalLoad(4),... drv.nodes(n).nodalLoad(5), drv.nodes(n).nodalLoad(6)); end end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Element uniformly distributed loads neul = 0; for e = 1:drv.nel if ~isempty(drv.elems(e).load.uniformGbl) neul = neul + 1; end end if neul ~= 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify element uniformly distributed loads\n'); fprintf(lsm, 'First line: Total number of elements with uniformly distributed load\n'); fprintf(lsm, 'Following pair of lines:\n'); fprintf(lsm, ' Element ID, Load direction (0->Global, 1->Local)\n'); fprintf(lsm, ' Qx [kN/m], Qy [kN/m], Qz [kN/m]\n'); fprintf(lsm, '%%LOAD.CASE.BEAM.UNIFORM\n'); fprintf(lsm, '%d\n', neul); for e = 1:drv.nel if ~isempty(drv.elems(e).load.uniformGbl) fprintf(lsm, '%d %d\n', e, drv.elems(e).load.uniformDir); if drv.elems(e).load.uniformDir == GLOBAL_LOAD fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.uniformGbl(1),... drv.elems(e).load.uniformGbl(2),... drv.elems(e).load.uniformGbl(3)); elseif drv.elems(e).load.uniformDir == LOCAL_LOAD fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.uniformLcl(1),... drv.elems(e).load.uniformLcl(2),... drv.elems(e).load.uniformLcl(3)); end end end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Element linearly distributed loads nell = 0; for e = 1:drv.nel if ~isempty(drv.elems(e).load.linearGbl) nell = nell + 1; end end if nell ~= 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify element linearly distributed loads\n'); fprintf(lsm, 'First line: Total number of elements with linearly distributed load\n'); fprintf(lsm, 'Following triple of lines:\n'); fprintf(lsm, ' Element ID, Load direction (0->Global, 1->Local)\n'); fprintf(lsm, ' Qx_init [kN/m], Qy_init [kN/m], Qz_init [kN/m]\n'); fprintf(lsm, ' Qx_final [kN/m], Qy_final [kN/m], Qz_final [kN/m]\n'); fprintf(lsm, '%%LOAD.CASE.BEAM.LINEAR\n'); fprintf(lsm, '%d\n', nell); for e = 1:drv.nel if ~isempty(drv.elems(e).load.linearGbl) fprintf(lsm, '%d %d\n', e, drv.elems(e).load.linearDir); if drv.elems(e).load.linearDir == GLOBAL_LOAD fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.linearGbl(1),... drv.elems(e).load.linearGbl(2),... drv.elems(e).load.linearGbl(3)); fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.linearGbl(4),... drv.elems(e).load.linearGbl(5),... drv.elems(e).load.linearGbl(6)); elseif drv.elems(e).load.linearDir == LOCAL_LOAD fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.linearLcl(1),... drv.elems(e).load.linearLcl(2),... drv.elems(e).load.linearLcl(3)); fprintf(lsm, '%d %d %d\n',... drv.elems(e).load.linearLcl(4),... drv.elems(e).load.linearLcl(5),... drv.elems(e).load.linearLcl(6)); end end end fprintf(lsm, '\n'); end %-------------------------------------------------------------------------- % Element temperature variations netv = 0; for e = 1:drv.nel dtx = drv.elems(e).load.tempVar_X; dty = drv.elems(e).load.tempVar_Y; dtz = drv.elems(e).load.tempVar_Z; if (dtx ~= 0) || (dty ~= 0) || (dtz ~= 0) netv = netv + 1; end end if netv ~= 0 fprintf(lsm, '-----------------------------------------------------------------------\n'); fprintf(lsm, 'Specify element thermal loads\n'); fprintf(lsm, 'First line: Total number of elements with thermal load\n'); fprintf(lsm, 'Following lines: Element ID, dt_x [oC], dt_y [oC], dt_z [oC]\n'); fprintf(lsm, 'dt_x --> element temperature variation on its center of gravity axis\n'); fprintf(lsm, 'dt_y, dt_z --> element temperature gradient relative to local axes Y and Z\n'); fprintf(lsm, ' (bottomFaceTempVar - topFaceTempVar)\n'); fprintf(lsm, '%%LOAD.CASE.BEAM.TEMPERATURE\n'); fprintf(lsm, '%d\n', netv); for e = 1:drv.nel dtx = drv.elems(e).load.tempVar_X; dty = drv.elems(e).load.tempVar_Y; dtz = drv.elems(e).load.tempVar_Z; if (dtx ~= 0) || (dty ~= 0) || (dtz ~= 0) fprintf(lsm, '%d %d %d %d\n', e, dtx, dty, dtz); end end fprintf(lsm, '\n'); end fprintf(lsm, '%%END'); end