ModelProcessorDiagnosticBaseVert

PURPOSE ^

MODELPROCESSORDIAGNOSTICBASEVERT - process the model for a DiagmosticBaseVert solution

SYNOPSIS ^

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

DESCRIPTION ^

MODELPROCESSORDIAGNOSTICBASEVERT - process the model for a DiagmosticBaseVert 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]=ModelProcessorDiagnosticBaseVert(md);

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorDiagnosticBaseVert(md);
0002 %MODELPROCESSORDIAGNOSTICBASEVERT - process the model for a DiagmosticBaseVert 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]=ModelProcessorDiagnosticBaseVert(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(md.numberofelements+1,1));
0027 mygrids=zeros(md.numberofgrids,1); %this array determines grid partitioning.
0028 
0029 %Build elements
0030 if strcmpi(md.type,'2d'),
0031     error('ModelProcessorDiagnosticBaseVert error message: 2d mesh not supported yet!');
0032 end
0033 
0034 pos=find(element_partitioning==labindex);
0035 [elements(pos).element]=deal(pentaelem);
0036 
0037 elements(pos)=SetStructureField(elements(pos),'element','type','pentaelem');
0038 elements(pos)=SetStructureField(elements(pos),'element','id',pos);
0039 elements(pos)=SetStructureField(elements(pos),'element','g',md.elements(pos,1:6));
0040 elements(pos)=SetStructureField(elements(pos),'element','h',md.thickness(md.elements(pos,1:6)));
0041 elements(pos)=SetStructureField(elements(pos),'element','s',md.surface(md.elements(pos,1:6)));
0042 elements(pos)=SetStructureField(elements(pos),'element','b',md.bed(md.elements(pos,1:6)));
0043 elements(pos)=SetStructureField(elements(pos),'element','shelf',md.elementoniceshelf(pos));
0044 elements(pos)=SetStructureField(elements(pos),'element','onbed',md.elementonbed(pos));
0045 elements(pos)=SetStructureField(elements(pos),'element','onsurface',md.elementonsurface(pos));
0046 elements(pos)=SetStructureField(elements(pos),'element','acceleration',0);%acceleration 0 since no acceleration is posssible
0047 elements(pos)=SetStructureField(elements(pos),'element','collapse',1);
0048 elements(pos)=SetStructureField(elements(pos),'element','matid',pos);
0049 elements(pos)=SetStructureField(elements(pos),'element','melting',full(md.melting(md.elements(pos,1:6))/md.yts));
0050 elements(pos)=SetStructureField(elements(pos),'element','accumulation',md.accumulation(md.elements(pos,1:6))/md.yts);
0051 
0052 [materials(pos).material]=deal(matice);
0053 
0054 materials(pos)=SetStructureField(materials(pos),'material','id',pos);
0055 
0056 %Add physical constants in materials
0057 [materials(end).constants]=deal(matpar);
0058 materials(end)=SetStructureField(materials(end),'constants','g',md.g);
0059 materials(end)=SetStructureField(materials(end),'constants','viscosity_overshoot',md.viscosity_overshoot);
0060 materials(end)=SetStructureField(materials(end),'constants','rho_ice',md.rho_ice);
0061 materials(end)=SetStructureField(materials(end),'constants','rho_water',md.rho_water);
0062 materials(end)=SetStructureField(materials(end),'constants','thermalconductivity',md.thermalconductivity);
0063 materials(end)=SetStructureField(materials(end),'constants','heatcapacity',md.heatcapacity);
0064 materials(end)=SetStructureField(materials(end),'constants','latentheat',md.latentheat);
0065 materials(end)=SetStructureField(materials(end),'constants','beta',md.beta);
0066 materials(end)=SetStructureField(materials(end),'constants','meltingpoint',md.meltingpoint);
0067 materials(end)=SetStructureField(materials(end),'constants','mixed_layer_capacity',md.mixed_layer_capacity);
0068 materials(end)=SetStructureField(materials(end),'constants','thermal_exchange_velocity',md.thermal_exchange_velocity);
0069 
0070 
0071 if cluster, 
0072     %For elements, the corresponding grids belong to this cpu. Keep track of it.
0073     mygrids(md.elements(el3pos,:))=1;
0074     mygrids(md.elements(el6pos,:))=1;
0075     
0076     %Figure out which grids from the partitioning belong to different element partitions. We'll
0077     %call them 'border' grids.
0078     bordergrids=double(gplus(mygrids)>1);
0079 else
0080     bordergrids=zeros(md.numberofgrids,1); %no partitioning serially.
0081 end
0082 
0083 %Get the grids set up:
0084 grids=struct('grid',cell(md.numberofgrids,1));
0085 
0086 pos=[1:md.numberofgrids]';
0087 [grids(pos).grid]=deal(node);
0088 grids(pos)=SetStructureField(grids(pos),'grid','id',pos);
0089 grids(pos)=SetStructureField(grids(pos),'grid','x',md.x(pos));
0090 grids(pos)=SetStructureField(grids(pos),'grid','y',md.y(pos));
0091 grids(pos)=SetStructureField(grids(pos),'grid','z',md.z(pos));
0092 grids(pos)=SetStructureField(grids(pos),'grid','onbed',md.gridonbed(pos));
0093 grids(pos)=SetStructureField(grids(pos),'grid','border',bordergrids(pos));
0094 
0095 %spc degrees of freedom:
0096 %     for each grid, 6 degrees of freedom are allowed. These dofs are numbered from 1 to 6. The first 3
0097 %    deal with the (x,y,z) velocities, or deformations. The last 3 deal with the (x,y,z) rotations.
0098 %    If a certain degree of freedom i (1<=i<=6) is constrained to the value 0, the number i should be added to the
0099 %    gridset field of a grid.
0100 %    The gridset field holds all the numbers corresponding to the dofs that have been constrained to 0 value. Because
0101 %    we do not know firshand how many dofs have been constrained for a certain grid, we need a flexible way
0102 %    of keeping track of these constraints. Hence gridset is a string array, of no given size, with no given
0103 %    numerical order.
0104 %    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
0105 %    following strings to the gridset: '135', '153', '315', etc ...
0106 
0107 %Here, block all dof for every grid
0108 grids(pos)=SetStructureField(grids(pos),'grid','gridset','123456');
0109 
0110 %for bed elements, free up the 3'rd dof for the first 3 grids
0111 for n=1:length(elements),
0112     %all dofs associated to this element are frozen, except if the element is on the bed, and acts as a 'fake' pentaelem,
0113     %and a true 'macayeal' tria element.
0114     if elements(n).element.onbed,
0115         for j=1:3,
0116             grids(elements(n).element.g(j)).grid.gridset='12456';
0117         end
0118     end
0119 end
0120 
0121 %Boundary conditions: no penalties applied here
0122 loads=struct('load',cell([0,1]));
0123 
0124 %Single point constraints: none;
0125 constraints=struct('constraint',cell(0,0));
0126 
0127 %Last thing, return a partitioning vector, and its transpose.
0128 [part,tpart]=PartitioningVector(md,grids);
0129 
0130 end %end function

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