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

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

CHG: re-introducing Marshalling routines in support of check pointing. Implemented
the dataset backbone, and the FemModel backbone. Now we have to bring back the low
level drivers for the classes.

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