File: ImplicitSolveOperator.h

package info (click to toggle)
lammps 20220106.git7586adbb6a%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 348,064 kB
  • sloc: cpp: 831,421; python: 24,896; xml: 14,949; f90: 10,845; ansic: 7,967; sh: 4,226; perl: 4,064; fortran: 2,424; makefile: 1,501; objc: 238; lisp: 163; csh: 16; awk: 14; tcl: 6
file content (91 lines) | stat: -rw-r--r-- 3,045 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef IMPLICIT_SOLVE_OPERATOR_H
#define IMPLICIT_SOLVE_OPERATOR_H

// ATC includes
#include "Array2D.h"
#include "MatrixLibrary.h"
#include "PhysicsModel.h"

// other includes
#include <vector>
#include <map>

namespace ATC {

// Forward class declarations
class ATC_Coupling;
class FE_Engine;

/**
 *  @class ImplicitSolveOperator
 *  @brief Helper class to compute matrix-free product for use with IML++ solvers
 */
class ImplicitSolveOperator {
 public:
  /** Constructor */
  ImplicitSolveOperator(double alpha, double dt);
  /** Destructor */
  virtual ~ImplicitSolveOperator() {};
  /** pure virtual operator to compute Ax, for equation Ax=b */
  virtual DENS_VEC operator * (const DENS_VEC &x) const;
  /** pure virtual method to return the rhs vector b */
  virtual void R(const DENS_VEC &f, DENS_VEC &v) const = 0;
  /** pure virtual method to return the rhs vector b */
  virtual DENS_VEC r() const;
  /** pure virtual method to return preconditioner */
  virtual DiagonalMatrix<double> preconditioner() const;
  /** finalize */
  virtual void solution(const DENS_MAT & dx, DENS_MAT &x) const = 0;
  virtual void rhs(const DENS_MAT & r, DENS_MAT &rhs) const = 0;
 protected:
  int n_,dof_;
  DENS_VEC x0_;             // condensed previous
  mutable DENS_VEC x_;      // condensed current
  DENS_VEC R0_;        // condensed previous
  mutable DENS_VEC R_; // condensed current
  double dt_; // timestep
  double alpha_; // implicit/explicit parameter (0 -> explicit, else implicit)
  double epsilon0_; // small parameter to compute increment
};

/**
 *  @class FieldImplicitSolveOperator
 *  @brief Class to perform A*x operation for electron temperature solution
 */
class FieldImplicitSolveOperator : public ImplicitSolveOperator {
 public:
  /** Constructor */
  FieldImplicitSolveOperator(ATC_Coupling * atc,
                             FIELDS & fields,
                             const FieldName f,
                             const Array2D< bool > & rhsMask,
                             const PhysicsModel * physicsModel,
                             double simTime, double dt, double alpha = 0.5);
  /** Destructor */
  virtual ~FieldImplicitSolveOperator() {};
  virtual void R(const DENS_VEC &f, DENS_VEC &v) const;
  virtual void solution(const DENS_MAT & dx, DENS_MAT &x) const;
  virtual void rhs(const DENS_MAT & r, DENS_MAT &rhs) const;
 protected:
  void to_all(const VECTOR& free, MATRIX& all) const;
  void to_free(const MATRIX& all, VECTOR& free) const;
  FieldName fieldName_; // field name of ODE to solve
  ATC_Coupling * atc_; /** Pointer to atc */
  const PhysicsModel * physicsModel_; /** Pointer to PhysicsModel */
  FIELDS & fields0_; // Reference to current fields (passed in constructor)
  // Local fields
  mutable FIELDS fields_; // full
  // set of fixed nodes
  std::map<int,int> freeNodes_;
  // masks
  Array2D<bool> rhsMask_;
  Array<FieldName> massMask_;
  // right hand side of dot x = R(x)
  mutable FIELDS rhs_; // full
  // simulation time
  double time_;
};

} // namespace ATC

#endif