CrossControl class

This class implements methods to control the analysis of continuous beams by the Cross process.

Contents

Author

Luiz Fernando Martha

History

@version 1.00

Initial version (1.00): September 2026

Initially prepared for version Cross01 application of course CIV 2801 - Fundamentos de Computação Gráfica, 2026, second term, Department of Civil Engineering, PUC-Rio.

Class definition

classdef CrossControl < handle

Public properties

    properties (Access = public)
        solver = []; % handle to Cross solver object
    end

Private properties

    properties (Access = private)
        app = []; % handle to GUI app object
    end

Constructor method

    methods
        %------------------------------------------------------------------
        function control = CrossControl(app)
            if (nargin > 0)
                control.app = app;
            end
        end
    end

Private methods

    methods (Access = private)
        %------------------------------------------------------------------
        % Reset Cross solver
        function resetSolver(control,nmemb,supinit,supend,decplc,EI,len,q)
            % Clean current Cross model if it exists
            if ~isempty(control.solver)
                control.solver.clean();
            end

            % Create new Cross solver model and initialize it
            if (nargin == 1)
                control.solver = CrossSolver();
            else
                control.solver = CrossSolver(nmemb,supinit,supend,decplc,EI,len,q);
            end
            control.solver.initStiffness();
            control.solver.initNodes();
            control.solver.initMoments();

            % Update init and end support icons
            control.app.updateSupInit(control.solver.supinit);
            control.app.updateSupEnd(control.solver.supend);

            % Print model data and initial bending moments
            control.solver.printModelInfo(1);
            control.solver.printResults(1);
        end
    end

Public methods

    methods
        %------------------------------------------------------------------
        % Start up Cross program. Create a Cross solver object with a
        % default continous beam model. Initialize Cross parameters and
        % beam spans with bending fixed-end moments. Print model
        % and initial results.
        function startup(control)
            % Create default Cross solver object
            control.resetSolver();
        end

        %------------------------------------------------------------------
        % Open file with continuous beam model for Cross process analysis.
        function openFile(control,filename)
            % Open file with given file name for reading
            fid = fopen(filename,'rt');

            % Read moment precision (number of decimal places)
            decplc = fscanf(fid,'%f',1);
            if decplc < 0 || decplc > 2
                decplc = 1;
            end

            % Read support boundary conditions
            bdrycnd = fscanf(fid,'%f',2);
            supinit = bdrycnd(1);
            supend = bdrycnd(2);

            % Read number of members and dimension arrays
            nmemb = fscanf(fid,'%f',1);
            EI = ones(1,nmemb) * 10000;
            len = zeros(1,nmemb);
            q = zeros(1,nmemb);

            % Read member lengths and uniform load
            for i = 1:nmemb
                membprop = fscanf(fid,'%f',2);
                len(i) = membprop(1);
                q(i) = membprop(2);
            end

            % Create Cross solver object with read data
            control.resetSolver(nmemb,supinit,supend,decplc,EI,len,q);

            % Close file
            fclose(fid);
        end

        %------------------------------------------------------------------
        % Save current continuous beam model for Cross process analysis in
        % a file
        function saveFile(control,filename)
            % Open file with given file name for writing
            fid = fopen(filename,'wt+');

            % Write moment precision (number of decimal places)
            fprintf(fid, '%d\n', control.solver.decplc);

            % Write support boundary conditions
            fprintf(fid, '%d  %d\n', control.solver.supinit, ...
                                     control.solver.supend);

            % Write number of members
            fprintf(fid, '%d\n', control.solver.nmemb);

            % Write member lengths and uniform load
            for i = 1:control.solver.nmemb
                fprintf(fid, '%d  %d\n', control.solver.membs(i).len, ...
                                         control.solver.membs(i).q);
            end

            % Close file
            fclose(fid);
        end

        %------------------------------------------------------------------
        % Restart continous beam Cross analysis.
        % Initialize Cross parameters and beam spans bending with
        % fixed-end moments. Print model and initial bending moment
        % results.
        function restart(control)
            control.solver.printModelInfo(1);
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 01 %%%%%%%
            control.solver.resetNodeRotations();
            control.solver.printResults(1);
        end

        %------------------------------------------------------------------
        % Solves one step of Cross Process for continuous beams: solve the
        % node with maximum absolute value of unbalanced moment.
        % Print bending moment resulta after step.
        function autoStep(control)
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 02 %%%%%%%
            control.solver.stepVector(...
                control.solver.numSteps).printStep(1,control.solver.decplc);
            control.solver.printResults(1);
        end

        %------------------------------------------------------------------
        % Processes direct solver of Cross Process for continuous beams.
        % Print final bending moment results.
        function goThru(control)
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 03 %%%%%%%
            control.solver.printResults(1);
        end

        %------------------------------------------------------------------
        % Set up number of decimal places for iterative Cross Process
        % of continuous beams.
        % Reprint current bending moment results.
        function setPrecision(control,decplc)
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 04 %%%%%%%
            control.solver.printResults(1);
        end

        %------------------------------------------------------------------
        % Toggle initial beam support condition and restart continous
        % beam Cross analysis.
        function toggleSupInit(control)
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 05 %%%%%%%
        end

        %------------------------------------------------------------------
        % Toggle end beam support condition and restart continous
        % beam Cross analysis.
        function toggleSupEnd(control)
%%%%%%% COMPLETE HERE - CROSS_CONTROL: 06 %%%%%%%
        end
    end
end