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

Last change on this file since 18968 was 18968, checked in by lemorzad, 10 years ago

updating pdd module and NR 236 and 237. Updated python scripts may not work as I am not familiar with python.

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