ModelProcessorDiagnosticVert

PURPOSE ^

MODELPROCESSORDIAGNOSTICVERT - process model for a vertical diagnostic solution

SYNOPSIS ^

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

DESCRIPTION ^

MODELPROCESSORDIAGNOSTICVERT - process model for a vertical diagnostic 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]=ModelProcessorDiagnosticVert(md);

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [elements,grids,loads,constraints,materials,part,tpart]=ModelProcessorDiagnosticVert(md);
0002 %MODELPROCESSORDIAGNOSTICVERT - process model for a vertical diagnostic 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]=ModelProcessorDiagnosticVert(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 %3d elements
0030 pos=find(element_partitioning==labindex);
0031 [elements(pos).element]=deal(pentaelem);
0032 
0033 elements(pos)=SetStructureField(elements(pos),'element','type','pentaelem');
0034 elements(pos)=SetStructureField(elements(pos),'element','id',pos);
0035 elements(pos)=SetStructureField(elements(pos),'element','g',md.elements(pos,1:6));
0036 elements(pos)=SetStructureField(elements(pos),'element','h',md.thickness(md.elements(pos,1:6)));
0037 elements(pos)=SetStructureField(elements(pos),'element','s',md.surface(md.elements(pos,1:6)));
0038 elements(pos)=SetStructureField(elements(pos),'element','b',md.bed(md.elements(pos,1:6)));
0039 elements(pos)=SetStructureField(elements(pos),'element','friction_type',md.drag_type);
0040 elements(pos)=SetStructureField(elements(pos),'element','k',md.drag(md.elements(pos,1:6)));
0041 elements(pos)=SetStructureField(elements(pos),'element','p',md.p(pos));
0042 elements(pos)=SetStructureField(elements(pos),'element','q',md.q(pos));
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','meanvel',md.meanvel);
0047 elements(pos)=SetStructureField(elements(pos),'element','epsvel',md.epsvel);
0048 elements(pos)=SetStructureField(elements(pos),'element','acceleration',0);%acceleration 0 since no acceleration is posssible
0049 elements(pos)=SetStructureField(elements(pos),'element','collapse',0);
0050 elements(pos)=SetStructureField(elements(pos),'element','matid',pos);
0051 elements(pos)=SetStructureField(elements(pos),'element','collapse',zeros(length(pos),1)); %no collapsed formulation
0052 
0053 [materials(pos).material]=deal(matice);
0054 
0055 materials(pos)=SetStructureField(materials(pos),'material','id',pos);
0056 materials(pos)=SetStructureField(materials(pos),'material','B',md.B(md.elements(pos,1:6))*[1;1;1;1;1;1]/6);
0057 materials(pos)=SetStructureField(materials(pos),'material','n',md.n(pos));
0058 
0059 %Add physical constants in materials
0060 [materials(end).constants]=deal(matpar);
0061 materials(end)=SetStructureField(materials(end),'constants','g',md.g);
0062 materials(end)=SetStructureField(materials(end),'constants','viscosity_overshoot',md.viscosity_overshoot);
0063 materials(end)=SetStructureField(materials(end),'constants','rho_ice',md.rho_ice);
0064 materials(end)=SetStructureField(materials(end),'constants','rho_water',md.rho_water);
0065 materials(end)=SetStructureField(materials(end),'constants','thermalconductivity',md.thermalconductivity);
0066 materials(end)=SetStructureField(materials(end),'constants','heatcapacity',md.heatcapacity);
0067 materials(end)=SetStructureField(materials(end),'constants','latentheat',md.latentheat);
0068 materials(end)=SetStructureField(materials(end),'constants','beta',md.beta);
0069 materials(end)=SetStructureField(materials(end),'constants','meltingpoint',md.meltingpoint);
0070 materials(end)=SetStructureField(materials(end),'constants','mixed_layer_capacity',md.mixed_layer_capacity);
0071 materials(end)=SetStructureField(materials(end),'constants','thermal_exchange_velocity',md.thermal_exchange_velocity);
0072 
0073 if cluster, 
0074     %Figure out which grids from the partitioning belong to different element partitions. We'll
0075     %call them 'border' grids.
0076     bordergrids=double(gplus(mygrids)>1);
0077 else
0078     bordergrids=zeros(md.numberofgrids,1); %no partitioning serially.
0079 end
0080 
0081 %Get the grids set up:
0082 grids=struct('grid',cell(md.numberofgrids,1));
0083 
0084 pos=[1:md.numberofgrids]';
0085 [grids(pos).grid]=deal(node);
0086 grids(pos)=SetStructureField(grids(pos),'grid','id',pos);
0087 grids(pos)=SetStructureField(grids(pos),'grid','x',md.x(pos));
0088 grids(pos)=SetStructureField(grids(pos),'grid','y',md.y(pos));
0089 grids(pos)=SetStructureField(grids(pos),'grid','z',md.z(pos));
0090 grids(pos)=SetStructureField(grids(pos),'grid','onbed',md.gridonbed(pos));
0091 grids(pos)=SetStructureField(grids(pos),'grid','border',bordergrids(pos));
0092 
0093 %spc degrees of freedom:
0094 %     for each grid, 6 degrees of freedom are allowed. These dofs are numbered from 1 to 6. The first 3
0095 %    deal with the (x,y,z) velocities, or deformations. The last 3 deal with the (x,y,z) rotations.
0096 %    If a certain degree of freedom i (1<=i<=6) is constrained to the value 0, the number i should be added to the
0097 %    gridset field of a grid.
0098 %    The gridset field holds all the numbers corresponding to the dofs that have been constrained to 0 value. Because
0099 %    we do not know firshand how many dofs have been constrained for a certain grid, we need a flexible way
0100 %    of keeping track of these constraints. Hence gridset is a string array, of no given size, with no given
0101 %    numerical order.
0102 %    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
0103 %    following strings to the gridset: '135', '153', '315', etc ...
0104 grids(pos)=SetStructureField(grids(pos),'grid','gridset','12456');
0105 
0106 %Boundary conditions:
0107 
0108 %penalties: not applied here
0109 loads=struct('load',cell([0,1]));
0110 
0111 %Single point constraints:
0112 spcs=find(md.gridonbed);
0113 constraints=struct('constraint',cell(length(spcs),1));
0114 
0115 count=1;
0116 for i=1:md.numberofgrids,
0117     if md.gridonbed(i),
0118 
0119         %constrain first dof
0120         constraints(count).constraint=spc;
0121         constraints(count).constraint.grid=i;
0122         constraints(count).constraint.dof=3;
0123         constraints(count).constraint.value=0; %this will be change to vz in the solution sequences.
0124         count=count+1;
0125     end
0126 end
0127 
0128 %Last thing, return a partitioning vector, and its transpose.
0129 [part,tpart]=PartitioningVector(md,grids);
0130 
0131 end %end function

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