ModelProcessorPrognostic

PURPOSE ^

MODELPROCESSORPROGNOSTIC - process model for a prognostic solution

SYNOPSIS ^

function [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorPrognostic(md);

DESCRIPTION ^

MODELPROCESSORPROGNOSTIC - process model for a prognostic solution

   This routine uses all the informations in the model md and put them
   into different structures (grids, elements, loads, constrained,materials)
   that will be used to create the stiffness matrix and load vector.
   After this routine, the model md should not be called until the end of the
   solution sequence.

   Usage:
      [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorPrognostic(md)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorPrognostic(md);
0002 %MODELPROCESSORPROGNOSTIC - process model for a prognostic solution
0003 %
0004 %   This routine uses all the informations in the model md and put them
0005 %   into different structures (grids, elements, loads, constrained,materials)
0006 %   that will be used to create the stiffness matrix and load vector.
0007 %   After this routine, the model md should not be called until the end of the
0008 %   solution sequence.
0009 %
0010 %   Usage:
0011 %      [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorPrognostic(md)
0012 
0013 global cluster
0014 
0015 if cluster,
0016     %We are running in parallel, we need to partition the elements
0017     element_partitioning=MeshPartition(md,numlabs);
0018 else
0019     %We are running in serial, all elements belong to the same partition.
0020     element_partitioning=ones(md.numberofelements,1);
0021     labindex=1; %older versions of matlab do not include the parallel toolbox labindex variable.
0022 end
0023 
0024 %Allocate grids and elements
0025 elements=struct('element',cell(md.numberofelements,1));
0026 materials=struct('material',cell(0,0));
0027 mygrids=zeros(md.numberofgrids,1); %this array determines grid partitioning.
0028 
0029 %Build elements
0030 if strcmpi(md.type,'2d'),
0031     pos=find(element_partitioning==labindex);
0032     [elements(pos).element]=deal(triaelem);
0033 
0034     elements(pos)=SetStructureField(elements(pos),'element','type','triaelem');
0035     elements(pos)=SetStructureField(elements(pos),'element','id',pos);
0036     elements(pos)=SetStructureField(elements(pos),'element','g',md.elements(pos,:));
0037     elements(pos)=SetStructureField(elements(pos),'element','h',md.thickness(md.elements(pos,1:3)));
0038     elements(pos)=SetStructureField(elements(pos),'element','s',md.surface(md.elements(pos,1:3)));
0039     elements(pos)=SetStructureField(elements(pos),'element','b',md.bed(md.elements(pos,1:3)));
0040     elements(pos)=SetStructureField(elements(pos),'element','shelf',md.elementoniceshelf(pos));
0041     elements(pos)=SetStructureField(elements(pos),'element','artificial_diffusivity',md.artificial_diffusivity);
0042 
0043 else
0044     pos=find(element_partitioning==labindex);
0045     [elements(pos).element]=deal(pentaelem);
0046 
0047     elements(pos)=SetStructureField(elements(pos),'element','type','pentaelem');
0048     elements(pos)=SetStructureField(elements(pos),'element','id',pos);
0049     elements(pos)=SetStructureField(elements(pos),'element','g',md.elements(pos,1:6));
0050     elements(pos)=SetStructureField(elements(pos),'element','h',md.thickness(md.elements(pos,1:6)));
0051     elements(pos)=SetStructureField(elements(pos),'element','s',md.surface(md.elements(pos,1:6)));
0052     elements(pos)=SetStructureField(elements(pos),'element','b',md.bed(md.elements(pos,1:6)));
0053     elements(pos)=SetStructureField(elements(pos),'element','shelf',md.elementoniceshelf(pos));
0054     elements(pos)=SetStructureField(elements(pos),'element','onbed',md.elementonbed(pos));
0055     elements(pos)=SetStructureField(elements(pos),'element','onsurface',md.elementonsurface(pos));
0056     elements(pos)=SetStructureField(elements(pos),'element','collapse',1);
0057     elements(pos)=SetStructureField(elements(pos),'element','artificial_diffusivity',md.artificial_diffusivity);
0058 end
0059 
0060 if cluster, 
0061     %For elements, the corresponding grids belong to this cpu. Keep track of it.
0062     mygrids(md.elements(el3pos,:))=1;
0063     mygrids(md.elements(el6pos,:))=1;
0064     
0065     %Figure out which grids from the partitioning belong to different element partitions. We'll
0066     %call them 'border' grids.
0067     bordergrids=double(gplus(mygrids)>1);
0068 else
0069     bordergrids=zeros(md.numberofgrids,1); %no partitioning serially.
0070 end
0071 
0072 %Get the grids set up:
0073 grids=struct('grid',cell(md.numberofgrids,1));
0074 
0075 pos=[1:md.numberofgrids]';
0076 [grids(pos).grid]=deal(node);
0077 grids(pos)=SetStructureField(grids(pos),'grid','id',pos);
0078 grids(pos)=SetStructureField(grids(pos),'grid','x',md.x(pos));
0079 grids(pos)=SetStructureField(grids(pos),'grid','y',md.y(pos));
0080 grids(pos)=SetStructureField(grids(pos),'grid','z',md.z(pos));
0081 grids(pos)=SetStructureField(grids(pos),'grid','onbed',md.gridonbed(pos));
0082 grids(pos)=SetStructureField(grids(pos),'grid','border',bordergrids(pos));
0083 
0084 %spc degrees of freedom:
0085 %     for each grid, 6 degrees of freedom are allowed. These dofs are numbered from 1 to 6. The first 3
0086 %    deal with the (x,y,z) velocities, or deformations. The last 3 deal with the (x,y,z) rotations.
0087 %    If a certain degree of freedom i (1<=i<=6) is constrained to the value 0, the number i should be added to the
0088 %    gridset field of a grid.
0089 %    The gridset field holds all the numbers corresponding to the dofs that have been constrained to 0 value. Because
0090 %    we do not know firshand how many dofs have been constrained for a certain grid, we need a flexible way
0091 %    of keeping track of these constraints. Hence gridset is a string array, of no given size, with no given
0092 %    numerical order.
0093 %    Ex: if a grid has 0 values for the x and z deformations, and 0 values for the y rotation, we could add any of the
0094 %    following strings to the gridset: '135', '153', '315', etc ...
0095 if strcmpi(md.type,'3d')
0096         %Here, block all dof for every grid
0097     grids(pos)=SetStructureField(grids(pos),'grid','gridset','123456');
0098 else
0099     grids(pos)=SetStructureField(grids(pos),'grid','gridset','23456');
0100 end
0101 
0102 if strcmpi(md.type,'3d'),
0103     %for bed elements, free up the 1'st dof for the first 3 grids
0104     for n=1:length(elements),
0105         %all dofs associated to this element are frozen, except if the element is on the bed, and acts as a 'fake' pentaelem,
0106         %and a true 'macayeal' tria element.
0107         if elements(n).element.onbed,
0108             for j=1:3,
0109                 grids(elements(n).element.g(j)).grid.gridset='23456';
0110             end
0111         end
0112     end
0113 end
0114 
0115 %Boundary conditions: penalties between two 3d meshes
0116 loads=struct('load',cell([0,1]));
0117 
0118 %Single point constraints: none;
0119 constraints=struct('constraint',cell(0,0));
0120 
0121 %Last thing, return a partitioning vector, and its transpose.
0122 [part,tpart]=PartitioningVector(md,grids);
0123 
0124 end %end function

Generated on Sun 29-Mar-2009 20:22:55 by m2html © 2003