source: issm/trunk-jpl/src/c/classes/Elements/Element.h@ 19554

Last change on this file since 19554 was 19554, checked in by Eric.Larour, 10 years ago

CHG: finished first prototype implementation of the GEMB model inside the Gembx module of the SurfaceMassBalancex module,
and inside the SMBgemb.m class, as well as the SMBGemb method of the Element.cpp class.
Had to introduce the concept also of a DoubleArrayInput to keep track of the vertical gridded datasets within each element.

File size: 19.8 KB
Line 
1/*!\file: Element.h
2 * \brief abstract class for Element object
3 * This class is a place holder for the Tria and the Penta elements.
4 * It is derived from Element, so DataSets can contain them.
5 */
6
7#ifndef _ELEMENT_H_
8#define _ELEMENT_H_
9
10/*Headers:*/
11/*{{{*/
12#include "../../datastructures/datastructures.h"
13#include "../../toolkits/toolkits.h"
14#include "../Update.h"
15class DataSet;
16class Parameters;
17class Parameter;
18class Elements;
19class Loads;
20class Nodes;
21class Node;
22class Vertices;
23class Vertex;
24class Materials;
25class Material;
26class Matpar;
27class Inputs;
28class Input;
29class Gauss;
30class ElementVector;
31template <class doublematrix> class Matrix;
32template <class doubletype> class Vector;
33class ElementMatrix;
34class ElementVector;
35/*}}}*/
36
37class Element: public Object,public Update{
38
39 public:
40 int id;
41 int sid;
42 Inputs *inputs;
43 Node **nodes;
44 Vertex **vertices;
45 Material *material;
46 Matpar *matpar;
47 Parameters *parameters;
48
49 int* element_type_list;
50 int element_type;
51
52 public:
53 /*Constructors/Destructores*/
54 Element();
55 ~Element();
56
57 /*Functions*/
58 void AddInput(Input* input_in);
59 /*bool AllActive(void);*/
60 /*bool AnyActive(void);*/
61 void ComputeNewDamage();
62 void ComputeStrainRate();
63 void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
64 void Echo();
65 void DeepEcho();
66 void DeleteInput(int input_enum);
67 void DeleteMaterials(void);
68 void Delta18oParameterization(void);
69 void MungsmtpParameterization(void);
70 void Delta18opdParameterization(void);
71 IssmDouble Divergence(void);
72 void dViscositydBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
73 void dViscositydBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
74 void dViscositydBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
75 void dViscositydDSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
76 IssmDouble EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure);
77 IssmDouble EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure);
78 void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure);
79 void FindParam(bool* pvalue,int paramenum);
80 void FindParam(int* pvalue,int paramenum);
81 void FindParam(IssmDouble* pvalue,int paramenum);
82 void FindParam(int** pvalues,int* psize,int paramenum);
83 void GetDofList(int** pdoflist,int approximation_enum,int setenum);
84 void GetDofListPressure(int** pdoflist,int setenum);
85 void GetDofListVelocity(int** pdoflist,int setenum);
86 Input* GetInput(int inputenum);
87 void GetInputListOnNodes(IssmDouble* pvalue,int enumtype);
88 void GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
89 void GetInputListOnNodesVelocity(IssmDouble* pvalue,int enumtype);
90 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
91 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
92 void GetInputLocalMinMaxOnNodes(IssmDouble* min,IssmDouble* max,IssmDouble* ug);
93 void GetInputValue(bool* pvalue,int enum_type);
94 void GetInputValue(int* pvalue,int enum_type);
95 void GetInputValue(IssmDouble* pvalue,int enum_type);
96 void GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
97 IssmDouble GetMaterialParameter(int enum_in);
98 void GetNodesLidList(int* lidlist);
99 void GetNodesSidList(int* sidlist);
100 void GetPhi(IssmDouble* phi, IssmDouble* epsilon, IssmDouble viscosity);
101 void GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum, int type);
102 void GetVertexPidList(int* pidlist);
103 void GetVerticesConnectivityList(int* connectivitylist);
104 void GetVerticesCoordinates(IssmDouble** xyz_list);
105 void GetVerticesSidList(int* sidlist);
106 IssmDouble GetXcoord(IssmDouble* xyz_list,Gauss* gauss);
107 IssmDouble GetYcoord(IssmDouble* xyz_list,Gauss* gauss);
108 IssmDouble GetZcoord(IssmDouble* xyz_list,Gauss* gauss);
109 void GradientIndexing(int* indexing,int control_index,bool onsid=false);
110 bool HasNodeOnBase();
111 bool HasNodeOnSurface();
112 int Id();
113 void InputChangeName(int enum_type,int enum_type_old);
114 void InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
115 void InputDuplicate(int original_enum,int new_enum);
116 void InputUpdateFromConstant(IssmDouble constant, int name);
117 void InputUpdateFromConstant(int constant, int name);
118 void InputUpdateFromConstant(bool constant, int name);
119 bool IsFloating();
120 bool IsIceInElement();
121 bool IsInput(int name);
122 void LinearFloatingiceMeltingRate();
123 void MarshallElement(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction,int numanalyses);
124 void MigrateGroundingLine(IssmDouble* sheet_ungrounding);
125 void MismipFloatingiceMeltingRate();
126 ElementMatrix* NewElementMatrix(int approximation_enum=NoneApproximationEnum);
127 ElementMatrix* NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
128 ElementVector* NewElementVector(int approximation_enum=NoneApproximationEnum);
129 void PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm);
130 IssmDouble PureIceEnthalpy(IssmDouble pressure);
131 void ResetIceLevelset(void);
132 void ResultInterpolation(int* pinterpolation,int*nodesperelement,int* parray_size, int output_enum);
133 void ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum);
134 void ResultToMatrix(IssmDouble* values,int ncols,int output_enum);
135 void ResultToVector(Vector<IssmDouble>* vector,int output_enum);
136 void SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
137 int Sid();
138 void SmbGemb();
139 void StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
140 void StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
141 void StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
142 void StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
143 void StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
144 void StressMaxPrincipalCreateInput(void);
145 void ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
146 IssmDouble TMeltingPoint(IssmDouble pressure);
147 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
148 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
149 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
150 void TransformLoadVectorCoord(ElementVector* pe,int cs_enum);
151 void TransformLoadVectorCoord(ElementVector* pe,int* cs_array);
152 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
153 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
154 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/
155 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
156 void TransformSolutionCoord(IssmDouble* solution,int cs_enum);
157 void TransformSolutionCoord(IssmDouble* solution,int* cs_array);
158 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum);
159 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array);
160 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
161 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
162 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
163 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* cs_array);
164 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
165 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
166 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
167 void ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
168 void ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
169 void ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
170 void ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
171 void ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
172 void ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
173 void ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
174 void ViscousHeatingCreateInput(void);
175
176 /*Virtual functions*/
177 virtual void AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
178 virtual void AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
179 virtual void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
180 virtual void CalvingRateLevermann(void)=0;
181 virtual void CalvingRatePi(void)=0;
182 virtual void CalvingRateDev(void){_error_("not implemented yet");};
183 virtual void WriteLevelsetSegment(DataSet* segments){_error_("not implemented yet");};
184 virtual void ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){_error_("not implemented yet");};
185 virtual IssmDouble CharacteristicLength(void)=0;
186 virtual void ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
187 virtual void ComputeDeviatoricStressTensor(void)=0;
188 virtual void ComputeSigmaNN(void)=0;
189 virtual void ComputeStressTensor(void)=0;
190 virtual void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
191 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
192 virtual void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
193 virtual void ElementResponse(IssmDouble* presponse,int response_enum)=0;
194 virtual void ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
195 virtual int FiniteElement(void)=0;
196 virtual void FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
197 virtual Element* GetBasalElement(void)=0;
198 virtual int GetElementType(void)=0;
199 virtual void GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
200 virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
201 virtual void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
202 virtual void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
203 virtual void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level)=0;
204 virtual void GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
205 virtual Node* GetNode(int node_number)=0;
206 virtual int GetNodeIndex(Node* node)=0;
207 virtual int GetNumberOfNodes(void)=0;
208 virtual int GetNumberOfNodes(int enum_type)=0;
209 virtual int GetNumberOfVertices(void)=0;
210 virtual void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0;
211 virtual Element* GetUpperElement(void)=0;
212 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
213 virtual void GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
214 virtual void GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0;
215 virtual IssmDouble GroundedArea(void)=0;
216 virtual IssmDouble IceMass(void)=0;
217 virtual IssmDouble IceVolume(void)=0;
218 virtual IssmDouble IceVolumeAboveFloatation(void)=0;
219 virtual void InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
220 virtual void InputDepthAverageAtBase(int enum_type,int average_enum_type)=0;
221 virtual void InputExtrude(int input_enum,int start)=0;
222 virtual void InputScale(int enum_type,IssmDouble scale_factor)=0;
223 virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
224 virtual void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
225 virtual bool IsFaceOnBoundary(void)=0;
226 virtual bool IsIcefront(void)=0;
227 virtual bool IsNodeOnShelfFromFlags(IssmDouble* flags)=0;
228 virtual bool IsOnBase()=0;
229 virtual bool IsOnSurface()=0;
230 virtual bool IsZeroLevelset(int levelset_enum)=0;
231 virtual void JacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
232 virtual void JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
233 virtual void JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
234 virtual void JacobianDeterminantSurface(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
235 virtual void JacobianDeterminantTop(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
236 virtual void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction)=0;
237 virtual IssmDouble Masscon(IssmDouble* levelset)=0;
238 virtual IssmDouble MassFlux(IssmDouble* segment)=0;
239 virtual IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id)=0;
240 virtual IssmDouble MinEdgeLength(IssmDouble* xyz_list)=0;
241 virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
242 virtual IssmDouble MisfitArea(int weightsenum)=0;
243 virtual Gauss* NewGauss(void)=0;
244 virtual Gauss* NewGauss(int order)=0;
245 virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
246 virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
247 virtual Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
248 virtual Gauss* NewGaussBase(int order)=0;
249 virtual Gauss* NewGaussLine(int vertex1,int vertex2,int order)=0;
250 virtual Gauss* NewGaussTop(int order)=0;
251 virtual void NodalFunctions(IssmDouble* basis,Gauss* gauss)=0;
252 virtual void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
253 virtual void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
254 virtual void NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
255 virtual void NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss)=0;
256 virtual void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss)=0;
257 virtual void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
258 virtual void NodalFunctionsP2(IssmDouble* basis,Gauss* gauss)=0;
259 virtual void NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss)=0;
260 virtual void NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss)=0;
261 virtual int NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
262 virtual void NormalBase(IssmDouble* normal,IssmDouble* xyz_list)=0;
263 virtual void NormalSection(IssmDouble* normal,IssmDouble* xyz_list)=0;
264 virtual void NormalTop(IssmDouble* normal,IssmDouble* xyz_list)=0;
265 virtual int NumberofNodesPressure(void)=0;
266 virtual int NumberofNodesVelocity(void)=0;
267 virtual void PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
268 virtual int PressureInterpolation()=0;
269 virtual void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
270 virtual void ResetFSBasalBoundaryCondition()=0;
271 virtual void ResetHooks()=0;
272 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
273 virtual void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0;
274 virtual void SetTemporaryElementType(int element_type_in)=0;
275 virtual Element* SpawnBasalElement(void)=0;
276 virtual Element* SpawnTopElement(void)=0;
277 virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0;
278 virtual void StrainRateparallel(void)=0;
279 virtual void StrainRateperpendicular(void)=0;
280 virtual void StressIntensityFactor(void)=0;
281 virtual IssmDouble SurfaceArea(void)=0;
282 virtual int TensorInterpolation()=0;
283 virtual IssmDouble TimeAdapt()=0;
284 virtual IssmDouble TotalSmb(void)=0;
285 virtual void Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
286 virtual void UpdateConstraintsExtrudeFromBase(void)=0;
287 virtual void UpdateConstraintsExtrudeFromTop(void)=0;
288 virtual int UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
289 virtual void ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss)=0;
290 virtual void ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss)=0;
291 virtual int VelocityInterpolation()=0;
292 virtual int VertexConnectivity(int vertexindex)=0;
293 virtual void VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
294 virtual void ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
295 virtual void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
296
297 #ifdef _HAVE_GIA_
298 virtual void GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y)=0;
299 #endif
300};
301#endif
Note: See TracBrowser for help on using the repository browser.