File: FieldManager.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 (132 lines) | stat: -rw-r--r-- 5,910 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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef FIELD_MANAGER_H
#define FIELD_MANAGER_H

#include <string>

#include "ATC_TypeDefs.h"
#include "ATC_Error.h"
#include "PerAtomQuantity.h"

namespace ATC {
  class ATC_Method;
  enum CanonicalName {ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY,
                      ATOMIC_TWICE_KINETIC_ENERGY,
                      ATOMIC_FLUCTUATING_VELOCITY,
                      ATOMIC_CHARGE_VELOCITY,
                      ATOMIC_SPECIES_VELOCITY,
                      PROLONGED_VELOCITY};
  typedef PerAtomQuantity<double> PAQ;
  /**
   *  @class  FieldManager
   *  @brief  Manager for constructing fields from atomic data
   */
  class FieldManager{

  public:
    FieldManager(ATC_Method * atc);
    virtual ~FieldManager(void){};
    /** this function returns a (density) field derived from atomic data */
    DENS_MAN * nodal_atomic_field(FieldName fieldName,
                                  std::string name = "default") {
      switch (fieldName) {
      case CHARGE_DENSITY:        return charge_density(name);
      case MASS_DENSITY:          return mass_density(name);
      case SPECIES_CONCENTRATION: return species_concentration(name);
      case NUMBER_DENSITY:        return number_density(name);
      case MOMENTUM:              return momentum(name);
      case VELOCITY:              return velocity(name);
      case PROJECTED_VELOCITY:    return projected_velocity(name);
      case DISPLACEMENT:          return displacement(name);
      case REFERENCE_POTENTIAL_ENERGY:   return reference_potential_energy(name);
      case POTENTIAL_ENERGY:      return potential_energy(name);
      case THERMAL_ENERGY:        return thermal_energy(name);
      case KINETIC_ENERGY:        return kinetic_energy(name);
      case TEMPERATURE:           return temperature(name);
      case KINETIC_TEMPERATURE:   return kinetic_temperature(name);
      case CHARGE_FLUX:           return charge_flux(name);
      case SPECIES_FLUX:          return species_flux(name);
      case INTERNAL_ENERGY:       return internal_energy(name);
      case ENERGY:                return energy(name);
      default: throw ATC_Error("FieldManager:: unknown field"); return nullptr;
      }
    }
    CanonicalName string_to_canonical_name(std::string name){
       if      (name == "AtomicTwiceFluctuatingKineticEnergy")
         return ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY;
       else if (name == "AtomicTwiceKineticEnergy")
         return ATOMIC_TWICE_KINETIC_ENERGY;
       else if (name == "AtomicTwiceKineticEnergy")
         return ATOMIC_TWICE_KINETIC_ENERGY;
       else if (name == "AtomicFluctuatingVelocity")
         return ATOMIC_FLUCTUATING_VELOCITY;
       else if (name == "AtomicChargeVelocity") // ionic current
         return ATOMIC_CHARGE_VELOCITY;
       else if (name == "AtomicSpeciesVelocity") // per species momentum
         return ATOMIC_SPECIES_VELOCITY;
       else if (name == field_to_prolongation_name(VELOCITY))
         return PROLONGED_VELOCITY;
       else
         throw ATC_Error("unknown canonical name "+name);
    }
    PAQ * per_atom_quantity(std::string name) {
      switch (string_to_canonical_name(name)) {
      case ATOMIC_TWICE_FLUCTUATING_KINETIC_ENERGY:
        return atomic_twice_fluctuating_kinetic_energy();
      case ATOMIC_TWICE_KINETIC_ENERGY:
        return atomic_twice_kinetic_energy();
      case ATOMIC_FLUCTUATING_VELOCITY:
        return atomic_fluctuating_velocity();
      case ATOMIC_CHARGE_VELOCITY:
        return atomic_charge_velocity();
      case ATOMIC_SPECIES_VELOCITY:
        return atomic_species_velocity();
      case PROLONGED_VELOCITY:
        return prolonged_field(VELOCITY);
      default:
        throw ATC_Error("FieldManager:: unknown PAQ"); return nullptr;
      }
    }
    /** this function returns a restriction of atomic data */
    DENS_MAN * restricted_atom_quantity(FieldName field, std::string name = "default", PAQ * atomi = nullptr);
  protected:
    ATC_Method * atc_;
    InterscaleManager & interscaleManager_;
    // nodal atomic fields
    DENS_MAN * charge_density(std::string name);
    DENS_MAN * mass_density(std::string name);
    DENS_MAN * species_concentration(std::string name);
    DENS_MAN * number_density(std::string name);
    DENS_MAN * momentum(std::string name);
    DENS_MAN * velocity(std::string name);
    DENS_MAN * projected_velocity(std::string name);
    DENS_MAN * displacement(std::string name);
    DENS_MAN * reference_potential_energy(std::string name);
    DENS_MAN * potential_energy(std::string name);
    DENS_MAN * thermal_energy(std::string name);
    DENS_MAN * kinetic_energy(std::string name);
    DENS_MAN * temperature(std::string name);
    DENS_MAN * kinetic_temperature(std::string name);
    DENS_MAN * charge_flux(std::string name);
    DENS_MAN * species_flux(std::string name);
    DENS_MAN * internal_energy(std::string name);
    DENS_MAN * energy(std::string name);

    // non intrinsic per atom quantities (intrinsic are handled elsewhere)
    PAQ * atomic_twice_kinetic_energy();
    PAQ * atomic_twice_fluctuating_kinetic_energy();
    PAQ * atomic_fluctuating_velocity();
    PAQ * atomic_charge_velocity();
    PAQ * atomic_species_velocity();
    PAQ * atomic_species_vector();

    // internal functions
    DENS_MAN * projected_atom_quantity(FieldName field,std::string name, PAQ * atomic,  DIAG_MAN * normalization = nullptr);
    DENS_MAN * scaled_projected_atom_quantity(FieldName field,std::string name, PAQ * atomic, double scale, DIAG_MAN * normalization = nullptr);
    DENS_MAN * referenced_projected_atom_quantity(FieldName field, std::string name, PAQ * atomic, DENS_MAN * reference, DIAG_MAN * normalization = nullptr);
    DENS_MAN * inferred_atom_quantity(FieldName /* field */, std::string /* name */, PAQ * /* atomic */){return nullptr;};
    PAQ * prolonged_field(FieldName field);
  private:
    FieldManager(void);
  };
}
#endif