Alpine3D 20240513.cd14b8b
SnowDrift.h
Go to the documentation of this file.
1/***********************************************************************************/
2/* Copyright 2009-2015 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
3/***********************************************************************************/
4/* This file is part of Alpine3D.
5 Alpine3D is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 Alpine3D is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License
16 along with Alpine3D. If not, see <http://www.gnu.org/licenses/>.
17*/
18#ifndef SNOWDRIFTA3D_H
19#define SNOWDRIFTA3D_H
20
21#define WS0 0.5
22#define TKE 0
23#define SALTATION 1 // switch for saltation simulation
24#define SUBLIMATION 0 // switch for drifting snow sublimation
25#define FIELD3D_OUTPUT 0 // output with all three-dimensional fields (only possible for sublimation)
26#define SUBLIMATION_OUTPUT 0 // debug output of drifting snow sublimation
27#define T_FB 1 //switch for feedback between sublimation and air temperature
28#define Q_FB 1 //switch for feedback between sublimation and humidity
29#define C_FB 1 //switch for feedback between sublimation and snow concentration
30#define READK 0 //define as 1 if you have K from ARPS wind fields INCLUDING turbulence
31#define WRITE_DRIFT_FLUXES 0 //set to 1 in order to write snow drift fluxes
32#define dt_diff 0.5 /* Small calculation step length for snow diffusion */
33
34#include <stdio.h>
35#include <math.h>
36#include <stdlib.h>
37#include <iostream>
38#include <meteoio/MeteoIO.h>
39#include <meteoio/plugins/ARPSIO.h>
40
41typedef mio::Array2D<int> CElementArray;
42typedef mio::Array1D<double> CDoubleArray;
43typedef mio::Array1D<int> CIntArray;
44
48
49#pragma GCC diagnostic push
50#pragma GCC diagnostic ignored "-Weffc++"
51
53class EnergyBalance;
54
55typedef enum DRIFT_OUTPUT_ENUM {OUT_CONC, OUT_SUBL} DRIFT_OUTPUT;
56typedef enum PARAM_TYPES {CON,HUM,SUB,TEM,SUB2} param_type;
57typedef enum ASPECT_TYPES {OTHER,BOTTOM} aspect_type;
58
59struct WIND_FIELD {unsigned int start_step;std::string wind;};
60
79 public:
80 SnowDriftA3D(const mio::DEMObject& dem, const mio::Config& cfg);
81
82 virtual ~SnowDriftA3D();
83
84 virtual void setSnowSurfaceData(const mio::Grid2DObject& cH_in, const mio::Grid2DObject& sp_in, const mio::Grid2DObject& rg_in,
85 const mio::Grid2DObject& N3_in, const mio::Grid2DObject& rb_in);
86
87 void setSnowPack(SnowpackInterface &mysnowpack);
88
89 virtual void Compute(const mio::Date& calcDate);
90 bool isNewWindField(const unsigned int current_step) /*const*/;
91 void setMeteo (const unsigned int& steps, const mio::Grid2DObject& new_psum, const mio::Grid2DObject& new_psum_ph,
92 const mio::Grid2DObject& new_p, mio::Grid2DObject& vw, mio::Grid2DObject& dw,
93 const mio::Grid2DObject& new_rh, const mio::Grid2DObject& new_ta,
94 const std::vector<mio::MeteoData>& vecMeteo);
95
96 void GetTResults(double outtime_v[15], double outtime_tau[15], double outtime_salt[15], double outtime_diff[15]);
97
98 double getTiming() const;
99
100 void Destroy();
101
102 std::string getGridsRequirements() const;
103
104 protected:
105 void Initialize();
106 void ConstructElements();
107 void InitializeNodes(const mio::Grid3DObject& z_readMatr);
108 void CompleteNodes();
109
110 virtual void compSaltation(bool setbound);
111 virtual void SnowMassChange(bool setbound, const mio::Date& calcDate);
112 virtual void Suspension();
113 virtual void Diffusion(double deltaT, double &diff_max, double t);
114
115
116 //sublimation functions begin
117 virtual void Sublimation();
118 double terminalFallVelocity(const double Radius, const double Temperature, const double RH, const double altitude);
119 double calcS(const double concentration, const double sublradius, const double dmdt);
120 double calcSubldM(const double Radius, const double AirTemperature, const double RH,const double WindSpeed, const double altitude);
121 double reynoldsNumberforFallingParticles(const double Radius, const double Windspeed, const double AirTemperature, const double RH, const double altitude);
122 double ventilationVelocity(const double Radius, const double Windspeed,const double AirTemperature, const double RH, const double altitude);
123 double waterVaporDensity(const double Temperature,const double VaporPressure);
124 double RH_from_q(const double AirTemp, const double q, const double altitude);
125 void initializeTRH();
126 //sublimation functions end
127
128 //---------------------------------------------------------------------
129 //functions which are required for the fe numerics
130 //defined in SnowDriftFENumerics.cc
131 //---------------------------------------------------------------------
132 //bare numerics for element computations, i.e. integrations, jacobian and auxiliary stuff
133 virtual void Jacobian(double *DETERMINANTJ,double J[][3],const int element, const double *P, int k, const int ix, const int iy, const int iz);
134 virtual void J0fun(double J0[3][3], const double J[3][3]);
135 virtual double GQIntB(double *DETERMINANTJ,const int i, const int j);
136 virtual double GQIntC(double * DETERMINANTJ, const double J0M[3][3][8], const int i, const int j, const double b[3],const double K[3][3]);
137 virtual double GQIntApdx(double DETERMINANTJ[],const double J0M[3][3][8],const int i, const int j, double b[],const double deltak);
138 virtual double GQIntAdxdx(double *DETERMINANTJ, double J0M[3][3][8],const int i, const int j, double *b,const double deltak);
139 virtual void TTfun(double TT[3][8],const double P[]); // P is a pointer pointing at an adress containing a double
140 virtual void phi(double*PHI, double*P);
141 virtual void setQuadraturePoints();
142
143 //functions required for solving the linear system
144 virtual void matmult(CDoubleArray& res, const CDoubleArray& x, double* sm, int* ijm);
145 virtual void matmult(CDoubleArray& res, const CDoubleArray& x, const CDoubleArray& sA, const CIntArray& colA, CIntArray& rowA);
146 virtual void transmult(CDoubleArray& res, const CDoubleArray& x,double* sm, int* ijm);
147 virtual void SolveEquation(int timeStep, int maxTimeStep, const param_type param );
148 virtual void bicgStab(CDoubleArray& result, CDoubleArray& rhs, const CDoubleArray& sA, const CIntArray& colA, CIntArray& rowA, const int nmax, const double tol, double& testres);
149
150
151 //---------------------------------------------------------------------
152 // finite Element functions, basically wrappers for the bare
153 // numerics. Basically two different "classes" of functions, the
154 // first (assembleSystem, applyBoundaryValues, computeDepositionFlux)
155 // contain loops over all or a particular subset of elements and then
156 // invoke the other class of functions which wrap the numerics for
157 // each element (computeDiffusionTensor, computeDriftVector,
158 // computeElementParameter,
159 // computeElementSystem,computeDirichletBoundaryValues,
160 // addElementMatrix
161 //
162 // all these functions are defined in SnowDriftFEControl.cc
163 //---------------------------------------------------------------------
166 virtual void prepareSolve();
167
168
169 //functions which are required for building the element matrices,
170 virtual void computeDiffusionTensor(double K[3][3], const unsigned int ix, const unsigned int iy, const unsigned int iz);
171 virtual void computeDriftVector(double b[3], const unsigned int ix, const unsigned int iy, const unsigned int iz );
172 virtual void computeElementParameters(const int& element, double DETERMINANTJ[8], double J0M[3][3][8], double J0[3][3], double J[3][3], double b[3], double K[3][3], double& deltak, double& qualla, const int ix, const int iy, const int iz);
173
174 virtual void computeElementSystem(int &element, int &nDofNodes, int* dofNode, double Ael[9][9], double Del[9][9], bool stationary, double DETERMINANTJ[8], double J0M[3][3][8], double b[3], double K[3][3], double &deltak, const double &dt, CDoubleArray& f, CDoubleArray& Psi);
175
176 virtual void computeDirichletBoundaryValues(int element,double DETERMINANTJ[8],double J0M[3][3][8], double J0[3][3], double b[3], double K[3][3], double deltak, int spec[8], int length_spec, int length_complSpec, CDoubleArray& c00, CDoubleArray& Psi);
177
178 virtual void addElementMatrix( CDoubleArray& sA, const CIntArray& colInd, const CIntArray& rowPtr,const double Bel[9][9], const int element, const int* spec,const int length_spec);
179
180 virtual void computeDepositionFlux(const CDoubleArray& c, const double theta);
181 virtual void computeDepositionFluxSublimation(const CDoubleArray& c, const double theta);
182
183
184 //---------------------------------------------------------------------
185 // Functions for initializing the finite element procedure
186 // defined in SnowDriftFEInit.cc
187 //---------------------------------------------------------------------
188 void setBC_BottomLayer(CDoubleArray& var00, const param_type param);
189 void values_nodes_to_elements(const mio::Grid3DObject& nodesGrid, CDoubleArray& elementsArray );
190 void values_elements_to_nodes(mio::Grid3DObject& nodesGrid, const CDoubleArray& elementsArray );
191 void setRobinBoundaryCondition(const aspect_type aspect, const double gamma_val, const int ix, const int iy, const int iz, CDoubleArray& var00, const param_type param);
192 virtual void InitializeFEData();
195 virtual void resetArray(CDoubleArray& sA);
196 virtual void resetArray(CIntArray& sA);
197 virtual void classifySubdomain();
198 virtual int numberOfNonzeros();
199 void iterativeSublimationCalculation(int timeStep, int maxTimeStep);
200
201 protected:
202 Saltation saltation_obj;
203
204 //Time dependent data output after each computation step (SnowDrift::Compute)
205 double time_v[15], time_tau[15], time_salt[15], time_diff[15];
209
210 mio::IOManager io;
212 mio::Timer timer;
213
214 mio::Grid2DObject cH;
215 mio::Grid2DObject sp;
216 mio::Grid2DObject rg;
217 mio::Grid2DObject N3;
218 mio::Grid2DObject rb;
219
220 //the dimensions of the rectangular domain
221 unsigned int nx, ny, nz;
222
223 // Variables for the finite element solution
224 unsigned int nDOF; //the total number of degrees of freedom
225 unsigned int nNodes; //the total number of nodes
226 unsigned int nElements; //the total number of elements
227 unsigned int nNZ; //the total number of nonzero elements of the system matrix
228
229 //create system matrix in compressed sparse row (CSR) storage format
234
235 //auxiliary vector for incorporating inhomogeneous Dirichlet
236 //boundary conditions
238
239 //vector of nodal concentrations, solution of the linear system
240 CDoubleArray c; //snow concentration in suspension
241 CDoubleArray q; //specific humidity
242 CDoubleArray T; //potential temperature
243
244 //vector which contains the right hand side of the linear system
246
247 //vector of sink/source terms
249
250 //vector which contains boundary and initial conditions
254
255 //vector which contains boundary and initial conditions
257 //mio::Grid3DObject newElements_precond;
258 //LH_BC
262 void zeroRow(int node);
263
264 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
265 //LH_DEBUG: Algorithm test BEGIN
268 //LH_DEBUG: Algorithm test END
269 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270
271
272 double qualla;// paramater to vary the deltak coefficient of the SUPG approach
273
274 double theta; // here you can vary the heigth above the point used in
275
276 //the face,bar,corner interior arrays are used for the loops over
277 //all elements and are set in classifySubdomain, see there for details
278 mio::Array2D<int> nz_face;
279 mio::Array2D<int> ny_face;
280 mio::Array2D<int> nx_face;
281
282 mio::Array2D<int> nz_bar;
283 mio::Array2D<int> ny_bar;
284 mio::Array2D<int> nx_bar;
285
286 mio::Array2D<int> nz_interior;
287 mio::Array2D<int> ny_interior;
288 mio::Array2D<int> nx_interior;
289
291
292 //for the quadrature points of the numerical integration scheme
293 mio::Array2D<double> qPoint;
294
295 //array for mapping the local node indices onto the global nodes
296 //indices (actually this is the analog of the array elems of the old code)
298
299 //array for mapping the local node indices onto the global
300 //degree-of-freedom (dof) indices
302
304
306
309
310 //Meteo 2D data
311 mio::Grid2DObject mns, vw, rh, ta, p, psum, psum_ph/*, iswr, ea*/; // TODO ISWR activate, TODO EA activate
312
313 //Meteo 1D data
314 double ta_1D;
315
316 mio::Date skip_date; //time step to skip because there would be no drift
317
318 //3D
320 mio::Grid3DObject nodes_u, nodes_v, nodes_w, nodes_K;
321 mio::Grid3DObject nodes_e, nodes_c;
324
325 void buildWindFieldsTable(const std::string& wind_field_string);
326 std::vector<struct WIND_FIELD> wind_fields;
328
329 void debugOutputs(const mio::Date& calcDate, const std::string& fname, const DRIFT_OUTPUT& filetype);
330 void writeOutput(const std::string& fname); //HACK: this should be done by MeteoIO
331
332 //sublimation constants
334
335 // constants originally from Snowpack
336 static const double c_red, grain_size, tau_thresh, z0;
337 static const bool thresh_snow;
338};
339
340#pragma GCC diagnostic pop
341
342#endif
static int steps
Definition: AlpineMain.cc:48
mio::Array1D< double > CDoubleArray
Definition: SnowDrift.h:42
param_type
Definition: SnowDrift.h:56
@ SUB
Definition: SnowDrift.h:56
@ HUM
Definition: SnowDrift.h:56
@ SUB2
Definition: SnowDrift.h:56
@ TEM
Definition: SnowDrift.h:56
@ CON
Definition: SnowDrift.h:56
aspect_type
Definition: SnowDrift.h:57
@ BOTTOM
Definition: SnowDrift.h:57
@ OTHER
Definition: SnowDrift.h:57
mio::Array2D< int > CElementArray
Definition: SnowDrift.h:41
mio::Array1D< int > CIntArray
Definition: SnowDrift.h:43
DRIFT_OUTPUT
Definition: SnowDrift.h:55
@ OUT_SUBL
Definition: SnowDrift.h:55
@ OUT_CONC
Definition: SnowDrift.h:55
Definition: EnergyBalance.h:70
Definition: SnowDrift.h:78
mio::Grid3DObject nodes_v
Definition: SnowDrift.h:320
double getTiming() const
Definition: SnowDrift.cc:154
mio::Grid3DObject nodes_K
Definition: SnowDrift.h:320
std::string getGridsRequirements() const
Definition: SnowDrift.cc:76
mio::Grid3DObject nodes_u
Definition: SnowDrift.h:320
void debugOutputs(const mio::Date &calcDate, const std::string &fname, const DRIFT_OUTPUT &filetype)
Definition: SnowDrift.cc:724
mio::Array2D< double > qPoint
Definition: SnowDrift.h:293
SnowDriftA3D(const mio::DEMObject &dem, const mio::Config &cfg)
Definition: SnowDrift.cc:50
void iterativeSublimationCalculation(int timeStep, int maxTimeStep)
Calculate the steady state sublimation in several steps. Single feedbacks can be switched on or off i...
Definition: Suspension.cc:199
void Initialize()
Initialize for snowdrift Allocate saltation variable, snow height and new snow mass per bottom elemen...
Definition: SnowDrift.cc:121
double time_v[15]
Definition: SnowDrift.h:205
static const double grain_size
Definition: SnowDrift.h:336
virtual void classifySubdomain()
Description... this functions sets summation limits for the loops over boundary elements (faces,...
Definition: SnowDriftFEInit.cc:118
virtual double GQIntC(double *DETERMINANTJ, const double J0M[3][3][8], const int i, const int j, const double b[3], const double K[3][3])
GQIntC returns the integral of the product of the gradients of basis functions i and j over a hexahed...
Definition: SnowDriftFENumerics.cc:204
mio::Array2D< int > nz_interior
Definition: SnowDrift.h:286
mio::Array2D< double > mns_nosubl
Definition: SnowDrift.h:308
CDoubleArray adjA
Definition: SnowDrift.h:267
mio::Grid2DObject sp
Definition: SnowDrift.h:215
unsigned int ny
Definition: SnowDrift.h:221
double terminalFallVelocity(const double Radius, const double Temperature, const double RH, const double altitude)
Terminal fall velocity NB assumed to be 0.5.
Definition: Sublimation.cc:146
unsigned int nx
Definition: SnowDrift.h:221
mio::Grid2DObject psum_ph
Definition: SnowDrift.h:311
mio::Array2D< int > nx_interior
Definition: SnowDrift.h:288
CDoubleArray flux_y
Definition: SnowDrift.h:303
CDoubleArray flux_x_subl
Definition: SnowDrift.h:303
CElementArray nodeMap
Definition: SnowDrift.h:297
CDoubleArray f
Definition: SnowDrift.h:248
double time_salt[15]
Definition: SnowDrift.h:205
virtual ~SnowDriftA3D()
Definition: SnowDrift.cc:159
mio::Grid3DObject nodes_Tair_ini
Definition: SnowDrift.h:322
void CompleteNodes()
Initialize concentration according to the rain rate (uniform) Now calculate the missing parameters Sl...
Definition: SnowDrift.cc:169
mio::Grid3DObject nodes_sx
Definition: SnowDrift.h:319
CDoubleArray sA
Definition: SnowDrift.h:230
mio::Array2D< double > mns_subl
Definition: SnowDrift.h:308
virtual void computeElementParameters(const int &element, double DETERMINANTJ[8], double J0M[3][3][8], double J0[3][3], double J[3][3], double b[3], double K[3][3], double &deltak, double &qualla, const int ix, const int iy, const int iz)
Compute parameters of the SUPG method Compute the parameters of the SUPG method for each element.
Definition: SnowDriftFEControl.cc:453
virtual void Sublimation()
Sublimation Calculates drifting snow sublimation at every node of the concentration field.
Definition: Sublimation.cc:33
mio::Grid3DObject nodes_c
Definition: SnowDrift.h:321
mio::Grid2DObject rh
Definition: SnowDrift.h:311
unsigned int nDOF
Definition: SnowDrift.h:224
CDoubleArray Psi
Definition: SnowDrift.h:237
static const double kinematicViscosityAir
Definition: SnowDrift.h:333
virtual void SnowMassChange(bool setbound, const mio::Date &calcDate)
Definition: SnowDrift.cc:390
virtual void SolveEquation(int timeStep, int maxTimeStep, const param_type param)
Solve the advection diffusion equation.
Definition: Suspension.cc:123
CDoubleArray sB
Definition: SnowDrift.h:231
CDoubleArray rhs
Definition: SnowDrift.h:245
virtual void initializeSystem(CIntArray &colA, CIntArray &rowA, CDoubleArray &sA, CDoubleArray &sB, CDoubleArray &rhs, CDoubleArray &f, CDoubleArray &Psi, CDoubleArray &var, CDoubleArray &var00, const param_type param)
Initialize system initializes vectors for the algorithm required for each time step.
Definition: SnowDriftFEInit.cc:390
mio::Array2D< int > nz_bar
Definition: SnowDrift.h:282
unsigned int nz
Definition: SnowDrift.h:221
void values_nodes_to_elements(const mio::Grid3DObject &nodesGrid, CDoubleArray &elementsArray)
nodes_to_elements
Definition: SnowDriftFEInit.cc:473
mio::Array2D< double > c_salt
Definition: SnowDrift.h:308
virtual void resetArray(CDoubleArray &sA)
Definition: SnowDriftFEInit.cc:461
virtual void computeDiffusionTensor(double K[3][3], const unsigned int ix, const unsigned int iy, const unsigned int iz)
Compute diffusion tensor Computes the diffusion tensor of an element, accesses the nodes array and th...
Definition: SnowDriftFEControl.cc:343
mio::Grid3DObject nodes_Tair
Definition: SnowDrift.h:322
double auxLayerHeight
Definition: SnowDrift.h:207
CDoubleArray flux_x
Definition: SnowDrift.h:303
mio::Array2D< int > nz_face
Definition: SnowDrift.h:278
int DOITERATION
Definition: SnowDrift.h:206
mio::Grid2DObject N3
Definition: SnowDrift.h:217
virtual void compSaltation(bool setbound)
Calculate Saltation Fluxes for all Bottom Elements.
Definition: Saltation.cc:51
mio::Grid3DObject nodes_sy
Definition: SnowDrift.h:319
unsigned int nNodes
Definition: SnowDrift.h:225
CIntArray nnzA
Definition: SnowDrift.h:266
mio::Array2D< int > nx_face
Definition: SnowDrift.h:280
void initializeTRH()
Initialize RH, T and q Initialize fields of humidity and temperature, necessary for sublimation calcu...
Definition: SnowDrift.cc:835
virtual void matmult(CDoubleArray &res, const CDoubleArray &x, double *sm, int *ijm)
matmult computes a matrix vector product for a sparse matrix
Definition: SnowDriftFENumerics.cc:485
CDoubleArray flux_y_subl
Definition: SnowDrift.h:303
mio::Grid3DObject nodes_z
Definition: SnowDrift.h:319
virtual void computeDepositionFlux(const CDoubleArray &c, const double theta)
compute deposition flux Authors : Marc Ryser Description : calculates the deposition flux i....
Definition: SnowDriftFEControl.cc:839
mio::Grid2DObject rg
Definition: SnowDrift.h:216
void InitializeNodes(const mio::Grid3DObject &z_readMatr)
Initialize nodes Each (3D) node receives its (x,y,z), slope, aspect, normals.
Definition: SnowDrift.cc:230
static const double molecularWeightofWater
Definition: SnowDrift.h:333
mio::Grid3DObject nodes_tmp_c
Definition: SnowDrift.h:322
virtual void transmult(CDoubleArray &res, const CDoubleArray &x, double *sm, int *ijm)
transmult this is the transmult function that multiplies the vector x by the transpose of the matrix ...
Definition: SnowDriftFENumerics.cc:537
CDoubleArray precond
Definition: SnowDrift.h:256
void setBC_BottomLayer(CDoubleArray &var00, const param_type param)
Set Bottom Boundary Condition Set the boundary condition of bottom layer +intialize concentration in ...
Definition: SnowDriftFEInit.cc:320
virtual void prepareSparseMatrix(CIntArray &colA, CIntArray &rowA, CDoubleArray &adjA)
prepare sparse matrix Description : generates the auxiliary arrays (i.e. the arrays row-pointer and c...
Definition: SnowDriftFEInit.cc:248
mio::Grid2DObject psum
Definition: SnowDrift.h:311
virtual void setQuadraturePoints()
Definition: SnowDriftFENumerics.cc:51
CDoubleArray c
Definition: SnowDrift.h:240
mio::Grid3DObject nodes_Subl_ini
Definition: SnowDrift.h:322
virtual void computeDepositionFluxSublimation(const CDoubleArray &c, const double theta)
compute deposition flux Authors : Marc Ryser Description : calculates the deposition flux i....
Definition: SnowDriftFEControl.cc:940
static const bool thresh_snow
Definition: SnowDrift.h:337
CDoubleArray q00
Definition: SnowDrift.h:252
mio::Grid3DObject nodes_x
Definition: SnowDrift.h:319
bool STATIONARY
Definition: SnowDrift.h:323
mio::Grid2DObject cH
Definition: SnowDrift.h:214
CElementArray elems
Definition: SnowDrift.h:307
virtual void addElementMatrix(CDoubleArray &sA, const CIntArray &colInd, const CIntArray &rowPtr, const double Bel[9][9], const int element, const int *spec, const int length_spec)
Add element matrix given a sparse matrix A in CSR format ( specified by sA, colInd,...
Definition: SnowDriftFEControl.cc:642
virtual void Diffusion(double deltaT, double &diff_max, double t)
Definition: Suspension.cc:31
mio::Array2D< double > saltation
Definition: SnowDrift.h:308
virtual void setSnowSurfaceData(const mio::Grid2DObject &cH_in, const mio::Grid2DObject &sp_in, const mio::Grid2DObject &rg_in, const mio::Grid2DObject &N3_in, const mio::Grid2DObject &rb_in)
Definition: SnowDrift.cc:714
static const double c_red
Definition: SnowDrift.h:336
double station_altitude
Definition: SnowDrift.h:208
virtual void computeDriftVector(double b[3], const unsigned int ix, const unsigned int iy, const unsigned int iz)
Compute the drift vector of an element.
Definition: SnowDriftFEControl.cc:421
void buildWindFieldsTable(const std::string &wind_field_string)
Definition: SnowDrift.cc:81
mio::Grid3DObject nodes_w
Definition: SnowDrift.h:320
double RH_from_q(const double AirTemp, const double q, const double altitude)
Relative humidity Gives the relative humidity for a given air temperature and specific humidity.
Definition: Sublimation.cc:166
virtual void Suspension()
Definition: Suspension.cc:40
virtual void assembleSystem(CIntArray &colA, CIntArray &rowA, CDoubleArray &sA, CDoubleArray &sB, CDoubleArray &Psi, CDoubleArray &f, const double dt)
Assemble System loop over all elements, updates the system matrices A, B and the 'bare' right hand si...
Definition: SnowDriftFEControl.cc:43
CDoubleArray q
Definition: SnowDrift.h:241
mio::Grid2DObject p
Definition: SnowDrift.h:311
Saltation saltation_obj
Definition: SnowDrift.h:202
mio::Date skip_date
Definition: SnowDrift.h:316
CDoubleArray flux_z
Definition: SnowDrift.h:303
CDoubleArray T00
Definition: SnowDrift.h:253
CIntArray colA
Definition: SnowDrift.h:232
mio::Grid3DObject nodes_q
Definition: SnowDrift.h:322
mio::Grid3DObject nodes_y
Definition: SnowDrift.h:319
mio::Grid3DObject nodes_Subl
Definition: SnowDrift.h:322
mio::Array2D< int > ny_bar
Definition: SnowDrift.h:283
unsigned int nElements
Definition: SnowDrift.h:226
double waterVaporDensity(const double Temperature, const double VaporPressure)
CDoubleArray gDirichlet
Definition: SnowDrift.h:260
void writeOutput(const std::string &fname)
Write output Writes the values of several nodes-fields.
Definition: SnowDrift.cc:738
mio::Array2D< int > ny_interior
Definition: SnowDrift.h:287
mio::Grid3DObject nodes_q_ini
Definition: SnowDrift.h:322
mio::Array2D< double > dif_mns_subl
Definition: SnowDrift.h:308
mio::Grid3DObject nodes_e
Definition: SnowDrift.h:321
mio::Grid2DObject ta
Definition: SnowDrift.h:311
CDoubleArray T
Definition: SnowDrift.h:242
mio::Grid3DObject nodes_slope
Definition: SnowDrift.h:319
bool isNewWindField(const unsigned int current_step)
Definition: SnowDrift.cc:104
virtual double GQIntApdx(double DETERMINANTJ[], const double J0M[3][3][8], const int i, const int j, double b[], const double deltak)
GQIntApdx returns the integral of the product of a basis function i and the gradient of basis functio...
Definition: SnowDriftFENumerics.cc:298
int wind_field_index
Definition: SnowDrift.h:327
virtual double GQIntAdxdx(double *DETERMINANTJ, double J0M[3][3][8], const int i, const int j, double *b, const double deltak)
GQIntAdxdx ...
Definition: SnowDriftFENumerics.cc:352
double time_diff[15]
Definition: SnowDrift.h:205
SnowpackInterface * snowpack
Definition: SnowDrift.h:211
mio::Grid3DObject nodes_wstar
Definition: SnowDrift.h:319
virtual void computeElementSystem(int &element, int &nDofNodes, int *dofNode, double Ael[9][9], double Del[9][9], bool stationary, double DETERMINANTJ[8], double J0M[3][3][8], double b[3], double K[3][3], double &deltak, const double &dt, CDoubleArray &f, CDoubleArray &Psi)
compute element system ....
Definition: SnowDriftFEControl.cc:540
static const double thermalConductivityofAtm
Definition: SnowDrift.h:333
static const double USTAR
Definition: SnowDrift.h:333
mio::Grid2DObject mns
Definition: SnowDrift.h:311
virtual int numberOfNonzeros()
Number of nonzero elements of the finite element system matrix Description : computes the number of n...
Definition: SnowDriftFEInit.cc:216
CDoubleArray c00
Definition: SnowDrift.h:251
virtual void computeDirichletBoundaryValues(int element, double DETERMINANTJ[8], double J0M[3][3][8], double J0[3][3], double b[3], double K[3][3], double deltak, int spec[8], int length_spec, int length_complSpec, CDoubleArray &c00, CDoubleArray &Psi)
Definition: SnowDriftFEControl.cc:721
static const double tau_thresh
Definition: SnowDrift.h:336
virtual void prepareSolve()
prepareSolve Some preparations to solve a 3D-field.
Definition: Suspension.cc:361
static const double z0
Definition: SnowDrift.h:336
mio::Array2D< int > nx_bar
Definition: SnowDrift.h:284
void setMeteo(const unsigned int &steps, const mio::Grid2DObject &new_psum, const mio::Grid2DObject &new_psum_ph, const mio::Grid2DObject &new_p, mio::Grid2DObject &vw, mio::Grid2DObject &dw, const mio::Grid2DObject &new_rh, const mio::Grid2DObject &new_ta, const std::vector< mio::MeteoData > &vecMeteo)
Sets the required meteo fields.
Definition: SnowDrift.cc:777
double calcSubldM(const double Radius, const double AirTemperature, const double RH, const double WindSpeed, const double altitude)
Calculate sublimation mass change This function calculates the mass change of a single ice particle f...
Definition: Sublimation.cc:60
mio::Grid2DObject vw
Definition: SnowDrift.h:311
void values_elements_to_nodes(mio::Grid3DObject &nodesGrid, const CDoubleArray &elementsArray)
elements_to_nodes Extract a 3D-grid of nodes from an array of elements
Definition: SnowDriftFEInit.cc:511
CDoubleArray gamma
Definition: SnowDrift.h:261
double ta_1D
Definition: SnowDrift.h:314
virtual void phi(double *PHI, double *P)
Phi - shape functions Calculates the value of the 8 shape functions at point P.
Definition: SnowDriftFENumerics.cc:463
double reynoldsNumberforFallingParticles(const double Radius, const double Windspeed, const double AirTemperature, const double RH, const double altitude)
Reynolds number Calculate the Reynolds number for a falling particle.
Definition: Sublimation.cc:114
void setSnowPack(SnowpackInterface &mysnowpack)
Definition: SnowDrift.cc:709
void Destroy()
Definition: SnowDrift.cc:152
double time_tau[15]
Definition: SnowDrift.h:205
bool new_wind_status
Definition: SnowDrift.h:305
virtual void Compute(const mio::Date &calcDate)
Main: Calls the essential routines.
Definition: SnowDrift.cc:655
unsigned int nNZ
Definition: SnowDrift.h:227
void zeroRow(int node)
Definition: SnowDriftFEControl.cc:1029
CIntArray rowA
Definition: SnowDrift.h:233
virtual void TTfun(double TT[3][8], const double P[])
TT function TTfun is a function calculating the values of the partial derivative of phi at the point ...
Definition: SnowDriftFENumerics.cc:422
virtual double GQIntB(double *DETERMINANTJ, const int i, const int j)
GQIntB returns the integral of the product of basis functions i and j over a hexahedral element using...
Definition: SnowDriftFENumerics.cc:171
void ConstructElements()
Definition: SnowDrift.cc:312
double theta
Definition: SnowDrift.h:274
CDoubleArray flux_z_subl
Definition: SnowDrift.h:303
virtual void applyBoundaryValues(CDoubleArray &c00, CDoubleArray &Psi)
applyBoundaryValues Apply boundary values to all elements Author: Marc Ryser
Definition: SnowDriftFEControl.cc:206
mio::Timer timer
Definition: SnowDrift.h:212
std::vector< struct WIND_FIELD > wind_fields
Definition: SnowDrift.h:326
mio::IOManager io
Definition: SnowDrift.h:210
CIntArray n_corner
Definition: SnowDrift.h:290
mio::Array2D< int > ny_face
Definition: SnowDrift.h:279
CElementArray dofMap
Definition: SnowDrift.h:301
CDoubleArray gNeumann
Definition: SnowDrift.h:259
virtual void Jacobian(double *DETERMINANTJ, double J[][3], const int element, const double *P, int k, const int ix, const int iy, const int iz)
Compute Jacobian This function calculates the Jacobian at the given point P and and stores the value ...
Definition: SnowDriftFENumerics.cc:79
mio::Grid3DObject nodes_RH
Definition: SnowDrift.h:322
mio::Grid2DObject rb
Definition: SnowDrift.h:218
mio::Grid3DObject nodes_WindVel
Definition: SnowDrift.h:322
double ventilationVelocity(const double Radius, const double Windspeed, const double AirTemperature, const double RH, const double altitude)
Ventilation velocity.
Definition: Sublimation.cc:129
virtual void J0fun(double J0[3][3], const double J[3][3])
J0 function computes the matrix of cofactors of the input matrix J and stores it in J0.
Definition: SnowDriftFENumerics.cc:145
virtual void InitializeFEData()
Initializes system size and all data members which are required for the finite element solution.
Definition: SnowDriftFEInit.cc:32
double calcS(const double concentration, const double sublradius, const double dmdt)
Calculate sublimation The mass change of a single particle is now extended to all particles.
Definition: Sublimation.cc:100
void GetTResults(double outtime_v[15], double outtime_tau[15], double outtime_salt[15], double outtime_diff[15])
Definition: SnowDrift.cc:700
double qualla
Definition: SnowDrift.h:272
void setRobinBoundaryCondition(const aspect_type aspect, const double gamma_val, const int ix, const int iy, const int iz, CDoubleArray &var00, const param_type param)
Set Robin Boundary Condition.
Definition: SnowDriftFEInit.cc:362
virtual void bicgStab(CDoubleArray &result, CDoubleArray &rhs, const CDoubleArray &sA, const CIntArray &colA, CIntArray &rowA, const int nmax, const double tol, double &testres)
bicgStab iterative equation solver iterative equation solver Tests : Tested by the followin procedure...
Definition: SnowDriftFENumerics.cc:570
Definition: SnowpackInterface.h:126
Definition: SnowDrift.h:59
unsigned int start_step
Definition: SnowDrift.h:59
std::string wind
Definition: SnowDrift.h:59