#ifndef __COSMOTOOL_FIELD #define __COSMOTOOL_FIELD #include "config.hpp" #include #include namespace CosmoTool { template struct ScalarField { BaseType value; }; template struct VectorField { BaseType vec[N]; VectorField& operator=(const VectorField& a) { for (int i = 0; i < N; i++) vec[i] = a.vec[i]; return *this; } VectorField() { for (int i = 0; i < N; i++) vec[i] = 0; } VectorField(double a) { assert(a == 0); for (int i = 0; i < N; i++) vec[i] = 0; } }; template VectorField operator*(BaseType s, const VectorField& a) { VectorField v; for (int i = 0; i < N; i++) v.vec[i] = a.vec[i]*s; return v; } template VectorField operator+(const VectorField& a, const VectorField& b) { VectorField v; for (int i = 0; i < N; i++) v.vec[i] = a.vec[i]+b.vec[i]; return v; } template VectorField& operator+=(VectorField& a, const VectorField& b) { for (int i = 0; i < N; i++) a.vec[i]+=b.vec[i]; return a; } }; template std::ostream& operator<<(std::ostream& s, const CosmoTool::VectorField& a) { for (int i = 0; i < N; i++) s << a.vec[i] << " " ; return s; } #endif