Mesh: tradeoff: Difference between revisions

From BanghamLab
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[GFtbox Tutorial pages#Hints and Tips|Return to GFtbox hints and tips]]<br><br>
[[GFtbox Tutorial pages#Hints and Tips|Return to GFtbox hints and tips]]<br><br>
==Subdividing the mesh to ensure sufficient resolution to compute curves properly==
{| border=" " cellpadding="5" cellspacing="5"
{| border=" " cellpadding="5" cellspacing="5"
|- valign="top"
|- valign="top"
Line 11: Line 12:
|width="200px"|[[File:GPT_DemoSubdivision_20121116-000040-0002.png|200px|GFtbox interface]]As for the previous example, but there has been no subdivision and the curves are unacceptably incomplete and jagged. There should '''always be enough elements to permit curves to develop smoothly'''.
|width="200px"|[[File:GPT_DemoSubdivision_20121116-000040-0002.png|200px|GFtbox interface]]As for the previous example, but there has been no subdivision and the curves are unacceptably incomplete and jagged. There should '''always be enough elements to permit curves to develop smoothly'''.
|}
|}
=Interaction function illustrating operations on the mesh=
===Tutorial===
Run the project ([http://cmpdartsvr1.cmp.uea.ac.uk/downloads/software/GPT_DemoSubdivision_20121116.zip <span style="color: Navy">example project </span>])for 40 steps to see the effect of:
Run the project ([http://cmpdartsvr1.cmp.uea.ac.uk/downloads/software/GPT_DemoSubdivision_20121116.zip <span style="color: Navy">example project </span>])for 40 steps to see the effect of:
#subdivision  
#subdivision  
Line 20: Line 21:
by setting index to 1. With too few elements, bends are jagged.
by setting index to 1. With too few elements, bends are jagged.
<br><br>
<br><br>
The interaction function is shown below.
<span style="color: CornflowerBlue"></span>
function m = gpt_demosubdivision_20121116( m )
<span style="color: Green">%m = gpt_demosubdivision_20121116( m )</span>
<span style="color: Green">%  Morphogen interaction function.</span>
<span style="color: Green">%  Written at 2012-11-16 12:30:06.</span>
<span style="color: Green">%  GFtbox revision 4351, .</span>
<span style="color: Green">% The user may edit any part of this function between delimiters</span>
<span style="color: Green">% of the form "USER CODE..." and "END OF USER CODE...".  The</span>
<span style="color: Green">% delimiters themselves must not be moved, edited, deleted, or added.</span>
    if isempty(m), return; end
    fprintf( 1, '<span style="color: Green">%s found in %s\n', mfilename(), which(mfilename()) );</span>
    try
        m = local_setproperties( m );
    catch
    end
    realtime = m.globalDynamicProps.currenttime;
<span style="color: CornflowerBlue"></span>
<span style="color: Green">%%% USER CODE: INITIALISATION</span>
<span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
    if (Steps(m)==0) && m.globalDynamicProps.doinit <span style="color: Green">% First iteration</span>
        <span style="color: Green">% Zero out a lot of stuff to create a blank slate.  </span>
        <span style="color: Green">% If no morphogens are set in the GUI it may be useful to</span>
        <span style="color: Green">% zero some arrays by uncommenting the following.</span>
        <span style="color: Green">% m.morphogens(:) = 0;</span>
        <span style="color: Green">% m.morphogenclamp(:) = 0;</span>
        <span style="color: Green">% m.mgen_production(:) = 0;</span>
        <span style="color: Green">% m.mgen_absorption(:) = 0;</span>
        <span style="color: Green">% m.seams(:) = false;</span>
        <span style="color: Green">% m.mgen_dilution(:) = false;</span>
        <span style="color: Green">% Set up names for variant models.  Useful for running multiple models on a cluster.</span>
        m.userdata.ranges.modelname.range = { 'NOSUBDIVISION', 'WITHSUBDIVISION' };  <span style="color: Green">% CLUSTER</span>
        m.userdata.ranges.modelname.index = 1;                      <span style="color: Green">% CLUSTER</span>
    end
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  <span style="color: Green">% CLUSTER</span>
   
    disp(sprintf('\nRunning <span style="color: Green">%s model %s\n',mfilename, modelname));    </span>
    <span style="color: Green">% to plot polariser on the A side and resultant areal growth rate on the B side:</span>
    m = leaf_plotoptions( m, 'morphogenA', 'KAPAR', 'morphogenB', 'KBPAR' );
<span style="color: Green">%%% END OF USER CODE: INITIALISATION</span>
<span style="color: CornflowerBlue"></span>
<span style="color: Green">%%% SECTION 1: ACCESSING MORPHOGENS AND TIME.</span>
<span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
    if isempty(m), return; end
    setGlobals();
    global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
    global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
    dt = m.globalProps.timestep;
    polariser_i = gNEW_POLARISER;
    P = m.morphogens(:,polariser_i);
    [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
    [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
    [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
    [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
    [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
    [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
    [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
    [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
    [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );
    [id_subdivide_i,id_subdivide_p,id_subdivide_a,id_subdivide_l] = getMgenLevels( m, 'ID_SUBDIVIDE' );
<span style="color: Green">% Mesh type: rectangle</span>
<span style="color: Green">%            base: 0</span>
<span style="color: Green">%          centre: 0</span>
<span style="color: Green">%      randomness: 0.1</span>
<span style="color: Green">%        version: 1</span>
<span style="color: Green">%          xdivs: 16</span>
<span style="color: Green">%          xwidth: 16</span>
<span style="color: Green">%          ydivs: 8</span>
<span style="color: Green">%          ywidth: 8</span>
<span style="color: Green">%            Morphogen    Diffusion  Decay  Dilution  Mutant</span>
<span style="color: Green">%            --------------------------------------------------</span>
<span style="color: Green">%                KAPAR        ----    ----      ----    ----</span>
<span style="color: Green">%                KAPER        ----    ----      ----    ----</span>
<span style="color: Green">%                KBPAR        ----    ----      ----    ----</span>
<span style="color: Green">%                KBPER        ----    ----      ----    ----</span>
<span style="color: Green">%                KNOR        ----    ----      ----    ----</span>
<span style="color: Green">%            POLARISER        ----    ----      ----    ----</span>
<span style="color: Green">%            STRAINRET        ----    ----      ----    ----</span>
<span style="color: Green">%              ARREST        ----    ----      ----    ----</span>
<span style="color: Green">%                ID_A        ----    ----      ----    ----</span>
<span style="color: Green">%                ID_B        ----    ----      ----    ----</span>
<span style="color: Green">%        ID_SUBDIVIDE        ----    ----      ----    ----</span>
<span style="color: Green">%%% USER CODE: MORPHOGEN INTERACTIONS</span>
<span style="color: Green">% In this section you may modify the mesh in any way that does not</span>
<span style="color: CornflowerBlue"></span>
<span style="color: Green">% alter the set of nodes.</span>
    if (Steps(m)==0) && m.globalDynamicProps.doinit  <span style="color: Green">% Initialisation code.</span>
        <span style="color: Green">% Put any code here that should only be performed at the start of</span>
        <span style="color: Green">% the simulation, for example, to set up initial morphogen values.</span>
        id_a_p((m.nodes(:,1)>0)&(m.nodes(:,1)<=2))=1;
        id_b_p((m.nodes(:,1)>-2)&(m.nodes(:,1)<=0))=1;
        id_subdivide_p((m.nodes(:,1)>=-2)&(m.nodes(:,1)<=2))=1;
        P=m.nodes(:,1);
    end
    if realtime<=1
        kapar_p(:) = 0;
        kaper_p(:) = 0;
        kbpar_p(:) = 0;
        kbper_p(:) = 0;
        knor_p(:)  = 0;
    else
        kapar_p(:) = 0.05*id_a_p;
        kaper_p(:) = 0;
        kbpar_p(:) = 0.05*id_b_p;
        kbper_p(:) = 0;
        knor_p(:)  = 0;
    end
<span style="color: CornflowerBlue"></span>
<span style="color: Green">%%% END OF USER CODE: MORPHOGEN INTERACTIONS</span>
<span style="color: Green">%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE</span>
<span style="color: Green">%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.</span>
    m.morphogens(:,polariser_i) = P;
    m.morphogens(:,kapar_i) = kapar_p;
    m.morphogens(:,kaper_i) = kaper_p;
    m.morphogens(:,kbpar_i) = kbpar_p;
    m.morphogens(:,kbper_i) = kbper_p;
    m.morphogens(:,knor_i) = knor_p;
    m.morphogens(:,strainret_i) = strainret_p;
    m.morphogens(:,arrest_i) = arrest_p;
    m.morphogens(:,id_a_i) = id_a_p;
    m.morphogens(:,id_b_i) = id_b_p;
    m.morphogens(:,id_subdivide_i) = id_subdivide_p;
<span style="color: Green">%%% USER CODE: FINALISATION</span>
<span style="color: Green">% In this section you may modify the mesh in any way whatsoever.</span>
    switch modelname
        case 'NOSUBDIVISION'
            <span style="color: Red">% do nothing</span>
        case 'WITHSUBDIVISION'
            <span style="color: Red">% subdivide on the first step</span>
            if realtime>0 && realtime<=0+dt
                m = leaf_subdivide( m, 'morphogen','id_subdivide',...
                    'min',0.5,'max',1,...
                    'mode','mid','levels','all');
            end
            if realtime>0 && realtime<=0+dt
                m = leaf_subdivide( m, 'morphogen','id_subdivide',...
                    'min',0.5,'max',1,...
                    'mode','mid','levels','all');
            end
        otherwise
            <span style="color: Green">% If this happens, maybe you forgot a model.</span>
    end
<span style="color: Green">%%% END OF USER CODE: FINALISATION</span>
end
<span style="color: Green">%%% USER CODE: SUBFUNCTIONS</span>
<span style="color: CornflowerBlue"></span>
function m = local_setproperties( m )
<span style="color: Green">% This function is called at time zero in the INITIALISATION section of the</span>
<span style="color: Green">% interaction function.  It provides commands to set each of the properties</span>
<span style="color: Green">% that are contained in m.globalProps.  Uncomment whichever ones you would</span>
<span style="color: Green">% like to set yourself, and put in whatever value you want.</span>
<span style="color: Green">%</span>
<span style="color: Green">% Some of these properties are for internal use only and should never be</span>
<span style="color: Green">% set by the user.  At some point these will be moved into a different</span>
<span style="color: Green">% component of m, but for the present, just don't change anything unless</span>
<span style="color: Green">% you know what it is you're changing.</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'trinodesvalid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'prismnodesvalid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessRelative', 1.600000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thicknessMode', 'physical' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'displayedMulti', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowNegativeGrowth', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'resetRand', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mingradient', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'relativepolgrad', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usefrozengradient', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'userpolarisation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thresholdsq', 4.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'splitmargin', 1.400000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'splitmorphogen', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'unitbulkmodulus', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'starttime', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'timestep', 0.010000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'timeunitname', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'distunitname', 'mm' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'scalebarvalue', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'validateMesh', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'rectifyverticals', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitLongFEM', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'longSplitThresholdPower', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBentFEM', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowSplitBio', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowFlipEdges', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowElideEdges', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mincellangle', 0.200000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'alwaysFlat', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flattenforceconvex', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flatten', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flattenratio', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'useGrowthTensors', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'plasticGrowth', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'totalinternalrotation', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stepinternalrotation', 2.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'showinternalrotation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'performinternalrotation', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'internallyrotated', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxFEcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'inittotalcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApresplitproc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApostsplitproc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxBioAcells', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colors', (6 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colorvariation', 0.050000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'colorparams', (12 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'biocolormode', 'auto' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'freezing', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'canceldrift', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interaction', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mgen_interactionName', 'gpt_demosubdivision_20121116' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowInteraction', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'interactionValid', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'gaussInfo', (unknown type ''struct'') );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stitchDFs', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'D', (36 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'C', (36 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'G', (6 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solver', 'cgs' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solverprecision', 'double' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerance', 0.001000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'solvertolerancemethod', 'max' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'diffusiontolerance', 0.000010 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowsparse', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxIters', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'maxsolvetime', 1000.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'cgiters', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'simsteps', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'stepsperrender', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'growthEnabled', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'diffusionEnabled', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'flashmovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'makemovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'moviefile', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'codec', 'None' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'autonamemovie', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'overwritemovie', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'framesize', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'mov', [] );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'boingNeeded', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'initialArea', 128.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bendunitlength', 11.313708 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'targetRelArea', 1.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultinterp', 'min' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'readonly', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'projectdir', 'D:\ab\Matlab stuff\Growth models' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelname', 'GPT_DemoSubdivision_20121116' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'allowsave', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'addedToPath', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bendsplit', 0.300000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'usepolfreezebc', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'dorsaltop', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultazimuth', -45.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultelevation', 33.750000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultroll', 0.000000 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'defaultViewParams', (unknown type ''struct'') );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'comment', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'legendTemplate', '%T: %q\n%m' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioAsplitcells', true );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioApullin', 0.142857 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'bioAfakepull', 0.202073 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'interactive', false );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'coderevision', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'coderevisiondate', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelrevision', 0 );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'modelrevisiondate', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'savedrunname', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'savedrundesc', '' );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'vxgrad', (108 values) );</span>
<span style="color: Green">%    m = leaf_setproperty( m, 'lengthscale', 16.000000 );</span>
end
<span style="color: CornflowerBlue"></span>
<span style="color: Green">% Here you may write any functions of your own, that you want to call from</span>
<span style="color: Green">% the interaction function, but never need to call from outside it.</span>
<span style="color: Green">% Remember that they do not have access to any variables except those</span>
<span style="color: Green">% that you pass as parameters, and cannot change anything except by</span>
<span style="color: Green">% returning new values as results.</span>
<span style="color: Green">% Whichever section they are called from, they must respect the same</span>
<span style="color: Green">% restrictions on what modifications they are allowed to make to the mesh.</span>
<span style="color: Green">% For example:</span>
<span style="color: CornflowerBlue"></span>
<span style="color: Green">% function m = do_something( m )</span>
<span style="color: Green">%  % Change m in some way.</span>
<span style="color: Green">% end</span>
<span style="color: Green">% Call it from the main body of the interaction function like this:</span>
<span style="color: Green">%      m = do_something( m );</span>

Revision as of 14:22, 16 November 2012

Return to GFtbox hints and tips

Subdividing the mesh to ensure sufficient resolution to compute curves properly

GFtbox interfaceSimple mesh of 382 elements equally spaced vertices. Superimposed are the polarity arrows (pointing bottom left) and purple and blue factors that control local growth rates. GFtbox interfaceAfter one step in which the central region is subdivided twice (the vertices are too dense to see). GFtbox interfaceAs for the previous example but the size of the triangles forming the mesh is only visible along the edge. Red marks regions of increased growth on the top and bottom surfaces.
GFtbox interfaceAfter growing for 40 steps the excess growth has bent the canvas into an 'S' shape. Note the smooth bend is associated with about 4 elements. GFtbox interfaceAs for the previous example, but there has been no subdivision and the curves are unacceptably incomplete and jagged. There should always be enough elements to permit curves to develop smoothly.

Tutorial

Run the project (example project )for 40 steps to see the effect of:

  1. subdivision

Then change the modelname to 'NOSUBDIVISION', i.e. make a change to the interaction function

       % Set up names for variant models.  Useful for running multiple models on a cluster.
       m.userdata.ranges.modelname.range = { 'NOSUBDIVISION', 'WITHSUBDIVISION' };  % CLUSTER
       m.userdata.ranges.modelname.index = 2;                       % CLUSTER

by setting index to 1. With too few elements, bends are jagged.

The interaction function is shown below.


function m = gpt_demosubdivision_20121116( m )
%m = gpt_demosubdivision_20121116( m )
%   Morphogen interaction function.
%   Written at 2012-11-16 12:30:06.
%   GFtbox revision 4351, .

% The user may edit any part of this function between delimiters
% of the form "USER CODE..." and "END OF USER CODE...".  The
% delimiters themselves must not be moved, edited, deleted, or added.

    if isempty(m), return; end

    fprintf( 1, '%s found in %s\n', mfilename(), which(mfilename()) );

    try
        m = local_setproperties( m );
    catch
    end

    realtime = m.globalDynamicProps.currenttime;


%%% USER CODE: INITIALISATION

% In this section you may modify the mesh in any way whatsoever.
    if (Steps(m)==0) && m.globalDynamicProps.doinit % First iteration
        % Zero out a lot of stuff to create a blank slate.  
        % If no morphogens are set in the GUI it may be useful to
        % zero some arrays by uncommenting the following.
        % m.morphogens(:) = 0;
        % m.morphogenclamp(:) = 0;
        % m.mgen_production(:) = 0;
        % m.mgen_absorption(:) = 0;
        % m.seams(:) = false;
        % m.mgen_dilution(:) = false;

        % Set up names for variant models.  Useful for running multiple models on a cluster.
        m.userdata.ranges.modelname.range = { 'NOSUBDIVISION', 'WITHSUBDIVISION' };  % CLUSTER
        m.userdata.ranges.modelname.index = 1;                       % CLUSTER
    end
    modelname = m.userdata.ranges.modelname.range{m.userdata.ranges.modelname.index};  % CLUSTER
    
    disp(sprintf('\nRunning %s model %s\n',mfilename, modelname));    	
    % to plot polariser on the A side and resultant areal growth rate on the B side:
    m = leaf_plotoptions( m, 'morphogenA', 'KAPAR', 'morphogenB', 'KBPAR' ); 
%%% END OF USER CODE: INITIALISATION


%%% SECTION 1: ACCESSING MORPHOGENS AND TIME.
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.

    if isempty(m), return; end

    setGlobals();
    global gNEW_KA_PAR gNEW_KA_PER gNEW_KB_PAR gNEW_KB_PER
    global gNEW_K_NOR gNEW_POLARISER gNEW_STRAINRET gNEW_ARREST
    dt = m.globalProps.timestep;
    polariser_i = gNEW_POLARISER;
    P = m.morphogens(:,polariser_i);
    [kapar_i,kapar_p,kapar_a,kapar_l] = getMgenLevels( m, 'KAPAR' );
    [kaper_i,kaper_p,kaper_a,kaper_l] = getMgenLevels( m, 'KAPER' );
    [kbpar_i,kbpar_p,kbpar_a,kbpar_l] = getMgenLevels( m, 'KBPAR' );
    [kbper_i,kbper_p,kbper_a,kbper_l] = getMgenLevels( m, 'KBPER' );
    [knor_i,knor_p,knor_a,knor_l] = getMgenLevels( m, 'KNOR' );
    [strainret_i,strainret_p,strainret_a,strainret_l] = getMgenLevels( m, 'STRAINRET' );
    [arrest_i,arrest_p,arrest_a,arrest_l] = getMgenLevels( m, 'ARREST' );
    [id_a_i,id_a_p,id_a_a,id_a_l] = getMgenLevels( m, 'ID_A' );
    [id_b_i,id_b_p,id_b_a,id_b_l] = getMgenLevels( m, 'ID_B' );
    [id_subdivide_i,id_subdivide_p,id_subdivide_a,id_subdivide_l] = getMgenLevels( m, 'ID_SUBDIVIDE' );

% Mesh type: rectangle
%            base: 0
%          centre: 0
%      randomness: 0.1
%         version: 1
%           xdivs: 16
%          xwidth: 16
%           ydivs: 8
%          ywidth: 8

%            Morphogen    Diffusion   Decay   Dilution   Mutant
%            --------------------------------------------------
%                KAPAR         ----    ----       ----     ----
%                KAPER         ----    ----       ----     ----
%                KBPAR         ----    ----       ----     ----
%                KBPER         ----    ----       ----     ----
%                 KNOR         ----    ----       ----     ----
%            POLARISER         ----    ----       ----     ----
%            STRAINRET         ----    ----       ----     ----
%               ARREST         ----    ----       ----     ----
%                 ID_A         ----    ----       ----     ----
%                 ID_B         ----    ----       ----     ----
%         ID_SUBDIVIDE         ----    ----       ----     ----


%%% USER CODE: MORPHOGEN INTERACTIONS

% In this section you may modify the mesh in any way that does not

% alter the set of nodes.

    if (Steps(m)==0) && m.globalDynamicProps.doinit  % Initialisation code.
        % Put any code here that should only be performed at the start of
        % the simulation, for example, to set up initial morphogen values.
        id_a_p((m.nodes(:,1)>0)&(m.nodes(:,1)<=2))=1;
        id_b_p((m.nodes(:,1)>-2)&(m.nodes(:,1)<=0))=1;
        id_subdivide_p((m.nodes(:,1)>=-2)&(m.nodes(:,1)<=2))=1;
        P=m.nodes(:,1);
    end
    if realtime<=1
        kapar_p(:) = 0;
        kaper_p(:) = 0;
        kbpar_p(:) = 0;
        kbper_p(:) = 0;
        knor_p(:)  = 0;
    else
        kapar_p(:) = 0.05*id_a_p;
        kaper_p(:) = 0;
        kbpar_p(:) = 0.05*id_b_p;
        kbper_p(:) = 0;
        knor_p(:)  = 0;
    end

%%% END OF USER CODE: MORPHOGEN INTERACTIONS

%%% SECTION 3: INSTALLING MODIFIED VALUES BACK INTO MESH STRUCTURE
%%% AUTOMATICALLY GENERATED CODE: DO NOT EDIT.
    m.morphogens(:,polariser_i) = P;
    m.morphogens(:,kapar_i) = kapar_p;
    m.morphogens(:,kaper_i) = kaper_p;
    m.morphogens(:,kbpar_i) = kbpar_p;
    m.morphogens(:,kbper_i) = kbper_p;
    m.morphogens(:,knor_i) = knor_p;
    m.morphogens(:,strainret_i) = strainret_p;
    m.morphogens(:,arrest_i) = arrest_p;
    m.morphogens(:,id_a_i) = id_a_p;
    m.morphogens(:,id_b_i) = id_b_p;
    m.morphogens(:,id_subdivide_i) = id_subdivide_p;

%%% USER CODE: FINALISATION

% In this section you may modify the mesh in any way whatsoever.
    switch modelname
        case 'NOSUBDIVISION' 
            % do nothing
        case 'WITHSUBDIVISION' 
            % subdivide on the first step
            if realtime>0 && realtime<=0+dt
                m = leaf_subdivide( m, 'morphogen','id_subdivide',...
                    'min',0.5,'max',1,...
                    'mode','mid','levels','all');
            end
            if realtime>0 && realtime<=0+dt
                m = leaf_subdivide( m, 'morphogen','id_subdivide',...
                    'min',0.5,'max',1,...
                    'mode','mid','levels','all');
            end
        otherwise
            % If this happens, maybe you forgot a model.
    end


%%% END OF USER CODE: FINALISATION

end


%%% USER CODE: SUBFUNCTIONS


function m = local_setproperties( m )
% This function is called at time zero in the INITIALISATION section of the
% interaction function.  It provides commands to set each of the properties
% that are contained in m.globalProps.  Uncomment whichever ones you would
% like to set yourself, and put in whatever value you want.
%
% Some of these properties are for internal use only and should never be
% set by the user.  At some point these will be moved into a different
% component of m, but for the present, just don't change anything unless
% you know what it is you're changing.

%    m = leaf_setproperty( m, 'trinodesvalid', true );
%    m = leaf_setproperty( m, 'prismnodesvalid', true );
%    m = leaf_setproperty( m, 'thicknessRelative', 1.600000 );
%    m = leaf_setproperty( m, 'thicknessArea', 0.000000 );
%    m = leaf_setproperty( m, 'thicknessMode', 'physical' );
%    m = leaf_setproperty( m, 'activeGrowth', 1.000000 );
%    m = leaf_setproperty( m, 'displayedGrowth', 1.000000 );
%    m = leaf_setproperty( m, 'displayedMulti', [] );
%    m = leaf_setproperty( m, 'allowNegativeGrowth', true );
%    m = leaf_setproperty( m, 'usePrevDispAsEstimate', true );
%    m = leaf_setproperty( m, 'perturbInitGrowthEstimate', 0.000010 );
%    m = leaf_setproperty( m, 'perturbRelGrowthEstimate', 0.010000 );
%    m = leaf_setproperty( m, 'perturbDiffusionEstimate', 0.000100 );
%    m = leaf_setproperty( m, 'resetRand', false );
%    m = leaf_setproperty( m, 'mingradient', 0.000000 );
%    m = leaf_setproperty( m, 'relativepolgrad', false );
%    m = leaf_setproperty( m, 'usefrozengradient', true );
%    m = leaf_setproperty( m, 'userpolarisation', false );
%    m = leaf_setproperty( m, 'thresholdsq', 4.000000 );
%    m = leaf_setproperty( m, 'splitmargin', 1.400000 );
%    m = leaf_setproperty( m, 'splitmorphogen',  );
%    m = leaf_setproperty( m, 'thresholdmgen', 0.500000 );
%    m = leaf_setproperty( m, 'bulkmodulus', 1.000000 );
%    m = leaf_setproperty( m, 'unitbulkmodulus', true );
%    m = leaf_setproperty( m, 'poissonsRatio', 0.300000 );
%    m = leaf_setproperty( m, 'starttime', 0.000000 );
%    m = leaf_setproperty( m, 'timestep', 0.010000 );
%    m = leaf_setproperty( m, 'timeunitname',  );
%    m = leaf_setproperty( m, 'distunitname', 'mm' );
%    m = leaf_setproperty( m, 'scalebarvalue', 0.000000 );
%    m = leaf_setproperty( m, 'validateMesh', true );
%    m = leaf_setproperty( m, 'rectifyverticals', false );
%    m = leaf_setproperty( m, 'allowSplitLongFEM', true );
%    m = leaf_setproperty( m, 'longSplitThresholdPower', 0.000000 );
%    m = leaf_setproperty( m, 'allowSplitBentFEM', false );
%    m = leaf_setproperty( m, 'allowSplitBio', true );
%    m = leaf_setproperty( m, 'allowFlipEdges', false );
%    m = leaf_setproperty( m, 'allowElideEdges', true );
%    m = leaf_setproperty( m, 'mincellangle', 0.200000 );
%    m = leaf_setproperty( m, 'alwaysFlat', 0.000000 );
%    m = leaf_setproperty( m, 'flattenforceconvex', true );
%    m = leaf_setproperty( m, 'flatten', false );
%    m = leaf_setproperty( m, 'flattenratio', 1.000000 );
%    m = leaf_setproperty( m, 'useGrowthTensors', false );
%    m = leaf_setproperty( m, 'plasticGrowth', false );
%    m = leaf_setproperty( m, 'totalinternalrotation', 0.000000 );
%    m = leaf_setproperty( m, 'stepinternalrotation', 2.000000 );
%    m = leaf_setproperty( m, 'showinternalrotation', false );
%    m = leaf_setproperty( m, 'performinternalrotation', false );
%    m = leaf_setproperty( m, 'internallyrotated', false );
%    m = leaf_setproperty( m, 'maxFEcells', 0 );
%    m = leaf_setproperty( m, 'inittotalcells', 0 );
%    m = leaf_setproperty( m, 'bioApresplitproc',  );
%    m = leaf_setproperty( m, 'bioApostsplitproc',  );
%    m = leaf_setproperty( m, 'maxBioAcells', 0 );
%    m = leaf_setproperty( m, 'colors', (6 values) );
%    m = leaf_setproperty( m, 'colorvariation', 0.050000 );
%    m = leaf_setproperty( m, 'colorparams', (12 values) );
%    m = leaf_setproperty( m, 'biocolormode', 'auto' );
%    m = leaf_setproperty( m, 'freezing', 0.000000 );
%    m = leaf_setproperty( m, 'canceldrift', false );
%    m = leaf_setproperty( m, 'mgen_interaction',  );
%    m = leaf_setproperty( m, 'mgen_interactionName', 'gpt_demosubdivision_20121116' );
%    m = leaf_setproperty( m, 'allowInteraction', true );
%    m = leaf_setproperty( m, 'interactionValid', true );
%    m = leaf_setproperty( m, 'gaussInfo', (unknown type struct) );
%    m = leaf_setproperty( m, 'stitchDFs', [] );
%    m = leaf_setproperty( m, 'D', (36 values) );
%    m = leaf_setproperty( m, 'C', (36 values) );
%    m = leaf_setproperty( m, 'G', (6 values) );
%    m = leaf_setproperty( m, 'solver', 'cgs' );
%    m = leaf_setproperty( m, 'solverprecision', 'double' );
%    m = leaf_setproperty( m, 'solvertolerance', 0.001000 );
%    m = leaf_setproperty( m, 'solvertolerancemethod', 'max' );
%    m = leaf_setproperty( m, 'diffusiontolerance', 0.000010 );
%    m = leaf_setproperty( m, 'allowsparse', true );
%    m = leaf_setproperty( m, 'maxIters', 0 );
%    m = leaf_setproperty( m, 'maxsolvetime', 1000.000000 );
%    m = leaf_setproperty( m, 'cgiters', 0 );
%    m = leaf_setproperty( m, 'simsteps', 0 );
%    m = leaf_setproperty( m, 'stepsperrender', 0 );
%    m = leaf_setproperty( m, 'growthEnabled', true );
%    m = leaf_setproperty( m, 'diffusionEnabled', true );
%    m = leaf_setproperty( m, 'flashmovie', false );
%    m = leaf_setproperty( m, 'makemovie', false );
%    m = leaf_setproperty( m, 'moviefile',  );
%    m = leaf_setproperty( m, 'codec', 'None' );
%    m = leaf_setproperty( m, 'autonamemovie', true );
%    m = leaf_setproperty( m, 'overwritemovie', false );
%    m = leaf_setproperty( m, 'framesize', [] );
%    m = leaf_setproperty( m, 'mov', [] );
%    m = leaf_setproperty( m, 'boingNeeded', false );
%    m = leaf_setproperty( m, 'initialArea', 128.000000 );
%    m = leaf_setproperty( m, 'bendunitlength', 11.313708 );
%    m = leaf_setproperty( m, 'targetRelArea', 1.000000 );
%    m = leaf_setproperty( m, 'defaultinterp', 'min' );
%    m = leaf_setproperty( m, 'readonly', false );
%    m = leaf_setproperty( m, 'projectdir', 'D:\ab\Matlab stuff\Growth models' );
%    m = leaf_setproperty( m, 'modelname', 'GPT_DemoSubdivision_20121116' );
%    m = leaf_setproperty( m, 'allowsave', true );
%    m = leaf_setproperty( m, 'addedToPath', false );
%    m = leaf_setproperty( m, 'bendsplit', 0.300000 );
%    m = leaf_setproperty( m, 'usepolfreezebc', false );
%    m = leaf_setproperty( m, 'dorsaltop', true );
%    m = leaf_setproperty( m, 'defaultazimuth', -45.000000 );
%    m = leaf_setproperty( m, 'defaultelevation', 33.750000 );
%    m = leaf_setproperty( m, 'defaultroll', 0.000000 );
%    m = leaf_setproperty( m, 'defaultViewParams', (unknown type struct) );
%    m = leaf_setproperty( m, 'comment',  );
%    m = leaf_setproperty( m, 'legendTemplate', '%T: %q\n%m' );
%    m = leaf_setproperty( m, 'bioAsplitcells', true );
%    m = leaf_setproperty( m, 'bioApullin', 0.142857 );
%    m = leaf_setproperty( m, 'bioAfakepull', 0.202073 );
%    m = leaf_setproperty( m, 'interactive', false );
%    m = leaf_setproperty( m, 'coderevision', 0 );
%    m = leaf_setproperty( m, 'coderevisiondate',  );
%    m = leaf_setproperty( m, 'modelrevision', 0 );
%    m = leaf_setproperty( m, 'modelrevisiondate',  );
%    m = leaf_setproperty( m, 'savedrunname',  );
%    m = leaf_setproperty( m, 'savedrundesc',  );
%    m = leaf_setproperty( m, 'vxgrad', (108 values) );
%    m = leaf_setproperty( m, 'lengthscale', 16.000000 );
end


% Here you may write any functions of your own, that you want to call from
% the interaction function, but never need to call from outside it.
% Remember that they do not have access to any variables except those
% that you pass as parameters, and cannot change anything except by
% returning new values as results.
% Whichever section they are called from, they must respect the same
% restrictions on what modifications they are allowed to make to the mesh.

% For example:


% function m = do_something( m )
%   % Change m in some way.
% end

% Call it from the main body of the interaction function like this:
%       m = do_something( m );