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

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

CHG: new sea level rise solution. Not valdated yet!

This solution requires one Sealevelrise analysis (so added the corresponding EnumToAnalysis and analysis.h files + SealevelriseAnalysis.* files).
In terms of solution core: we have a new sealevelrise_core.cpp files + corresponding hook up in CorePointerFromSolutionEnum.
This core calls the new FemModel Sealevelrise module, which loops through the elements, hence the mods to Element.* along with all
derivatives classes, in particular Tria.
In terms of ModelProcessorx, we have a modified CreateElementsVerticesAndMaterials to include lat,long and radius, which also translsates
into modifications for the Vertex object. The VertexCoordinatesx module is also modified, to be able to retrieve x,y,z but also lat,long,r
from vertices.
Of course, this is all driven from matlab, where we have a new field in the model, the slr class.

File size: 20.2 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 IsWaterInElement();
122 bool IsInput(int name);
123 void LinearFloatingiceMeltingRate();
124 void MarshallElement(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction,int numanalyses);
125 void MigrateGroundingLine(IssmDouble* sheet_ungrounding);
126 void MismipFloatingiceMeltingRate();
127 ElementMatrix* NewElementMatrix(int approximation_enum=NoneApproximationEnum);
128 ElementMatrix* NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
129 ElementVector* NewElementVector(int approximation_enum=NoneApproximationEnum);
130 void PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm);
131 IssmDouble PureIceEnthalpy(IssmDouble pressure);
132 void ResetIceLevelset(void);
133 void ResultInterpolation(int* pinterpolation,int*nodesperelement,int* parray_size, int output_enum);
134 void ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum);
135 void ResultToMatrix(IssmDouble* values,int ncols,int output_enum);
136 void ResultToVector(Vector<IssmDouble>* vector,int output_enum);
137 void SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
138 int Sid();
139 void SmbGemb();
140 void StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
141 void StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
142 void StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
143 void StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
144 void StrainRateSSA1d(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input);
145 void StressMaxPrincipalCreateInput(void);
146 void ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure);
147 IssmDouble TMeltingPoint(IssmDouble pressure);
148 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
149 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
150 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
151 void TransformLoadVectorCoord(ElementVector* pe,int cs_enum);
152 void TransformLoadVectorCoord(ElementVector* pe,int* cs_array);
153 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);
154 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);
155 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/
156 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
157 void TransformSolutionCoord(IssmDouble* solution,int cs_enum);
158 void TransformSolutionCoord(IssmDouble* solution,int* cs_array);
159 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum);
160 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array);
161 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);
162 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);
163 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
164 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* cs_array);
165 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
166 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);
167 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/
168 void ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input);
169 void ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
170 void ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
171 void ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
172 void ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf);
173 void ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
174 void ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon);
175 void ViscousHeatingCreateInput(void);
176
177 /*Virtual functions*/
178 virtual void AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
179 virtual void AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0;
180 virtual void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
181 virtual void CalvingRateLevermann(void)=0;
182 virtual void CalvingRatePi(void)=0;
183 virtual void CalvingRateDev(void){_error_("not implemented yet");};
184 virtual void WriteLevelsetSegment(DataSet* segments){_error_("not implemented yet");};
185 virtual void ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){_error_("not implemented yet");};
186 virtual IssmDouble CharacteristicLength(void)=0;
187 virtual void ComputeBasalStress(Vector<IssmDouble>* sigma_b)=0;
188 virtual void ComputeDeviatoricStressTensor(void)=0;
189 virtual void ComputeSigmaNN(void)=0;
190 virtual void ComputeStressTensor(void)=0;
191 virtual void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0;
192 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
193 virtual void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0;
194 virtual void ElementResponse(IssmDouble* presponse,int response_enum)=0;
195 virtual void ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
196 virtual int FiniteElement(void)=0;
197 virtual IssmDouble FloatingArea(void)=0;
198 virtual void FSContactMigration(Vector<IssmDouble>* vertexgrounded,Vector<IssmDouble>* vertexfloating)=0;
199 virtual Element* GetBasalElement(void)=0;
200 virtual int GetElementType(void)=0;
201 virtual void GetGroundedPart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlyfloating)=0;
202 virtual IssmDouble GetGroundedPortion(IssmDouble* xyz_list)=0;
203 virtual void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0;
204 virtual void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
205 virtual void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level)=0;
206 virtual void GetLevelsetPositivePart(int* point1,IssmDouble* fraction1,IssmDouble* fraction2, bool* mainlynegative,IssmDouble* levelsetvalues)=0;
207 virtual Node* GetNode(int node_number)=0;
208 virtual int GetNodeIndex(Node* node)=0;
209 virtual int GetNumberOfNodes(void)=0;
210 virtual int GetNumberOfNodes(int enum_type)=0;
211 virtual int GetNumberOfVertices(void)=0;
212 virtual void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0;
213 virtual Element* GetUpperElement(void)=0;
214 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,bool onsid)=0;
215 virtual void GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0;
216 virtual void GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0;
217 virtual IssmDouble GroundedArea(void)=0;
218 virtual IssmDouble IceMass(void)=0;
219 virtual IssmDouble IceVolume(void)=0;
220 virtual IssmDouble IceVolumeAboveFloatation(void)=0;
221 virtual void InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
222 virtual void InputDepthAverageAtBase(int enum_type,int average_enum_type)=0;
223 virtual void InputExtrude(int input_enum,int start)=0;
224 virtual void InputScale(int enum_type,IssmDouble scale_factor)=0;
225 virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
226 virtual void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
227 virtual bool IsFaceOnBoundary(void)=0;
228 virtual bool IsIcefront(void)=0;
229 virtual bool IsNodeOnShelfFromFlags(IssmDouble* flags)=0;
230 virtual bool IsOnBase()=0;
231 virtual bool IsOnSurface()=0;
232 virtual bool IsZeroLevelset(int levelset_enum)=0;
233 virtual void JacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
234 virtual void JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
235 virtual void JacobianDeterminantLine(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
236 virtual void JacobianDeterminantSurface(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0;
237 virtual void JacobianDeterminantTop(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0;
238 virtual void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction)=0;
239 virtual IssmDouble Masscon(IssmDouble* levelset)=0;
240 virtual IssmDouble MassFlux(IssmDouble* segment)=0;
241 virtual IssmDouble MassFlux(IssmDouble x1,IssmDouble y1, IssmDouble x2, IssmDouble y2,int segment_id)=0;
242 virtual IssmDouble MinEdgeLength(IssmDouble* xyz_list)=0;
243 virtual IssmDouble Misfit(int modelenum,int observationenum,int weightsenum)=0;
244 virtual IssmDouble MisfitArea(int weightsenum)=0;
245 virtual Gauss* NewGauss(void)=0;
246 virtual Gauss* NewGauss(int order)=0;
247 virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order)=0;
248 virtual Gauss* NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order_horiz,int order_vert)=0;
249 virtual Gauss* NewGauss(int point1,IssmDouble fraction1,IssmDouble fraction2,bool mainlyfloating,int order)=0;
250 virtual Gauss* NewGaussBase(int order)=0;
251 virtual Gauss* NewGaussLine(int vertex1,int vertex2,int order)=0;
252 virtual Gauss* NewGaussTop(int order)=0;
253 virtual void NodalFunctions(IssmDouble* basis,Gauss* gauss)=0;
254 virtual void NodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
255 virtual void NodalFunctionsDerivativesVelocity(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
256 virtual void NodalFunctionsMINIDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
257 virtual void NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss)=0;
258 virtual void NodalFunctionsP1(IssmDouble* basis,Gauss* gauss)=0;
259 virtual void NodalFunctionsP1Derivatives(IssmDouble* dbasis,IssmDouble* xyz_list,Gauss* gauss)=0;
260 virtual void NodalFunctionsP2(IssmDouble* basis,Gauss* gauss)=0;
261 virtual void NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss)=0;
262 virtual void NodalFunctionsTensor(IssmDouble* basis, Gauss* gauss)=0;
263 virtual int NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
264 virtual void NormalBase(IssmDouble* normal,IssmDouble* xyz_list)=0;
265 virtual void NormalSection(IssmDouble* normal,IssmDouble* xyz_list)=0;
266 virtual void NormalTop(IssmDouble* normal,IssmDouble* xyz_list)=0;
267 virtual int NumberofNodesPressure(void)=0;
268 virtual int NumberofNodesVelocity(void)=0;
269 virtual void PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
270 virtual int PressureInterpolation()=0;
271 virtual void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe)=0;
272 virtual void ResetFSBasalBoundaryCondition()=0;
273 virtual void ResetHooks()=0;
274 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
275 virtual void SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters)=0;
276 virtual void SetTemporaryElementType(int element_type_in)=0;
277 virtual Element* SpawnBasalElement(void)=0;
278 virtual Element* SpawnTopElement(void)=0;
279 virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0;
280 virtual void StrainRateparallel(void)=0;
281 virtual void StrainRateperpendicular(void)=0;
282 virtual void StressIntensityFactor(void)=0;
283 virtual IssmDouble SurfaceArea(void)=0;
284 virtual int TensorInterpolation()=0;
285 virtual IssmDouble TimeAdapt()=0;
286 virtual IssmDouble TotalSmb(void)=0;
287 virtual void Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
288 virtual void UpdateConstraintsExtrudeFromBase(void)=0;
289 virtual void UpdateConstraintsExtrudeFromTop(void)=0;
290 virtual int UpdatePotentialUngrounding(IssmDouble* potential_sheet_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
291 virtual void ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss)=0;
292 virtual void ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss)=0;
293 virtual int VelocityInterpolation()=0;
294 virtual int VertexConnectivity(int vertexindex)=0;
295 virtual void VerticalSegmentIndices(int** pindices,int* pnumseg)=0;
296 virtual void ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input)=0;
297 virtual void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0;
298
299 #ifdef _HAVE_GIA_
300 virtual void GiaDeflection(Vector<IssmDouble>* wg,Vector<IssmDouble>* dwgdt,IssmDouble* x,IssmDouble* y)=0;
301 #endif
302 #ifdef _HAVE_SEALEVELRISE_
303 virtual void Sealevelrise(Vector<IssmDouble>* pSgi,Vector<IssmDouble>* pSgo,IssmDouble* peustatic,IssmDouble* Sg_old,IssmDouble* Sgi_old,IssmDouble* Sgo_old,IssmDouble* x,IssmDouble* y,IssmDouble* z,IssmDouble oceanarea)=0;
304 virtual IssmDouble OceanArea(void)=0;
305 #endif
306
307};
308#endif
Note: See TracBrowser for help on using the repository browser.