gmsh-TingyuanDoc  0.1
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
solverField.h
Go to the documentation of this file.
1 // Gmsh - Copyright (C) 1997-2022 C. Geuzaine, J.-F. Remacle
2 //
3 // See the LICENSE.txt file in the Gmsh root directory for license information.
4 // Please report all issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
5 //
6 // Contributor(s):
7 // Eric Bechet
8 //
9 
10 #ifndef SOLVERFIELD_H
11 #define SOLVERFIELD_H
12 
13 #include <vector>
14 #include <iostream>
15 #include "MElement.h"
16 #include "dofManager.h"
17 #include "functionSpace.h"
18 
19 template <class T>
21  : public FunctionSpace<T> // being able to use it instead of a real function
22  // space is interesting (nbkeys=1, explicit
23  // keys/dofs undefined (or could be defined
24  // element-wise )
25 {
26 public:
30 
31 private:
34 
35 public:
37  {
38  }
39  virtual int getNumKeys(MVertex *ver) const { return 1; }
40  virtual int getNumKeys(MElement *ele) const { return 1; }
41 
42 private:
43  virtual void getKeys(MElement *ele, std::vector<Dof> &keys) const
44  {
45  Msg::Error("getKeys for SolverField shouldn't be called");
46  }
47  virtual void getKeys(MVertex *ver, std::vector<Dof> &keys) const
48  {
49  Msg::Error("getKeys for SolverField shouldn't be called");
50  }
51 
52 public:
53  virtual void f(MElement *ele, double u, double v, double w,
54  ValType &val) const
55  {
56  std::vector<Dof> D;
57  std::vector<ValType> SFVals;
58  std::vector<double> DMVals;
59  fs->getKeys(ele, D);
60  dm->getDofValue(D, DMVals);
61  fs->f(ele, u, v, w, SFVals);
62  val = ValType();
63  for(std::size_t i = 0; i < D.size(); ++i) val += SFVals[i] * DMVals[i];
64  }
65 
66  virtual void f(MElement *ele, double u, double v, double w,
67  std::vector<ValType> &vals) const
68  {
69  ValType val;
70  f(ele, u, v, w, val);
71  vals.push_back(val);
72  }
73 
74  virtual void gradf(MElement *ele, double u, double v, double w,
75  GradType &grad) const
76  {
77  std::vector<Dof> D;
78  std::vector<GradType> SFGrads;
79  std::vector<double> DMVals;
80  fs->getKeys(ele, D);
81  dm->getDofValue(D, DMVals);
82  fs->gradf(ele, u, v, w, SFGrads);
83  grad = GradType();
84  for(std::size_t i = 0; i < D.size(); ++i) grad += SFGrads[i] * DMVals[i];
85  }
86 
87  // A quoi sert cette fonction ?? (Evalue le hessien au noeuds
88  /* virtual void hessf(MElement *ele, double u, double v, double w, HessType
89  &hess)
90  {
91  // Pas besoin des dof etc
92  // std::vector<Dof> D;
93  std::vector<HessType> SFHess;
94  // std::vector<double> DMVals;
95  // fs->getKeys(ele, D);
96  // dm->getDofValue(D, DMVals);
97  fs->hessf(ele, u, v, w, SFHess);
98 
99  // hess = HessType;
100  // for (int i = 0; i < D.size(); ++i)
101  // hess += SFHess[i] * DMVals[i];
102  }*/
103 
104  virtual void gradf(MElement *ele, double u, double v, double w,
105  std::vector<GradType> &grads) const
106  {
107  GradType grad;
108  gradf(ele, u, v, w, grad);
109  grads.push_back(grad);
110  }
111  virtual void hessfuvw(MElement *ele, double u, double v, double w,
112  std::vector<HessType> &hess) const
113  {
114  // HessType hes;
115  fs->hessfuvw(ele, u, v, w, hess);
116  }
117 };
118 
119 /*
120 
121 class Formulation
122 {
123  std::vector<FunctionSpace<double>* > scalarfs;
124  std::vector<FunctionSpace<SVector3>* > vectorfs;
125  std::vector<groupOfElements* > groups;
126  std::vector<std::pair<MElement*, std::vector<groupOfElements&> > > links;
127  dofManager<double> *dm; //
128 
129 };
130 */
131 
132 #endif //_SOLVERFIELD_H_
SolverField::gradf
virtual void gradf(MElement *ele, double u, double v, double w, std::vector< GradType > &grads) const
Definition: solverField.h:104
D
#define D
Definition: DefaultOptions.h:24
SolverField::fs
FunctionSpace< T > * fs
Definition: solverField.h:33
SolverField::dm
dofManager< double > * dm
Definition: solverField.h:32
SolverField::GradType
TensorialTraits< T >::GradType GradType
Definition: solverField.h:28
MVertex
Definition: MVertex.h:24
Msg::Error
static void Error(const char *fmt,...)
Definition: GmshMessage.cpp:482
SolverField::HessType
TensorialTraits< T >::HessType HessType
Definition: solverField.h:29
SolverField::hessfuvw
virtual void hessfuvw(MElement *ele, double u, double v, double w, std::vector< HessType > &hess) const
Definition: solverField.h:111
SolverField::gradf
virtual void gradf(MElement *ele, double u, double v, double w, GradType &grad) const
Definition: solverField.h:74
SolverField::f
virtual void f(MElement *ele, double u, double v, double w, std::vector< ValType > &vals) const
Definition: solverField.h:66
SolverField::getNumKeys
virtual int getNumKeys(MVertex *ver) const
Definition: solverField.h:39
SolverField
Definition: solverField.h:25
SolverField::getNumKeys
virtual int getNumKeys(MElement *ele) const
Definition: solverField.h:40
TensorialTraits::ValType
T ValType
Definition: functionSpace.h:23
SolverField::getKeys
virtual void getKeys(MVertex *ver, std::vector< Dof > &keys) const
Definition: solverField.h:47
SolverField::ValType
TensorialTraits< T >::ValType ValType
Definition: solverField.h:27
dofManager< double >
MElement
Definition: MElement.h:30
dofManager.h
FunctionSpace::GradType
TensorialTraits< T >::GradType GradType
Definition: functionSpace.h:87
dofManager::getDofValue
virtual void getDofValue(std::vector< Dof > &keys, std::vector< dataVec > &Vals)
Definition: dofManager.h:235
FunctionSpace::ValType
TensorialTraits< T >::ValType ValType
Definition: functionSpace.h:86
MElement.h
FunctionSpace
Definition: functionSpace.h:82
TensorialTraits
Definition: functionSpace.h:22
SolverField::getKeys
virtual void getKeys(MElement *ele, std::vector< Dof > &keys) const
Definition: solverField.h:43
SolverField::SolverField
SolverField(dofManager< double > *dm_, FunctionSpace< T > *fs_)
Definition: solverField.h:36
functionSpace.h
SolverField::f
virtual void f(MElement *ele, double u, double v, double w, ValType &val) const
Definition: solverField.h:53