Browse Source

Removed action tsca, Adapter support added to action tsc

master
Michael Uleysky 4 weeks ago
parent
commit
bc2a7c83be
  1. 96
      actions/actiontsc.h
  2. 120
      actions/actiontscalt.h
  3. 110
      include/traits.h

96
actions/actiontsc.h

@ -7,9 +7,101 @@
using michlib::BFileW;
ADD_ACTION(TSC, tsc, ReadPSupported<Source> || ReadSupported<Source>);
ADD_ACTION(TSC, tsc, AdapterSupported<Source> || ReadPSupported<Source> || ReadSupported<Source>);
template<class D> MString ActionTSC::DoAction(const CLArgs& args, D& ds)
template<class D> MString ActionTSC_DoAction(const CLArgs& args, D& data);
template<class D> MString ActionTSC::DoAction(const CLArgs& args, D& data) { return ActionTSC_DoAction(args, data); }
template<class D>
requires AdapterSupported<D>
MString ActionTSC_DoAction(const CLArgs& args, D& ds)
{
michlib_internal::ParameterListEx pars;
pars.UsePrefix("");
pars.SetParameter("source", args.at("source"));
pars.SetParameter("history", args.at("_cmdline"));
Adapter ad;
{
auto ret = ds.GetAdapter(args, pars);
if(!ret) return "Error opening source";
ad = std::move(ret.Value());
}
MString name = args.contains("out") ? args.at("out") : "out.nc";
int compress = args.contains("compress") ? args.at("compress").ToInt() : 3;
bool obfuscate = args.contains("obfuscate");
MString varstring;
if(args.contains("var"))
varstring = args.at("var");
else
{
if(args.contains("vars"))
varstring = args.at("vars");
else
{
if constexpr(HasDefVars<D>)
varstring = ds.DefaultVars();
else
return "Variables not specified";
}
}
std::set<MString> vars;
{
auto vlist = michlib::Split_on_words(varstring, " ,", false);
for(const auto& vname: vlist)
{
if(vars.contains(vname)) return "Duplicate variable " + vname + " in list " + varstring;
if(!ad.Vars().contains(vname)) return "Variable " + vname + " does'nt supported by this dataset";
vars.insert(vname);
}
}
// Delete unused variables
ad.CleanVariables(vars);
pars.SetParameter("variables", varstring);
NCFileW ncfw;
{
decltype(pars) emptypars;
const auto& upars = obfuscate ? emptypars : pars;
auto ret = ncfw.Create(name, ad, upars, compress);
if(!ret) return "Can't create file " + name;
}
const auto& ind = ad.TimeIndexes();
for(size_t it = 0; it < ind.size(); it++)
{
michlib::message(ad.Times()[ind[it]].ToTString());
for(const auto& v: ad.Vars())
if(ad.Is2D(v.first))
{
auto data = ad.Read2D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
else
{
auto data = ad.Read3D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
}
return "";
}
template<class D>
requires(!AdapterSupported<D> && (ReadPSupported<D> || ReadSupported<D>))
MString ActionTSC_DoAction(const CLArgs& args, D& ds)
{
auto [reg, regerr] = GetRegion<D>(args);
if(regerr.Exist()) return regerr;

120
actions/actiontscalt.h

@ -1,120 +0,0 @@
#pragma once
#include "Adapter.h"
#include "BFileW.h"
#include "actiondep.h"
#include "ncfilew.h"
#include "ncfuncs.h"
#include <memory>
using michlib::BFileW;
template<class T>
concept AdapterSupported = requires(T t, const CLArgs& args, michlib_internal::ParameterListEx& pars) {
{ t.GetAdapter(args, pars) } -> std::convertible_to<RetVal<Adapter>>;
};
ADD_ACTION(TSCA, tsca, AdapterSupported<Source>);
template<class D> MString ActionTSCA::DoAction(const CLArgs& args, D& ds)
{
michlib_internal::ParameterListEx pars;
pars.UsePrefix("");
pars.SetParameter("source", args.at("source"));
pars.SetParameter("history", args.at("_cmdline"));
Adapter ad;
{
auto ret = ds.GetAdapter(args, pars);
if(!ret) return "Error opening source";
ad = std::move(ret.Value());
}
MString name = args.contains("out") ? args.at("out") : "out.nc";
int compress = args.contains("compress") ? args.at("compress").ToInt() : 3;
MString varstring;
if(args.contains("var"))
varstring = args.at("var");
else
{
if(args.contains("vars"))
varstring = args.at("vars");
else
{
if constexpr(HasDefVars<D>)
varstring = ds.DefaultVars();
else
return "Variables not specified";
}
}
std::set<MString> vars;
{
auto vlist = michlib::Split_on_words(varstring, " ,", false);
for(const auto& vname: vlist)
{
if(vars.contains(vname)) return "Duplicate variable " + vname + " in list " + varstring;
if(!ad.Vars().contains(vname)) return "Variable " + vname + " does'nt supported by this dataset";
vars.insert(vname);
}
}
// Delete unused variables
ad.CleanVariables(vars);
pars.SetParameter("variables", varstring);
NCFileW ncfw;
{
auto ret = ncfw.Create(name, ad, pars, compress);
if(!ret) return "Can't create file " + name;
}
/*
michlib::message(ad.Title());
michlib::message("2D variables");
for(const auto& v: ad.Vars())
{
if(!ad.Is2D(v.first)) continue;
michlib::message(v.first, " --- ", v.second.info.lname);
michlib::message(" Internal name: ", v.second.info.name);
michlib::message(" Standard name: ", v.second.info.stname);
michlib::message(" Units: internal - ", v.second.info.unit, ", target - ", v.second.info.targetunit);
}
michlib::message("3D variables");
for(const auto& v: ad.Vars())
{
if(!ad.Is3D(v.first)) continue;
michlib::message(v.first, " --- ", v.second.info.lname);
michlib::message(" Internal name: ", v.second.info.name);
michlib::message(" Standard name: ", v.second.info.stname);
michlib::message(" Units: internal - ", v.second.info.unit, ", target - ", v.second.info.targetunit);
}
*/
const auto& ind = ad.TimeIndexes();
for(size_t it = 0; it < ind.size(); it++)
{
michlib::message(ad.Times()[ind[it]].ToTString());
for(const auto& v: ad.Vars())
if(ad.Is2D(v.first))
{
auto data = ad.Read2D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
else
{
auto data = ad.Read3D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
}
return "";
}

110
include/traits.h

@ -1,4 +1,5 @@
#pragma once
#include "Adapter.h"
#include "ParseArgs.h"
#include <concepts>
@ -6,32 +7,29 @@ class BaseParameters;
using michlib::real;
template<class T>
concept AdapterSupported = requires(T t, const CLArgs& args, michlib_internal::ParameterListEx& pars) {
{ t.GetAdapter(args, pars) } -> std::convertible_to<RetVal<Adapter>>;
};
template<class T>
concept InfoSupported = requires(T t) {
{
t.Info()
} -> std::convertible_to<MString>;
{ t.Info() } -> std::convertible_to<MString>;
};
template<class T>
concept HasDefVars = requires(T t) {
{
t.DefaultVars()
} -> std::convertible_to<MString>;
{ t.DefaultVars() } -> std::convertible_to<MString>;
};
template<class T>
concept ParametersRequiredRegion = requires(T t, michlib_internal::ParameterListEx& pars, const CLArgs& args, const struct Region& r) {
{
t.Parameters(pars, args, r).first
} -> std::convertible_to<const BaseParameters*>;
{ t.Parameters(pars, args, r).first } -> std::convertible_to<const BaseParameters*>;
};
template<class T>
concept ParametersNotRequiredRegion = requires(T t, michlib_internal::ParameterListEx& pars, const CLArgs& args) {
{
t.Parameters(pars, args).first
} -> std::convertible_to<const BaseParameters*>;
{ t.Parameters(pars, args).first } -> std::convertible_to<const BaseParameters*>;
};
template<class T>
@ -39,40 +37,26 @@ concept ParametersSupported = ParametersRequiredRegion<T> || ParametersNotRequir
template<class T>
concept ReadPSupported = requires(T t, const MString& vname, std::map<MString, typename T::Data>& cache, const BaseParameters* ip, size_t i) {
{
t.Read(vname, cache, ip, i)
} -> std::same_as<bool>;
{ t.Read(vname, cache, ip, i) } -> std::same_as<bool>;
};
template<class T>
concept ReadSupported = requires(T t, const MString& vname, std::map<MString, typename T::Data>& cache, size_t i) {
{
t.Read(vname, cache, i)
} -> std::same_as<bool>;
{ t.Read(vname, cache, i) } -> std::same_as<bool>;
};
template<class T>
concept IsUVData = requires(T t) {
{
t.U(0)
} -> std::convertible_to<real>;
{
t.V(0)
} -> std::convertible_to<real>;
{
t.U2(0)
} -> std::convertible_to<real>;
{ t.U(0) } -> std::convertible_to<real>;
{ t.V(0) } -> std::convertible_to<real>;
{ t.U2(0) } -> std::convertible_to<real>;
};
namespace internal
{
template<class T>
concept HaveXYStep = requires(T t) {
{
t.XStep()
} -> std::convertible_to<real>;
{
t.YStep()
} -> std::convertible_to<real>;
{ t.XStep() } -> std::convertible_to<real>;
{ t.YStep() } -> std::convertible_to<real>;
};
template<typename...> using void_ = void;
@ -91,9 +75,7 @@ template<class D> struct GetReadType_<D, false>
template<class T>
concept HaveDisable = requires(T t) {
{
T::disabledactions
} -> std::convertible_to<const char*>;
{ T::disabledactions } -> std::convertible_to<const char*>;
};
consteval bool cmpspace(const char* s1, const char* s2)
@ -130,70 +112,42 @@ template<class D> using ReadType = internal::GetReadType_<D, ReadPSupported<D> |
template<class T>
concept ReadIsGrid = requires {
{
std::declval<ReadType<T>>().XStep()
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().YStep()
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().XStep() } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().YStep() } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs2DGeoRectArray = requires {
{
std::declval<ReadType<T>>().Ix2Lon(0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Iy2Lat(0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Ix2Lon(0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Iy2Lat(0) } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs2DGeoArray = requires {
{
std::declval<ReadType<T>>().Lon(0, 0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Lat(0, 0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Lon(0, 0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Lat(0, 0) } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs1DGeoArray = requires {
{
std::declval<ReadType<T>>().Lon(0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Lat(0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Lon(0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Lat(0) } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs2DXYRectArray = requires {
{
std::declval<ReadType<T>>().Ix2X(0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Iy2Y(0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Ix2X(0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Iy2Y(0) } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs2DXYArray = requires {
{
std::declval<ReadType<T>>().X(0, 0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Y(0, 0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().X(0, 0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Y(0, 0) } -> std::convertible_to<real>;
};
template<class T>
concept ReadIs1DArray = requires {
{
std::declval<ReadType<T>>().X(0)
} -> std::convertible_to<real>;
{
std::declval<ReadType<T>>().Y(0)
} -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().X(0) } -> std::convertible_to<real>;
{ std::declval<ReadType<T>>().Y(0) } -> std::convertible_to<real>;
};

Loading…
Cancel
Save